Documentation
¶
Overview ¶
Package tunnel 提供服务代理网关功能
概述 ¶
tunnel 包实现了一个基于反向连接的服务代理网关系统(类似 ngrok/frp)。 服务节点上的 Agent **主动连接**到 Gateway,注册自己的服务端点, 然后 Gateway 对外暴露这些服务的 HTTP API、gRPC 和 debug 调试接口。
核心特点:
- 反向连接:服务主动连接网关,网关被动接受连接
- 内网穿透:服务可以在内网/防火墙后,只要能出站连接 Gateway
- 服务聚合:多个服务通过同一个 Gateway 对外暴露
- 远程调试:通过 Gateway 访问服务的 debug 接口进行远程监控
目录结构 ¶
core/tunnel/ ├── doc.go - 包文档 ├── types.go - 核心类型和接口定义 ├── config.go - 配置结构定义 ├── config.yaml - 配置示例文件 ├── errors.go - 错误定义 ├── transport.go - 传输层注册表和工厂 ├── tunnelagent/ - Agent 实现包 │ ├── agent.go - Agent 封装和 Builder │ ├── impl.go - Agent 实现 │ └── doc.go - 包文档 ├── tunnelgateway/ - Gateway 实现包 │ ├── gateway.go - Gateway 封装和 Builder │ ├── impl.go - Gateway 实现 │ └── doc.go - 包文档 └── yamux/ - yamux 传输协议实现 └── quic/ - QUIC 传输协议实现 └── kcp/ - KCP 传输协议实现
架构设计 ¶
与传统网关(如 Nginx)不同,本系统采用反向连接架构:
传统架构:客户端 -> 网关 -> 后端服务(网关主动连接后端)
本系统: 后端服务(Agent) -> 网关(Gateway)(服务主动连接网关)
外部请求 │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Gateway (公网/DMZ) │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ HTTP :8080 │ │ gRPC :9090 │ │ Debug :6060 │ <- 对外端口 │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ ┌──────┴───────────────┴───────────────┴──────┐ │ │ │ Service Router (按服务名路由) │ │ │ └──────────────────────┬──────────────────────┘ │ │ │ │ │ ┌──────────────────────┴──────────────────────┐ │ │ │ Session Manager (管理连接) │ │ │ │ service-a ──> Session1 │ │ │ │ service-b ──> Session2 │ │ │ └──────────────────────────────────────────────┘ │ │ │ │ │ Listener :7000 <- 接受 Agent 连接 (被动) │ └─────────────────────────────────────────────────────────────────┘ ▲ ┌──────────────┼──────────────┐ │ │ │ ┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐ │ Tunnel │ │ Tunnel │ │ Tunnel │ <- 主动出站连接 │ Session 1 │ │ Session 2 │ │ Session 3 │ (yamux 多路复用) └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │ │ │ ┌───────────┴──┐ ┌────────┴───┐ ┌───────┴────┐ │ Service A │ │ Service B │ │ Service C │ <- 内网服务节点 │ (内网) │ │ (内网) │ │ (内网) │ │ │ │ │ │ │ │ ┌──────────┐ │ │ ┌────────┐ │ │ ┌────────┐ │ │ │Agent │─┼──┼─│Agent │─┼──┼─│Agent │ │ <- 主动连接 Gateway │ └────┬─────┘ │ │ └───┬────┘ │ │ └───┬────┘ │ │ │ │ │ │ │ │ │ │ │ ┌────┴─────┐ │ │ ┌───┴────┐ │ │ ┌───┴────┐ │ │ │本地服务 │ │ │ │本地服务│ │ │ │本地服务│ │ │ │HTTP/gRPC │ │ │ │HTTP │ │ │ │Debug │ │ │ │Debug │ │ │ └────────┘ │ │ └────────┘ │ │ └──────────┘ │ └────────────┘ └────────────┘ └──────────────┘
工作流程 ¶
- Gateway 启动,监听 :7000 等待 Agent 连接
- Agent 启动,主动连接到 Gateway:7000 (TCP + yamux)
- Agent 发送 Register 消息,注册自己的服务信息和端点
- Agent 定期发送 Heartbeat 保持连接
- 外部请求到达 Gateway:8080
- Gateway 根据服务名找到对应的 Agent Session
- Gateway 通过 yamux stream 将请求转发给 Agent
- Agent 将请求转发到本地服务 (localhost:8080)
- 响应原路返回:本地服务 -> Agent -> Gateway -> 外部客户端
## 接口定义 (types.go)
Transport - 传输层接口,负责建立连接 ├── Name() string - 协议名称 ├── Dial(ctx, addr) (Session, error) - 客户端连接 └── Listen(ctx, addr) (Listener, error) - 服务端监听 Session - 会话接口,支持多路复用 ├── Open(ctx) (Stream, error) - 打开新流 ├── Accept() (Stream, error) - 接受新流 ├── Close() error - 关闭会话 ├── IsClosed() bool - 是否已关闭 ├── NumStreams() int - 活跃流数量 ├── LocalAddr() net.Addr - 本地地址 └── RemoteAddr() net.Addr - 远程地址 Stream - 流接口,单个请求/响应通道 ├── io.ReadWriteCloser - 读写关闭 ├── LocalAddr() / RemoteAddr() - 地址信息 └── SetDeadline() / SetReadDeadline() / SetWriteDeadline() Listener - 监听器接口 ├── Accept() (Session, error) - 接受新会话 ├── Close() error - 关闭监听 └── Addr() net.Addr - 监听地址 Agent - 代理客户端接口 ├── Start(ctx) error - 启动 ├── Stop(ctx) error - 停止 ├── Register(ctx, *ServiceInfo) error - 注册服务 ├── Deregister(ctx, serviceName) error - 注销服务 └── Status() AgentStatus - 获取状态 Gateway - 代理网关接口 ├── Start(ctx) error - 启动 ├── Stop(ctx) error - 停止 ├── Services() []*ServiceInfo - 获取所有服务 ├── GetService(name) (*ServiceInfo, error) - 获取指定服务 ├── Status() GatewayStatus - 获取状态 └── Forward(ctx, name, type, conn) error - 转发请求
## 数据结构
ServiceInfo - 服务信息 ├── ID string - 服务唯一标识 ├── Name string - 服务名称 ├── Version string - 服务版本 ├── Metadata map[string]string - 元数据 ├── Endpoints []Endpoint - 端点列表 ├── RegisterTime time.Time - 注册时间 ├── LastHeartbeat time.Time - 最后心跳 └── Status ServiceStatus - 服务状态 Endpoint - 服务端点 ├── Type EndpointType - 类型: http/grpc/debug ├── Path string - 路径 ├── Port int - 端口 ├── Address string - 完整地址 └── Metadata map[string]string - 端点元数据 Message - 通信消息 ├── Type MessageType - 消息类型 ├── ID string - 消息ID ├── Service *ServiceInfo - 服务信息 ├── Payload []byte - 负载数据 └── Error string - 错误信息
## 状态枚举
AgentStatus:
- StatusDisconnected (0) - 未连接
- StatusConnecting (1) - 连接中
- StatusConnected (2) - 已连接
- StatusReconnecting (3) - 重连中
GatewayStatus:
- GatewayStatusStopped (0) - 已停止
- GatewayStatusStarting (1) - 启动中
- GatewayStatusRunning (2) - 运行中
- GatewayStatusStopping (3) - 停止中
ServiceStatus:
- ServiceStatusOnline - 在线
- ServiceStatusOffline - 离线
- ServiceStatusUnhealthy - 不健康
EndpointType:
- EndpointTypeHTTP ("http") - HTTP 端点
- EndpointTypeGRPC ("grpc") - gRPC 端点
- EndpointTypeDebug ("debug") - Debug 端点
MessageType:
- MessageTypeRegister (1) - 服务注册
- MessageTypeDeregister (2) - 服务注销
- MessageTypeHeartbeat (3) - 心跳
- MessageTypeRequest (4) - 请求
- MessageTypeResponse (5) - 响应
- MessageTypeStream (6) - 流数据
- MessageTypeAck (7) - 确认
- MessageTypeError (8) - 错误
- MessageTypeHTTPRequest (9) - HTTP 请求转发
- MessageTypeGRPCRequest (10) - gRPC 请求转发
- MessageTypeDebugRequest (11) - Debug 请求转发
传输协议 ¶
支持的传输协议常量 (transport.go):
TransportYamux = "yamux" - 基于 TCP 的多路复用 (已实现) TransportQUIC = "quic" - 基于 UDP 的多路复用 (已实现) TransportKCP = "kcp" - 基于 UDP 的可靠传输 (已实现)
注册自定义传输协议:
tunnel.RegisterTransport("custom", func(opts *TransportOptions) (Transport, error) {
return &customTransport{opts: opts}, nil
})
配置说明 (config.go) ¶
## GatewayConfig - 网关配置
Enabled bool - 是否启用 ListenAddr string - 监听地址 (默认 :7000) Transport string - 传输协议 (默认 yamux) TransportOptions *TransportOptions - 传输层选项 HTTPPort int - HTTP 代理端口 (默认 8080) GRPCPort int - gRPC 代理端口 (默认 9090) DebugPort int - Debug 代理端口 (默认 6060) HeartbeatInterval int - 心跳间隔秒数 (默认 30) HeartbeatTimeout int - 心跳超时秒数 (默认 90) HealthCheckInterval int - 健康检查间隔 (默认 30) TLS TLSConfig - TLS 配置
## AgentConfig - 代理客户端配置
Enabled bool - 是否启用 GatewayAddr string - 网关地址 Transport string - 传输协议 (默认 yamux) TransportOptions *TransportOptions - 传输层选项 ServiceID string - 服务ID (可选) ServiceName string - 服务名称 ServiceVersion string - 服务版本 Metadata map[string]string - 元数据 Endpoints []EndpointConfig - 端点配置 HeartbeatInterval int - 心跳间隔秒数 (默认 30) ReconnectInterval int - 重连间隔秒数 (默认 5) MaxReconnectAttempts int - 最大重连次数 (0=无限) TLS TLSConfig - TLS 配置
## TransportOptions - 传输层选项
EnableTLS bool - 启用 TLS CertFile string - 证书文件 KeyFile string - 私钥文件 CAFile string - CA 证书 Insecure bool - 跳过证书验证 MaxStreams int - 最大流数量 (默认 256) KeepAliveInterval int - 保活间隔秒数 (默认 30) ConnectionWriteTimeout int - 写超时秒数 (默认 10) StreamOpenTimeout int - 流打开超时 (默认 30)
使用示例 ¶
## 1. 部署 Gateway (公网服务器)
Gateway 部署在公网可访问的服务器上,被动等待 Agent 连接。
import (
"context"
"github.com/pubgo/lava/v2/core/tunnel/tunnelgateway"
_ "github.com/pubgo/lava/v2/core/tunnel/yamux" // 注册 yamux 传输
)
// 方式一:直接创建
gw := tunnelgateway.New(&tunnelgateway.Config{
ListenAddr: ":7000", // Agent 连接端口
Transport: "yamux",
HTTPPort: 8080, // 对外暴露的 HTTP 端口
GRPCPort: 9090, // 对外暴露的 gRPC 端口
DebugPort: 6060, // 对外暴露的 Debug 端口
})
// 方式二:使用 Builder 模式
gw, err := tunnelgateway.NewBuilder().
WithListenAddr(":7000").
WithTransport("yamux").
WithHTTPPort(8080).
WithDebugPort(6060).
Build()
if err != nil {
log.Fatal(err)
}
if err := gw.Start(ctx); err != nil {
log.Fatal(err)
}
defer gw.Stop(ctx)
// Gateway 现在等待 Agent 连接...
## 2. 部署 Agent (内网服务节点)
Agent 部署在服务所在的机器上(可以是内网),主动连接到 Gateway。
import (
"github.com/pubgo/lava/v2/core/tunnel"
"github.com/pubgo/lava/v2/core/tunnel/tunnelagent"
_ "github.com/pubgo/lava/v2/core/tunnel/yamux"
)
// 方式一:直接创建
agent := tunnelagent.New(&tunnelagent.Config{
GatewayAddr: "gateway.example.com:7000",
Transport: "yamux",
ServiceName: "my-service",
ServiceVersion: "1.0.0",
Endpoints: []tunnel.EndpointConfig{
{Type: "http", LocalAddr: "localhost:8080"},
{Type: "debug", LocalAddr: "localhost:6060"},
},
})
// 方式二:使用 Builder 模式
agent, err := tunnelagent.NewBuilder().
WithGatewayAddr("gateway.example.com:7000").
WithServiceName("my-service").
WithServiceVersion("1.0.0").
AddEndpoint("http", "localhost:8080", "/api").
AddEndpoint("debug", "localhost:6060", "/debug").
WithReconnectInterval(5).
Build()
if err != nil {
log.Fatal(err)
}
// 启动 Agent,会自动:
// 1. 连接到 Gateway
// 2. 注册服务
// 3. 保持心跳
// 4. 断线自动重连
if err := agent.Start(ctx); err != nil {
log.Fatal(err)
}
defer agent.Stop(ctx)
// 之后外部可以通过 Gateway 访问本地服务:
// http://gateway.example.com:8080/my-service/api -> localhost:8080
// gateway.example.com:9090 (gRPC) -> localhost:9090
// http://gateway.example.com:6060/my-service/debug -> localhost:6060
// 检查状态
if agent.Status() == tunnelagent.StatusConnected {
fmt.Println("已连接到 Gateway")
}
## 3. 集成调试接口
调试接口由 core/tunnel/tunneldebug 包提供:
import "github.com/pubgo/lava/v2/core/tunnel/tunneldebug" // 设置 Gateway 实例 tunneldebug.SetGateway(gw.Inner()) // 设置 Agent 实例 tunneldebug.SetAgent(agent.Inner())
## 4. TLS 配置
agent, _ := tunnelagent.NewBuilder().
WithGatewayAddr("gateway.example.com:7000").
WithTLS(tunnel.TLSConfig{
Enabled: true,
CertFile: "/path/to/client.crt",
KeyFile: "/path/to/client.key",
CAFile: "/path/to/ca.crt",
}).
Build()
通信协议 ¶
Agent 和 Gateway 之间使用长度前缀的 JSON 消息进行通信:
┌────────────┬─────────────────────────────┐
│ Length (4B)│ JSON Message │
│ uint32 BE │ { "type": 1, "service":... │
└────────────┴─────────────────────────────┘
消息流程:
Agent Gateway │ │ │──── [Register] ServiceInfo ────────────>│ 服务注册 │ │ │<─── [Ack] ─────────────────────────────│ 确认 │ │ │──── [Heartbeat] ───────────────────────>│ 心跳 │ │ │<─── [HTTPRequest] ServiceInfo ─────────│ 请求转发 │ │ │──── [Stream] Response Data ────────────>│ 响应数据 │ │ │──── [Deregister] ServiceName ──────────>│ 服务注销 │ │
调试接口 ¶
可用的调试端点:
GET /tunnel/ - 概览 HTML 页面 GET /tunnel/gateway - 网关状态 (JSON) GET /tunnel/gateway/services - 所有注册服务 (JSON) GET /tunnel/gateway/services/:name - 指定服务详情 (JSON) GET /tunnel/agent - 代理客户端状态 (JSON)
错误处理 (errors.go) ¶
ErrSessionClosed - 会话已关闭 ErrStreamClosed - 流已关闭 ErrConnectionFailed - 连接失败 ErrServiceNotFound - 服务未找到 ErrServiceAlreadyExists - 服务已存在 ErrInvalidMessage - 无效消息 ErrTimeout - 超时 ErrTransportNotSupported - 不支持的传输协议 ErrGatewayNotConnected - 未连接到网关 ErrAgentNotRunning - 代理客户端未运行 ErrAgentAlreadyRunning - 代理客户端已运行 ErrGatewayAlreadyRunning - 网关已运行
注意事项 ¶
必须导入传输协议实现包以注册协议: import _ "github.com/pubgo/lava/v2/core/tunnel/yamux"
Agent 会自动重连,但需要确保网关地址可达
服务端点的 Address 字段应为完整的 host:port 格式
心跳超时后服务会被标记为离线并从网关移除
支持同一 Agent 注册多个服务
Gateway 的 Forward 方法用于将外部请求转发到对应服务
Package tunnel 提供服务代理网关的核心功能 ¶
这个包实现了一个服务注册监控网关系统,允许服务通过反向代理的方式注册到代理网关, 然后通过代理网关暴露服务的 API、gRPC、debug 调试等接口。
主要功能:
- 服务注册:服务启动后自动注册到代理网关
- 多协议传输:支持 yamux、QUIC、KCP 等
- 服务暴露:通过代理网关暴露 HTTP API、gRPC 和 debug 调试接口
- 健康检查:自动监控服务健康状态
- 运维监控:提供统一的调试、监控入口
架构设计:
┌─────────────────────────────────────────────────────────────────┐
│ Proxy Gateway Server │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ HTTP API │ │ gRPC │ │ Debug │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ ┌──────┴───────────────┴───────────────┴──────┐ │
│ │ Service Router │ │
│ └──────────────────────┬──────────────────────┘ │
│ │ │
│ ┌──────────────────────┴──────────────────────┐ │
│ │ Transport Manager │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ yamux │ │ QUIC │ │ KCP │ ... │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
↑
┌─────┴─────┐
│ Tunnel │
└─────┬─────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Service Agent │
│ ┌──────────────────────┴──────────────────────┐ │
│ │ Transport Client │ │
│ └──────────────────────┬──────────────────────┘ │
│ ┌───────────────┼───────────────┐ │
│ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ │
│ │ HTTP API │ │ gRPC │ │ Debug │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Index ¶
- Constants
- Variables
- func ListTransports() []string
- func RegisterTransport(name string, factory TransportFactory)
- type Agent
- type AgentConfig
- type AgentInfo
- type AgentStatus
- type AgentStatusInfo
- type AuthProvider
- type Endpoint
- type EndpointConfig
- type EndpointType
- type Gateway
- type GatewayConfig
- type GatewayStatus
- type GatewayStatusInfo
- type Listener
- type Message
- type MessageType
- type RequestMeta
- type ServiceInfo
- type ServiceStatus
- type Session
- type Stream
- type TLSConfig
- type Transport
- type TransportFactory
- type TransportOptions
Constants ¶
const ( // TransportYamux yamux 传输协议 TransportYamux = "yamux" // TransportQUIC QUIC 传输协议 TransportQUIC = "quic" // TransportKCP KCP 传输协议 TransportKCP = "kcp" )
支持的传输协议常量
Variables ¶
var ( // ErrSessionClosed 会话已关闭 ErrSessionClosed = errors.New("tunnel: session closed") // ErrStreamClosed 流已关闭 ErrStreamClosed = errors.New("tunnel: stream closed") // ErrConnectionFailed 连接失败 ErrConnectionFailed = errors.New("tunnel: connection failed") // ErrServiceNotFound 服务未找到 ErrServiceNotFound = errors.New("tunnel: service not found") // ErrServiceAlreadyExists 服务已存在 ErrServiceAlreadyExists = errors.New("tunnel: service already exists") // ErrInvalidMessage 无效消息 ErrInvalidMessage = errors.New("tunnel: invalid message") // ErrTimeout 超时 ErrTimeout = errors.New("tunnel: timeout") // ErrTransportNotSupported 不支持的传输协议 ErrTransportNotSupported = errors.New("tunnel: transport not supported") // ErrGatewayNotConnected 未连接到网关 ErrGatewayNotConnected = errors.New("tunnel: gateway not connected") // ErrAgentNotRunning 代理客户端未运行 ErrAgentNotRunning = errors.New("tunnel: agent not running") // ErrAgentAlreadyRunning 代理客户端已在运行 ErrAgentAlreadyRunning = errors.New("tunnel: agent already running") // ErrGatewayAlreadyRunning 网关已在运行 ErrGatewayAlreadyRunning = errors.New("tunnel: gateway already running") )
Functions ¶
func RegisterTransport ¶
func RegisterTransport(name string, factory TransportFactory)
RegisterTransport 注册传输层工厂
Types ¶
type Agent ¶
type Agent interface {
// Start 启动代理客户端
Start(ctx context.Context) error
// Stop 停止代理客户端
Stop(ctx context.Context) error
// Register 注册服务
Register(ctx context.Context, service *ServiceInfo) error
// Deregister 注销服务
Deregister(ctx context.Context, serviceID string) error
// Status 获取代理客户端状态
Status() AgentStatus
// Info 获取 Agent 信息(用于调试显示)
Info() *AgentInfo
}
Agent 服务代理客户端接口 运行在服务节点上,负责将本地服务注册到代理网关
type AgentConfig ¶
type AgentConfig struct {
// GatewayAddr 网关地址
GatewayAddr string `yaml:"gateway_addr"`
// Transport 传输协议
Transport string `yaml:"transport"`
// TransportOptions 传输层选项
TransportOptions *TransportOptions `yaml:"transport_options"`
// ServiceID 服务ID,如果为空则自动生成
ServiceID string `yaml:"service_id"`
// ServiceName 服务名称
ServiceName string `yaml:"service_name"`
// ServiceVersion 服务版本
ServiceVersion string `yaml:"service_version"`
// Metadata 服务元数据
Metadata map[string]string `yaml:"metadata"`
// Endpoints 要暴露的端点
Endpoints []EndpointConfig `yaml:"endpoints"`
// HeartbeatInterval 心跳间隔(秒)
HeartbeatInterval int `yaml:"heartbeat_interval"`
// ReconnectInterval 重连间隔(秒)
ReconnectInterval int `yaml:"reconnect_interval"`
// MaxReconnectAttempts 最大重连次数,0 表示无限重试
MaxReconnectAttempts int `yaml:"max_reconnect_attempts"`
// TLS TLS 配置
TLS TLSConfig `yaml:"tls"`
}
AgentConfig 代理客户端配置
type AgentInfo ¶
type AgentInfo struct {
GatewayAddr string `json:"gateway_addr"`
ServiceName string `json:"service_name"`
ServiceVersion string `json:"service_version"`
Endpoints []Endpoint `json:"endpoints"`
Status string `json:"status"`
}
AgentInfo Agent 信息
type AgentStatus ¶
type AgentStatus int
AgentStatus 代理客户端状态
const ( // StatusDisconnected 未连接 StatusDisconnected AgentStatus = iota // StatusConnecting 连接中 StatusConnecting // StatusConnected 已连接 StatusConnected // StatusReconnecting 重连中 StatusReconnecting )
type AgentStatusInfo ¶
type AgentStatusInfo struct {
// Connected 是否已连接到网关
Connected bool `json:"connected"`
// GatewayAddr 网关地址
GatewayAddr string `json:"gateway_addr"`
// Transport 使用的传输协议
Transport string `json:"transport"`
// Services 已注册的服务列表
Services []ServiceInfo `json:"services"`
// LastError 最后一次错误
LastError string `json:"last_error,omitempty"`
// ConnectedAt 连接时间
ConnectedAt time.Time `json:"connected_at,omitempty"`
}
AgentStatusInfo 代理客户端状态信息
type AuthProvider ¶
type AuthProvider interface {
// Authenticate 验证服务是否可以注册
Authenticate(service *ServiceInfo) error
// Authorize 验证客户端是否可以访问服务
Authorize(serviceID, clientID string) error
// GenerateToken 生成认证令牌
GenerateToken(service *ServiceInfo) (string, error)
// ValidateToken 验证认证令牌
ValidateToken(token string) (*ServiceInfo, error)
}
AuthProvider 认证提供者接口
type Endpoint ¶
type Endpoint struct {
// Type 端点类型: http, grpc, debug
Type EndpointType `json:"type,omitempty"`
// Path 端点路径
Path string `json:"path,omitempty"`
// Port 端点端口(本地)
Port int `json:"port,omitempty"`
// Address 端点地址
Address string `json:"address,omitempty"`
// Metadata 端点元数据
Metadata map[string]string `json:"metadata,omitempty"`
}
Endpoint 服务端点
type EndpointConfig ¶
type EndpointConfig struct {
// Type 端点类型: http, grpc, debug
Type string `yaml:"type"`
// LocalAddr 本地地址
LocalAddr string `yaml:"local_addr"`
// Path 暴露路径
Path string `yaml:"path"`
// Metadata 端点元数据
Metadata map[string]string `yaml:"metadata"`
}
EndpointConfig 端点配置
type EndpointType ¶
type EndpointType string
EndpointType 端点类型
const ( EndpointTypeHTTP EndpointType = "http" EndpointTypeGRPC EndpointType = "grpc" EndpointTypeDebug EndpointType = "debug" EndpointTypeTCP EndpointType = "tcp" EndpointTypeUDP EndpointType = "udp" )
type Gateway ¶
type Gateway interface {
// Start 启动网关
Start(ctx context.Context) error
// Stop 停止网关
Stop(ctx context.Context) error
// Services 获取所有注册的服务
Services() []*ServiceInfo
// GetService 获取指定服务
GetService(name string) (*ServiceInfo, error)
// Status 获取网关状态
Status() GatewayStatus
// Forward 转发请求到指定服务
Forward(ctx context.Context, serviceName string, endpointType EndpointType, conn net.Conn) error
// SetAuthProvider 设置认证提供者
SetAuthProvider(auth AuthProvider)
}
Gateway 代理网关服务端接口 运行在代理网关上,负责接收服务注册并暴露服务
type GatewayConfig ¶
type GatewayConfig struct {
// ListenAddr 监听地址
ListenAddr string `yaml:"listen_addr"`
// Transport 传输协议: yamux, quic, kcp
Transport string `yaml:"transport"`
// TransportOptions 传输层选项
TransportOptions *TransportOptions `yaml:"transport_options"`
// HTTPPort HTTP 服务端口
HTTPPort int `yaml:"http_port"`
// GRPCPort gRPC 服务端口
GRPCPort int `yaml:"grpc_port"`
// DebugPort Debug 服务端口
DebugPort int `yaml:"debug_port"`
// HeartbeatInterval 心跳间隔(秒)
HeartbeatInterval int `yaml:"heartbeat_interval"`
// HeartbeatTimeout 心跳超时(秒)
HeartbeatTimeout int `yaml:"heartbeat_timeout"`
// HealthCheckInterval 健康检查间隔(秒)
HealthCheckInterval int `yaml:"health_check_interval"`
// TLS TLS 配置
TLS TLSConfig `yaml:"tls"`
}
GatewayConfig 网关配置
type GatewayStatus ¶
type GatewayStatus int
GatewayStatus 网关状态
const ( // GatewayStatusStopped 网关已停止 GatewayStatusStopped GatewayStatus = iota // GatewayStatusStarting 网关启动中 GatewayStatusStarting // GatewayStatusRunning 网关运行中 GatewayStatusRunning // GatewayStatusStopping 网关停止中 GatewayStatusStopping )
type GatewayStatusInfo ¶
type GatewayStatusInfo struct {
// Running 是否运行中
Running bool `json:"running"`
// ListenAddr 监听地址
ListenAddr string `json:"listen_addr"`
// Transport 使用的传输协议
Transport string `json:"transport"`
// ServiceCount 注册的服务数量
ServiceCount int `json:"service_count"`
// ConnectionCount 当前连接数
ConnectionCount int `json:"connection_count"`
// StartedAt 启动时间
StartedAt time.Time `json:"started_at,omitempty"`
}
GatewayStatusInfo 网关状态信息
type Listener ¶
type Listener interface {
io.Closer
// Accept 接受新的会话连接
Accept() (Session, error)
// Addr 监听地址
Addr() net.Addr
}
Listener 监听器接口
func ListenTransport ¶
func ListenTransport(ctx context.Context, transportName, addr string, opts *TransportOptions) (Listener, error)
ListenTransport 使用指定传输协议监听
type Message ¶
type Message struct {
// Type 消息类型/方法
Type MessageType `json:"type"`
// ID 消息ID,用于请求-响应匹配
ID string `json:"id,omitempty"`
// Payload 消息负载(JSON 编码的具体数据)
Payload []byte `json:"payload,omitempty"`
// Error 错误信息
Error string `json:"error,omitempty"`
}
Message 通信消息(类似 JSON-RPC)
type MessageType ¶
type MessageType uint8
MessageType 消息类型
const ( // MessageTypeRegister 服务注册 MessageTypeRegister MessageType = iota + 1 // MessageTypeDeregister 服务注销 MessageTypeDeregister // MessageTypeHeartbeat 心跳 MessageTypeHeartbeat // MessageTypeRequest 请求 MessageTypeRequest // MessageTypeResponse 响应 MessageTypeResponse // MessageTypeStream 流数据 MessageTypeStream // MessageTypeAck 确认 MessageTypeAck // MessageTypeError 错误 MessageTypeError // MessageTypeHTTPRequest HTTP请求转发 MessageTypeHTTPRequest // MessageTypeGRPCRequest gRPC请求转发 MessageTypeGRPCRequest // MessageTypeDebugRequest Debug请求转发 MessageTypeDebugRequest )
type RequestMeta ¶
type RequestMeta struct {
// ServiceID 目标服务ID
ServiceID string `json:"service_id"`
// EndpointType 端点类型
EndpointType EndpointType `json:"endpoint_type"`
// Path 请求路径
Path string `json:"path"`
// Method HTTP方法(仅HTTP端点)
Method string `json:"method,omitempty"`
// Headers 请求头
Headers map[string]string `json:"headers,omitempty"`
}
RequestMeta 请求元数据
type ServiceInfo ¶
type ServiceInfo struct {
// ID 服务唯一标识
ID string `json:"id,omitempty"`
// Name 服务名称
Name string `json:"name,omitempty"`
// Version 服务版本
Version string `json:"version,omitempty"`
// Metadata 元数据
Metadata map[string]string `json:"metadata,omitempty"`
// Endpoints 服务端点列表
Endpoints []Endpoint `json:"endpoints,omitempty"`
// RegisterTime 注册时间
RegisterTime time.Time `json:"register_time,omitempty"`
// LastHeartbeat 最后心跳时间
LastHeartbeat time.Time `json:"last_heartbeat,omitempty"`
// Status 服务状态
Status ServiceStatus `json:"status,omitempty"`
}
ServiceInfo 服务信息
type ServiceStatus ¶
type ServiceStatus string
ServiceStatus 服务状态
const ( ServiceStatusOnline ServiceStatus = "online" ServiceStatusOffline ServiceStatus = "offline" ServiceStatusUnhealthy ServiceStatus = "unhealthy" )
type Session ¶
type Session interface {
io.Closer
// Open 打开一个新的流
Open(ctx context.Context) (Stream, error)
// OpenWithPriority 打开指定优先级的流(1-10,1最高)
OpenWithPriority(ctx context.Context, priority int) (Stream, error)
// Accept 接受一个新的流
Accept() (Stream, error)
// IsClosed 会话是否已关闭
IsClosed() bool
// NumStreams 当前活跃流数量
NumStreams() int
// LocalAddr 本地地址
LocalAddr() net.Addr
// RemoteAddr 远程地址
RemoteAddr() net.Addr
}
Session 代表一个与对端的会话,可以创建多个流
func DialTransport ¶
func DialTransport(ctx context.Context, transportName, addr string, opts *TransportOptions) (Session, error)
DialTransport 使用指定传输协议连接到服务端
type Stream ¶
type Stream interface {
io.ReadWriteCloser
// LocalAddr 本地地址
LocalAddr() net.Addr
// RemoteAddr 远程地址
RemoteAddr() net.Addr
// SetDeadline 设置读写超时
SetDeadline(t time.Time) error
// SetReadDeadline 设置读超时
SetReadDeadline(t time.Time) error
// SetWriteDeadline 设置写超时
SetWriteDeadline(t time.Time) error
// Priority 获取流优先级
Priority() int
}
Stream 代表一个多路复用的流连接
type TLSConfig ¶
type TLSConfig struct {
// Enabled 是否启用 TLS
Enabled bool `yaml:"enabled"`
// CertFile 证书文件
CertFile string `yaml:"cert_file"`
// KeyFile 私钥文件
KeyFile string `yaml:"key_file"`
// CAFile CA 证书文件
CAFile string `yaml:"ca_file"`
// Insecure 是否跳过证书验证
Insecure bool `yaml:"insecure"`
// MinVersion 最小 TLS 版本 (e.g. "TLS12", "TLS13")
MinVersion string `yaml:"min_version"`
// CipherSuites 密码套件列表 (e.g. ["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"])
CipherSuites []string `yaml:"cipher_suites"`
// ClientAuth 客户端认证模式 ("NoClientCert", "RequestClientCert", "RequireAnyClientCert", "VerifyClientCertIfGiven", "RequireAndVerifyClientCert")
ClientAuth string `yaml:"client_auth"`
// SessionCacheSize 会话缓存大小
SessionCacheSize int `yaml:"session_cache_size"`
// SessionTimeout 会话超时时间(秒)
SessionTimeout int `yaml:"session_timeout"`
}
TLSConfig TLS 配置
type Transport ¶
type Transport interface {
// Name 传输协议名称
Name() string
// Dial 创建到服务端的连接
Dial(ctx context.Context, addr string) (Session, error)
// Listen 监听来自客户端的连接
Listen(ctx context.Context, addr string) (Listener, error)
}
Transport 传输层接口,支持多种传输协议 实现者需要提供底层连接的多路复用能力
func MustNewTransport ¶
func MustNewTransport(name string, opts *TransportOptions) Transport
MustNewTransport 创建传输层实例,失败时 panic
func NewTransport ¶
func NewTransport(name string, opts *TransportOptions) (Transport, error)
NewTransport 创建传输层实例
type TransportFactory ¶
type TransportFactory func(opts *TransportOptions) (Transport, error)
TransportFactory 传输层工厂函数
func GetTransportFactory ¶
func GetTransportFactory(name string) (TransportFactory, bool)
GetTransportFactory 获取已注册的传输层工厂
type TransportOptions ¶
type TransportOptions struct {
// EnableTLS 是否启用 TLS
EnableTLS bool
// CertFile 证书文件
CertFile string
// KeyFile 私钥文件
KeyFile string
// CAFile CA 证书文件
CAFile string
// Insecure 是否跳过证书验证
Insecure bool
// MaxStreams 最大流数量
MaxStreams int
// KeepAliveInterval 保活间隔
KeepAliveInterval int
// ConnectionWriteTimeout 连接写超时(秒)
ConnectionWriteTimeout int
// StreamOpenTimeout 流打开超时(秒)
StreamOpenTimeout int
}
TransportOptions 传输层选项
func DefaultTransportOptions ¶
func DefaultTransportOptions() *TransportOptions
DefaultTransportOptions 默认传输层选项
Directories
¶
| Path | Synopsis |
|---|---|
|
Package main provides a simple example of using the tunnel package.
|
Package main provides a simple example of using the tunnel package. |
|
Package tunnelagent 提供隧道代理客户端实现
|
Package tunnelagent 提供隧道代理客户端实现 |
|
Package tunneldebug 提供 Tunnel Gateway 的 Web 管理界面
|
Package tunneldebug 提供 Tunnel Gateway 的 Web 管理界面 |