backend

package
v0.0.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 17, 2026 License: MIT Imports: 7 Imported by: 0

README

Backend 模块

概述

Backend 模块负责管理各代理服务的后端实例配置。包括 MySQL、SSH、Redis、MongoDB 等多种后端的连接信息和连接池管理。

职责

  • ✅ 后端实例管理(CRUD)
  • ✅ 后端健康检查
  • ✅ 连接池配置管理
  • ✅ 负载均衡策略支持
  • ✅ 实例分组(同一服务的多个实例)

数据模型

backend_instances 表(通用表)
CREATE TABLE backend_instances (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    backend_id VARCHAR(64) NOT NULL UNIQUE COMMENT '实例ID',
    service_name VARCHAR(64) NOT NULL COMMENT '服务名 (rds, ssh, redis)',
    instance_name VARCHAR(255) NOT NULL COMMENT '实例名称',
    type VARCHAR(32) NOT NULL COMMENT '类型 (master, slave, replica, replica_set)',
    host VARCHAR(255) NOT NULL COMMENT '主机地址',
    port INT NOT NULL COMMENT '端口号',
    enabled BOOLEAN DEFAULT TRUE COMMENT '是否启用',
    weight INT DEFAULT 1 COMMENT '负载均衡权重',
    max_pool_size INT DEFAULT 20 COMMENT '连接池大小',
    health_check_interval INT DEFAULT 30 COMMENT '健康检查间隔(秒)',
    healthy BOOLEAN DEFAULT TRUE COMMENT '当前是否健康',
    description VARCHAR(255) COMMENT '实例描述',
    metadata JSON COMMENT '扩展元数据(服务特定配置)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_service_name (service_name),
    INDEX idx_backend_id (backend_id),
    INDEX idx_enabled (enabled),
    INDEX idx_type (type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代理后端实例表';
实例类型说明
服务 类型 说明
RDS master MySQL 主库
RDS slave MySQL 从库
SSH jumphost 跳板机
SSH target 目标主机
Redis master Redis 主节点
Redis replica Redis 副本节点
MongoDB primary MongoDB 主节点
MongoDB secondary MongoDB 从节点

接口设计

核心接口
type Service interface {
    // 查询
    GetBackend(context.Context, *GetBackendRequest) (*Backend, error)
    SearchBackend(context.Context, *SearchBackendRequest) (*types.Set[*Backend], error)
    
    // 管理
    CreateBackend(context.Context, *CreateBackendRequest) (*Backend, error)
    UpdateBackend(context.Context, *UpdateBackendRequest) (*Backend, error)
    DeleteBackend(context.Context, *DeleteBackendRequest) error
    
    // 健康检查
    HealthCheck(context.Context, *HealthCheckRequest) (*HealthCheckResult, error)
    GetHealthStatus(context.Context, *GetHealthStatusRequest) (*HealthStatus, error)
    
    // 连接池
    GetPoolStats(context.Context, *GetPoolStatsRequest) (*PoolStats, error)
}
Backend 模型
type Backend struct {
    Id              int64             `json:"id"`
    BackendId       string            `json:"backend_id"`
    ServiceName     string            `json:"service_name"`
    InstanceName    string            `json:"instance_name"`
    Type            string            `json:"type"`
    Host            string            `json:"host"`
    Port            int               `json:"port"`
    Enabled         bool              `json:"enabled"`
    Weight          int               `json:"weight"`
    MaxPoolSize     int               `json:"max_pool_size"`
    HealthCheckInterval int           `json:"health_check_interval"`
    Healthy         bool              `json:"healthy"`
    Description     string            `json:"description"`
    Metadata        map[string]interface{} `json:"metadata"`
    CreatedAt       time.Time         `json:"created_at"`
    UpdatedAt       time.Time         `json:"updated_at"`
}

使用场景

场景 1: 注册 MySQL 主从实例
req := &CreateBackendRequest{
    ServiceName:    "rds",
    InstanceName:   "business_db_master",
    BackendId:      "mysql-biz-master",
    Type:          "master",
    Host:          "10.0.0.1",
    Port:          3306,
    MaxPoolSize:   20,
    Weight:        1,
}

backend, _ := backendService.CreateBackend(ctx, req)
场景 2: 健康检查
result, _ := backendService.HealthCheck(ctx, &HealthCheckRequest{
    BackendId: "mysql-biz-master",
})

if !result.Healthy {
    // 自动切换到从库
}
场景 3: 查询连接池统计
stats, _ := backendService.GetPoolStats(ctx, &GetPoolStatsRequest{
    BackendId: "mysql-biz-master",
})

fmt.Printf("活跃连接: %d, 空闲连接: %d\n", stats.ActiveConn, stats.IdleConn)

API 端点

# 实例管理
GET    /api/mproxy/backends              # 列表
GET    /api/mproxy/backends/:backend_id  # 详情
POST   /api/mproxy/backends              # 创建
PUT    /api/mproxy/backends/:backend_id  # 更新
DELETE /api/mproxy/backends/:backend_id  # 删除

# 健康检查
POST   /api/mproxy/backends/:backend_id/health-check
GET    /api/mproxy/backends/:backend_id/health-status

# 连接池
GET    /api/mproxy/backends/:backend_id/pool-stats

文件结构

backend/
├── README.md           # 本文档
├── interface.go        # 接口定义
├── impl/
│   ├── impl.go        # 实现
│   └── healthcheck.go # 健康检查逻辑
├── model.go           # 数据模型
└── api.go             # HTTP API

后续增强

  • 自动故障转移
  • 连接池动态调整
  • 实例分组管理
  • 性能指标收集

Documentation

Index

Constants

View Source
const (
	APP_NAME = "proxy_backend"
)

Variables

This section is empty.

Functions

func NewBackendSet

func NewBackendSet() *types.Set[*Backend]

Types

type Backend

type Backend struct {
	// 主键,自增
	Id int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
	// 创建时间
	CreateAt time.Time `json:"create_at" gorm:"column:create_at"`
	// 更新时间
	UpdateAt *time.Time `json:"update_at" gorm:"column:update_at"`
	// 更新人
	UpdateBy string `json:"update_by" gorm:"column:update_by;type:varchar(60)"`

	// 后端定义
	CreateBackendRequest
	// 健康状态
	Healthy bool `json:"healthy" gorm:"column:healthy"`
}

Backend 代理后端实例

func NewBackend

func NewBackend(req *CreateBackendRequest) *Backend

func (*Backend) String

func (b *Backend) String() string

func (*Backend) TableName

func (b *Backend) TableName() string

type BackendResponse

type BackendResponse struct {
	Data *Backend `json:"data"`
}

BackendResponse API响应格式

type BackendSetResponse

type BackendSetResponse struct {
	Data *types.Set[*Backend] `json:"data"`
}

BackendSetResponse 列表响应

type CreateBackendRequest

type CreateBackendRequest struct {
	// 后端ID(唯一标识)
	BackendId string `json:"backend_id" validate:"required"`
	// 服务名称(rds/ssh/redis等)
	ServiceName string `json:"service_name" validate:"required"`
	// 实例名称
	InstanceName string `json:"instance_name" validate:"required"`
	// 类型(mysql/postgresql/ssh等)
	Type string `json:"type" validate:"required"`
	// 主机地址
	Host string `json:"host" validate:"required"`
	// 端口
	Port int `json:"port" validate:"required"`
	// 是否启用
	Enabled bool `json:"enabled"`
	// 权重(用于负载均衡)
	Weight int `json:"weight"`
	// 最大连接池大小
	MaxPoolSize int `json:"max_pool_size"`
	// 健康检查间隔(秒)
	HealthCheckInterval int `json:"health_check_interval"`
	// 描述
	Description string `json:"description"`
	// 元数据(扩展字段)
	Metadata map[string]interface{} `json:"metadata"`
}

func NewCreateBackendRequest

func NewCreateBackendRequest() *CreateBackendRequest

func (*CreateBackendRequest) SetBackendId

func (r *CreateBackendRequest) SetBackendId(backendId string) *CreateBackendRequest

func (*CreateBackendRequest) SetDescription

func (r *CreateBackendRequest) SetDescription(description string) *CreateBackendRequest

func (*CreateBackendRequest) SetEnabled

func (r *CreateBackendRequest) SetEnabled(enabled bool) *CreateBackendRequest

func (*CreateBackendRequest) SetHealthCheckInterval

func (r *CreateBackendRequest) SetHealthCheckInterval(interval int) *CreateBackendRequest

func (*CreateBackendRequest) SetHost

func (*CreateBackendRequest) SetInstanceName

func (r *CreateBackendRequest) SetInstanceName(instanceName string) *CreateBackendRequest

func (*CreateBackendRequest) SetMaxPoolSize

func (r *CreateBackendRequest) SetMaxPoolSize(size int) *CreateBackendRequest

func (*CreateBackendRequest) SetMetadata

func (r *CreateBackendRequest) SetMetadata(key string, value interface{}) *CreateBackendRequest

func (*CreateBackendRequest) SetPort

func (r *CreateBackendRequest) SetPort(port int) *CreateBackendRequest

func (*CreateBackendRequest) SetServiceName

func (r *CreateBackendRequest) SetServiceName(serviceName string) *CreateBackendRequest

func (*CreateBackendRequest) SetType

func (*CreateBackendRequest) SetWeight

func (r *CreateBackendRequest) SetWeight(weight int) *CreateBackendRequest

func (*CreateBackendRequest) Validate

func (r *CreateBackendRequest) Validate() error

type DeleteBackendRequest

type DeleteBackendRequest struct {
	DescribeBackendRequest
}

func NewDeleteBackendRequest

func NewDeleteBackendRequest(backendId string) *DeleteBackendRequest

type DescribeBackendRequest

type DescribeBackendRequest struct {
	BackendId string `json:"backend_id"`
}

func NewDescribeBackendRequest

func NewDescribeBackendRequest(backendId string) *DescribeBackendRequest

type GetPoolStatsRequest

type GetPoolStatsRequest struct {
	BackendId string `json:"backend_id" validate:"required"`
}

func (*GetPoolStatsRequest) Validate

func (r *GetPoolStatsRequest) Validate() error

type HealthCheckRequest

type HealthCheckRequest struct {
	BackendId string `json:"backend_id" validate:"required"`
}

func (*HealthCheckRequest) Validate

func (r *HealthCheckRequest) Validate() error

type HealthCheckResponse

type HealthCheckResponse struct {
	Data *HealthCheckResult `json:"data"`
}

HealthCheckResponse 健康检查响应

type HealthCheckResult

type HealthCheckResult struct {
	BackendId   string    `json:"backend_id"`
	Healthy     bool      `json:"healthy"`
	CheckedAt   time.Time `json:"checked_at"`
	Latency     int64     `json:"latency_ms"`
	ErrorMsg    string    `json:"error_msg,omitempty"`
	ServiceName string    `json:"service_name"`
	Type        string    `json:"type"`
}

type PoolStats

type PoolStats struct {
	BackendId      string `json:"backend_id"`
	TotalConns     int    `json:"total_conns"`
	ActiveConns    int    `json:"active_conns"`
	IdleConns      int    `json:"idle_conns"`
	WaitingConns   int    `json:"waiting_conns"`
	MaxPoolSize    int    `json:"max_pool_size"`
	ConnectTimeout int    `json:"connect_timeout_ms"`
}

type PoolStatsResponse

type PoolStatsResponse struct {
	Data *PoolStats `json:"data"`
}

PoolStatsResponse 连接池统计响应

type QueryBackendRequest

type QueryBackendRequest struct {
	*request.PageRequest
	// 服务名称过滤
	ServiceName string `json:"service_name"`
	// 类型过滤
	Type string `json:"type"`
	// 是否启用过滤
	Enabled *bool `json:"enabled"`
	// 健康状态过滤
	Healthy *bool `json:"healthy"`
}

func NewQueryBackendRequest

func NewQueryBackendRequest() *QueryBackendRequest

type Service

type Service interface {
	// 创建后端实例
	CreateBackend(context.Context, *CreateBackendRequest) (*Backend, error)
	// 查询后端实例
	QueryBackend(context.Context, *QueryBackendRequest) (*types.Set[*Backend], error)
	// 获取后端实例详情
	DescribeBackend(context.Context, *DescribeBackendRequest) (*Backend, error)
	// 更新后端实例
	UpdateBackend(context.Context, *UpdateBackendRequest) (*Backend, error)
	// 删除后端实例
	DeleteBackend(context.Context, *DeleteBackendRequest) (*Backend, error)
	// 健康检查
	HealthCheck(context.Context, *HealthCheckRequest) (*HealthCheckResult, error)
	// 获取连接池统计
	GetPoolStats(context.Context, *GetPoolStatsRequest) (*PoolStats, error)
}

func GetService

func GetService() Service

type UpdateBackendRequest

type UpdateBackendRequest struct {
	BackendId           string                 `json:"backend_id" validate:"required"`
	Enabled             *bool                  `json:"enabled"`
	Weight              *int                   `json:"weight"`
	MaxPoolSize         *int                   `json:"max_pool_size"`
	HealthCheckInterval *int                   `json:"health_check_interval"`
	Description         string                 `json:"description"`
	Metadata            map[string]interface{} `json:"metadata"`
	UpdateBy            string                 `json:"update_by"`
}

func (*UpdateBackendRequest) Validate

func (r *UpdateBackendRequest) Validate() error

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL