tunnel

package
v2.0.0 Latest Latest
Warning

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

Go to latest
Published: May 20, 2026 License: Apache-2.0 Imports: 7 Imported by: 0

README

Tunnel - 服务注册监控网关

服务注册监控网关模块,采用反向连接架构(类似 ngrok/frp)。 服务节点上的 Agent 主动连接到 Gateway,注册自己的服务,Gateway 被动接受连接并对外暴露这些服务。

核心特点

  • 反向连接:服务主动连接网关,无需开放服务端口
  • 内网穿透:服务可以在内网/防火墙后,只要能出站连接 Gateway
  • 服务聚合:多个服务通过同一个 Gateway 对外暴露
  • 远程调试:通过 Gateway 访问服务的 debug 接口进行远程监控

目录结构

core/tunnel/
├── doc.go              # 包文档(详细 API 说明)
├── types.go            # 核心类型和接口定义
├── config.go           # 配置结构定义
├── config.yaml         # 配置示例文件
├── errors.go           # 错误定义
├── transport.go        # 传输层注册表和工厂
├── README.md           # 本文档
├── tunnelagent/        # Agent 实现包
│   ├── agent.go        # Agent 封装和 Builder
│   ├── impl.go         # Agent 实现
│   └── doc.go          # 包文档
├── tunnelgateway/      # Gateway 实现包
│   ├── gateway.go      # Gateway 封装和 Builder
│   ├── impl.go         # Gateway 实现
│   └── doc.go          # 包文档
├── yamux/              # yamux 传输协议实现(基于 TCP)
├── quic/               # QUIC 传输协议实现(基于 UDP)
├── kcp/                # KCP 传输协议实现(基于 UDP)
└── example/            # 使用示例

架构图

                        外部请求
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                   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     │ │  │ └────────┘ │  │ └────────┘ │
│ └──────────┘ │  └────────────┘  └────────────┘
└──────────────┘

工作流程

1. Agent 启动,主动连接 Gateway
   Agent ─────────────────────────────────────> Gateway:7000
                    TCP + yamux

2. Agent 注册服务信息
   Agent ──── [Register] {name, endpoints} ───> Gateway
   Agent <─── [Ack] ──────────────────────────── Gateway

3. Agent 保持心跳
   Agent ──── [Heartbeat] ────────────────────> Gateway (每30秒)

4. 外部请求到达 Gateway
   Client ──── HTTP Request ──────────────────> Gateway:8080

5. Gateway 通过已建立的 tunnel 转发请求
   Gateway ──── [HTTPRequest] ────────────────> Agent
                  (通过 yamux stream)

6. Agent 转发到本地服务
   Agent ──────────────────────────────────────> localhost:8080

7. 响应原路返回
   localhost:8080 ──> Agent ──> Gateway ──> Client

快速开始

1. 部署 Gateway(公网服务器)

Gateway 部署在公网可访问的服务器上,被动等待服务连接。

import (
    "context"
    "github.com/pubgo/lava/v2/core/tunnel/tunnelgateway"
    _ "github.com/pubgo/lava/v2/core/tunnel/yamux" // 注册 yamux 传输
)

func main() {
    ctx := context.Background()
    
    // 方式一:直接创建
    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 连接...
    // 当 Agent 连接并注册服务后,可以通过 Services() 查看
    for _, svc := range gw.Services() {
        fmt.Printf("已注册服务: %s v%s\n", svc.Name, svc.Version)
    }
}
2. 部署 Agent(内网服务节点)

Agent 部署在服务所在的机器上(可以是内网),主动连接到 Gateway。

import (
    "context"
    "github.com/pubgo/lava/v2/core/tunnel"
    "github.com/pubgo/lava/v2/core/tunnel/tunnelagent"
    _ "github.com/pubgo/lava/v2/core/tunnel/yamux"
)

func main() {
    ctx := context.Background()
    
    // 方式一:直接创建
    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. 运行示例
# 运行完整示例(Gateway + Agent + Backend)
go run ./core/tunnel/example/main.go

# 使用不同传输协议
go run ./core/tunnel/example/main.go -transport=quic
go run ./core/tunnel/example/main.go -transport=kcp

# 分别启动(不同终端)
go run ./core/tunnel/example/main.go -mode=backend
go run ./core/tunnel/example/main.go -mode=gateway
go run ./core/tunnel/example/main.go -mode=agent

# 验证请求路由(默认 service=demo-svc)
curl http://127.0.0.1:18080/demo-svc/hello
4. 集成调试接口

调试接口由 core/tunnel/tunneldebug 包提供,可以集成到服务的调试端点:

import "github.com/pubgo/lava/v2/core/tunnel/tunneldebug"

// 设置 Gateway 实例
tunneldebug.SetGateway(gw.Inner())

// 设置 Agent 实例  
tunneldebug.SetAgent(agent.Inner())

使用场景

典型场景:内网服务暴露
┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│    开发者电脑    │     │   公网 Gateway   │     │   内网服务器    │
│                 │     │                 │     │                 │
│  浏览器/curl    │────>│  :8080 (HTTP)   │<────│  Agent          │
│                 │     │  :9090 (gRPC)   │     │  └─ 主动连接    │
│                 │     │  :6060 (Debug)  │     │                 │
│                 │     │                 │     │  本地服务       │
│                 │     │  :7000 (Agent)  │     │  └─ :8080       │
│                 │     │       ↑ 被动    │     │  └─ :9090       │
└─────────────────┘     └─────────────────┘     └─────────────────┘
应用场景
  1. 远程调试:通过 Gateway 访问内网服务的 pprof、metrics 等调试接口
  2. 服务聚合:多个内网服务通过同一个 Gateway 对外暴露
  3. 安全访问:内网服务无需开放端口,只需能出站连接 Gateway
  4. 临时暴露:开发测试时临时将本地服务暴露到公网

配置说明

网关配置
tunnel:
  gateway:
    enabled: true
    listen_addr: ":7000"          # Agent 连接地址
    transport: yamux              # 传输协议
    http_port: 8080               # HTTP 代理端口
    grpc_port: 9090               # gRPC 代理端口
    debug_port: 6060              # Debug 代理端口
    heartbeat_interval: 30        # 心跳间隔(秒)
    heartbeat_timeout: 90         # 心跳超时(秒)
    health_check_interval: 30     # 健康检查间隔(秒)
    tls:
      enabled: false
      cert_file: ""
      key_file: ""
代理客户端配置
tunnel:
  agent:
    enabled: true
    gateway_addr: "gateway.example.com:7000"
    transport: yamux
    service_name: my-service
    service_version: "1.0.0"
    metadata:
      env: production
    endpoints:
      - type: http
        local_addr: "localhost:8080"
        path: /api
      - type: grpc
        local_addr: "localhost:9090"
      - type: debug
        local_addr: "localhost:6060"
        path: /debug
    heartbeat_interval: 30        # 心跳间隔(秒)
    reconnect_interval: 5         # 重连间隔(秒)
    max_reconnect_attempts: 0     # 0=无限重试

核心接口

Transport - 传输层接口
type Transport interface {
    Name() string
    Dial(ctx context.Context, addr string) (Session, error)
    Listen(ctx context.Context, addr string) (Listener, error)
}
Session - 会话接口
type Session interface {
    io.Closer
    Open(ctx context.Context) (Stream, error)
    Accept() (Stream, error)
    IsClosed() bool
    NumStreams() int
    LocalAddr() net.Addr
    RemoteAddr() net.Addr
}
Agent - 代理客户端接口
type Agent interface {
    Start(ctx context.Context) error
    Stop(ctx context.Context) error
    Register(ctx context.Context, service *ServiceInfo) error
    Deregister(ctx context.Context, serviceName string) error
    Status() AgentStatus
}
Gateway - 网关接口
type Gateway interface {
    Start(ctx context.Context) error
    Stop(ctx context.Context) error
    Services() []*ServiceInfo
    GetService(name string) (*ServiceInfo, error)
    Status() GatewayStatus
    Forward(ctx context.Context, serviceName string, endpointType EndpointType, conn net.Conn) error
}

调试端点

端点 方法 说明
/tunnel/ GET 概览 HTML 页面
/tunnel/gateway GET 网关状态 (JSON)
/tunnel/gateway/services GET 所有注册服务列表
/tunnel/gateway/services/:name GET 指定服务详情
/tunnel/agent GET 代理客户端状态

状态说明

AgentStatus
说明
StatusDisconnected 未连接
StatusConnecting 连接中
StatusConnected 已连接
StatusReconnecting 重连中
GatewayStatus
说明
GatewayStatusStopped 已停止
GatewayStatusStarting 启动中
GatewayStatusRunning 运行中
GatewayStatusStopping 停止中

传输协议

协议 常量 状态 说明
yamux TransportYamux ✅ 已实现 基于 TCP 的多路复用
QUIC TransportQUIC ✅ 已实现 基于 UDP 的多路复用,低延迟、0-RTT
KCP TransportKCP ✅ 已实现 基于 UDP 的可靠传输,弱网优化
协议选择指南
场景 推荐协议 原因
通用场景 yamux 稳定可靠,兼容性好
高延迟网络 QUIC/KCP 0-RTT 连接,快速恢复
弱网环境 KCP 激进重传策略,抗丢包
需要 TLS 1.3 QUIC 内置加密,更安全
协议特性对比
特性 yamux QUIC KCP
传输层 TCP UDP UDP
多路复用 ✅ (smux)
连接迁移
0-RTT
内置加密
代理穿透
抗丢包 一般 优秀
CPU 占用
自定义传输协议
func init() {
    tunnel.RegisterTransport("custom", func(opts *tunnel.TransportOptions) (tunnel.Transport, error) {
        return &customTransport{opts: opts}, nil
    })
}

type customTransport struct {
    opts *tunnel.TransportOptions
}

func (t *customTransport) Name() string { return "custom" }
func (t *customTransport) Dial(ctx context.Context, addr string) (tunnel.Session, error) { ... }
func (t *customTransport) Listen(ctx context.Context, addr string) (tunnel.Listener, error) { ... }

通信协议

Agent 和 Gateway 使用长度前缀的 JSON 消息通信:

┌────────────┬─────────────────────────────┐
│ Length (4B)│     JSON Message            │
│  uint32 BE │  { "type": 1, "service":... │
└────────────┴─────────────────────────────┘
消息类型
类型 说明
MessageTypeRegister 1 服务注册
MessageTypeDeregister 2 服务注销
MessageTypeHeartbeat 3 心跳
MessageTypeHTTPRequest 9 HTTP 请求转发
MessageTypeGRPCRequest 10 gRPC 请求转发
MessageTypeDebugRequest 11 Debug 请求转发

错误类型

ErrSessionClosed         // 会话已关闭
ErrStreamClosed          // 流已关闭
ErrConnectionFailed      // 连接失败
ErrServiceNotFound       // 服务未找到
ErrServiceAlreadyExists  // 服务已存在
ErrInvalidMessage        // 无效消息
ErrTimeout               // 超时
ErrTransportNotSupported // 不支持的传输协议
ErrGatewayNotConnected   // 未连接到网关
ErrAgentNotRunning       // 代理客户端未运行
ErrAgentAlreadyRunning   // 代理客户端已运行
ErrGatewayAlreadyRunning // 网关已运行

注意事项

  1. 必须导入传输协议:使用前需要导入对应的传输协议实现包

    // 根据需要导入一个或多个传输协议
    import _ "github.com/pubgo/lava/v2/core/tunnel/yamux" // TCP + 多路复用(推荐)
    import _ "github.com/pubgo/lava/v2/core/tunnel/quic"  // UDP + 低延迟
    import _ "github.com/pubgo/lava/v2/core/tunnel/kcp"   // UDP + 弱网优化
    
  2. 自动重连:Agent 断线后会自动重连,可通过 ReconnectInterval 配置重连间隔

  3. 端点地址格式Endpoint.Address 应为完整的 host:port 格式

  4. 心跳机制:超过 HeartbeatTimeout 未收到心跳,服务会被标记为离线

  5. 多服务支持:单个 Agent 可以注册多个服务

依赖

核心依赖
  • github.com/gofiber/fiber/v3 - Fiber Web 框架(调试接口)
  • github.com/pubgo/funk/v2/log - 日志库
传输层依赖
  • github.com/libp2p/go-yamux/v5 - yamux 多路复用实现
  • github.com/quic-go/quic-go - QUIC 协议实现
  • github.com/xtaci/kcp-go/v5 - KCP 协议实现
  • github.com/xtaci/smux - smux 多路复用(KCP 使用)

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 │ │ │ └────────┘ │ │ └────────┘ │ │ └──────────┘ │ └────────────┘ └────────────┘ └──────────────┘

工作流程

  1. Gateway 启动,监听 :7000 等待 Agent 连接
  2. Agent 启动,主动连接到 Gateway:7000 (TCP + yamux)
  3. Agent 发送 Register 消息,注册自己的服务信息和端点
  4. Agent 定期发送 Heartbeat 保持连接
  5. 外部请求到达 Gateway:8080
  6. Gateway 根据服务名找到对应的 Agent Session
  7. Gateway 通过 yamux stream 将请求转发给 Agent
  8. Agent 将请求转发到本地服务 (localhost:8080)
  9. 响应原路返回:本地服务 -> 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 - 网关已运行

注意事项

  1. 必须导入传输协议实现包以注册协议: import _ "github.com/pubgo/lava/v2/core/tunnel/yamux"

  2. Agent 会自动重连,但需要确保网关地址可达

  3. 服务端点的 Address 字段应为完整的 host:port 格式

  4. 心跳超时后服务会被标记为离线并从网关移除

  5. 支持同一 Agent 注册多个服务

  6. 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

View Source
const (
	// TransportYamux yamux 传输协议
	TransportYamux = "yamux"
	// TransportQUIC QUIC 传输协议
	TransportQUIC = "quic"
	// TransportKCP KCP 传输协议
	TransportKCP = "kcp"
)

支持的传输协议常量

Variables

View Source
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 ListTransports

func ListTransports() []string

ListTransports 列出所有已注册的传输层

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 代理客户端配置

func DefaultAgentConfig

func DefaultAgentConfig() AgentConfig

DefaultAgentConfig 默认代理客户端配置

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
)

func (AgentStatus) String

func (s AgentStatus) String() string

String 返回状态的字符串表示

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 网关配置

func DefaultGatewayConfig

func DefaultGatewayConfig() GatewayConfig

DefaultGatewayConfig 默认网关配置

type GatewayStatus

type GatewayStatus int

GatewayStatus 网关状态

const (
	// GatewayStatusStopped 网关已停止
	GatewayStatusStopped GatewayStatus = iota
	// GatewayStatusStarting 网关启动中
	GatewayStatusStarting
	// GatewayStatusRunning 网关运行中
	GatewayStatusRunning
	// GatewayStatusStopping 网关停止中
	GatewayStatusStopping
)

func (GatewayStatus) String

func (s GatewayStatus) String() string

String 返回状态的字符串表示

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 管理界面

Jump to

Keyboard shortcuts

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