Documentation
¶
Overview ¶
环境变量加载:与 CLI(cmds/tunnelcmd)使用同一套 TUNNEL_* 命名。
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 :7007 <- 接受 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 启动,监听 :7007 等待 Agent 连接
- Agent 启动,主动连接到 Gateway:7007 (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 - 监听地址 (默认 :7007) 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: ":7007", // Agent 连接端口
Transport: "yamux",
HTTPPort: 8080, // 对外暴露的 HTTP 端口
GRPCPort: 9090, // 对外暴露的 gRPC 端口
DebugPort: 6060, // 对外暴露的 Debug 端口
})
// 方式二:使用 Builder 模式
gw, err := tunnelgateway.NewBuilder().
WithListenAddr(":7007").
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:7007",
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:7007").
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:7007").
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 AdminTokenFromEnv() string
- func ApplyAuthTokenMetadata(metadata map[string]string, token string) map[string]string
- func AuthTokenFromEnv() string
- func BuildClientTLSConfig(opts *TransportOptions) *tls.Config
- func BuildServerTLSConfig(opts *TransportOptions) (*tls.Config, error)
- func ClientTokenFromRequest(r *http.Request) string
- func ConfigureGatewayAuth(gw Gateway, token string) error
- func GRPCAuthLine(token string) string
- func GRPCContextDialer(opts GRPCDialOptions) func(ctx context.Context, serviceName string) (net.Conn, error)
- func GRPCRouteLine(serviceName string) string
- func GetService(client *http.Client, gatewayHTTP, serviceName, subPath, token string) (*http.Response, error)
- func InsecureFromEnv() bool
- func ListTransports() []string
- func ParseGRPCAuthLine(line string) (token string, ok bool)
- func ParseGRPCRouteLine(line string) (serviceName string, ok bool)
- func ProxyHTTPClient(timeout time.Duration) *http.Client
- func RegisterTransport(name string, factory TransportFactory)
- func ServiceURL(gatewayHTTP, serviceName, subPath string) string
- func SetClientTokenHeader(r *http.Request, token string)
- func SetGatewayMetrics(gw Gateway, scope metrics.Metric)
- func WriteMessage(w io.Writer, msg *Message) error
- type Agent
- type AgentConfig
- type AgentInfo
- type AgentStatus
- type AgentStatusInfo
- type AuthProvider
- type Endpoint
- type EndpointConfig
- type EndpointType
- type GRPCDialOptions
- type Gateway
- type GatewayConfig
- type GatewayStatus
- type GatewayStatusInfo
- type Listener
- type Message
- type MessageType
- type MetricsRecorder
- type P2PRegisterPayload
- type RequestMeta
- type ServiceInfo
- type ServiceStatus
- type Session
- type Stream
- type TLSConfig
- type TokenAuthProvider
- type Transport
- type TransportFactory
- type TransportOptions
Constants ¶
const ( // TransportYamux yamux 传输协议 TransportYamux = "yamux" // TransportQUIC QUIC 传输协议 TransportQUIC = "quic" // TransportKCP KCP 传输协议 TransportKCP = "kcp" // TransportP2P P2P(ICE + QUIC)传输协议 TransportP2P = "p2p" )
支持的传输协议常量
const GRPCAuthPrefix = "Authorization: Bearer "
GRPCAuthPrefix 是 gRPC 代理在路由行之后可选的鉴权行前缀。
const GRPCRoutePrefix = "TUNNEL "
GRPCRoutePrefix 是 gateway gRPC 代理的路由前缀。 客户端须在 gRPC/HTTP2 流量前先发送一行:TUNNEL <service-name>\n
const HeaderTunnelToken = "X-Tunnel-Token"
HeaderTunnelToken 是 HTTP 代理可选的 token 头(与 Authorization: Bearer 二选一)。
const MaxMessageSize = 4 << 20 // 4 MiB
MaxMessageSize 单条控制消息的最大字节数(长度前缀 + JSON 负载)。 用于防止对端发送超大长度前缀导致的内存耗尽(OOM)攻击。
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") )
var ErrAuthFailed = errors.New("tunnel: authentication failed")
ErrAuthFailed 表示认证或授权失败。
Functions ¶
func AdminTokenFromEnv ¶ added in v2.2.0
func AdminTokenFromEnv() string
AdminTokenFromEnv 读取 Admin UI 鉴权 token(TUNNEL_ADMIN_TOKEN)。
func ApplyAuthTokenMetadata ¶ added in v2.2.0
ApplyAuthTokenMetadata 将 auth_token 写入 Agent 注册元数据。
func AuthTokenFromEnv ¶ added in v2.2.0
func AuthTokenFromEnv() string
AuthTokenFromEnv 读取 tunnel 鉴权 token(Agent 注册与 Gateway 校验共用)。
func BuildClientTLSConfig ¶ added in v2.2.0
func BuildClientTLSConfig(opts *TransportOptions) *tls.Config
BuildClientTLSConfig 根据 TransportOptions 构建客户端 tls.Config。
func BuildServerTLSConfig ¶ added in v2.2.0
func BuildServerTLSConfig(opts *TransportOptions) (*tls.Config, error)
BuildServerTLSConfig 根据 TransportOptions 构建服务端 tls.Config。
func ClientTokenFromRequest ¶ added in v2.2.0
ClientTokenFromRequest 从 HTTP 请求提取客户端 token。 优先 X-Tunnel-Token,其次 Authorization: Bearer。
func ConfigureGatewayAuth ¶ added in v2.2.0
ConfigureGatewayAuth 为 Gateway 配置 token 鉴权,token 为空时不做变更。
func GRPCAuthLine ¶ added in v2.2.0
GRPCAuthLine 返回 gRPC 代理的第二行鉴权指令(gateway 启用 auth 时必填)。
func GRPCContextDialer ¶ added in v2.2.0
func GRPCContextDialer(opts GRPCDialOptions) func(ctx context.Context, serviceName string) (net.Conn, error)
GRPCContextDialer 返回可用于 grpc.WithContextDialer 的拨号函数。
拨号时 addr 参数即目标 service 名(配合 grpc passthrough target 使用)。
示例:
cc, err := grpc.NewClient("passthrough:///my-service",
grpc.WithContextDialer(tunnel.GRPCContextDialer(tunnel.GRPCDialOptions{
GatewayAddr: "gateway:9090",
Token: "secret",
})),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
func GRPCRouteLine ¶ added in v2.2.0
GRPCRouteLine 返回写入 gateway gRPC 代理的首行路由指令。
func GetService ¶ added in v2.2.0
func GetService(client *http.Client, gatewayHTTP, serviceName, subPath, token string) (*http.Response, error)
GetService 经 gateway HTTP 代理 GET 指定服务的子路径。 token 非空时设置 Authorization: Bearer(gateway 启用 auth 时必填)。
func InsecureFromEnv ¶ added in v2.2.0
func InsecureFromEnv() bool
InsecureFromEnv reports whether tunnel auth may be skipped (development escape hatch). Set TUNNEL_INSECURE=1 to allow gateway without TUNNEL_AUTH_TOKEN in stage/prod.
func ParseGRPCAuthLine ¶ added in v2.2.0
ParseGRPCAuthLine 解析 gRPC 代理鉴权行,返回 token。
func ParseGRPCRouteLine ¶ added in v2.2.0
ParseGRPCRouteLine 解析客户端发送的路由行,返回 service 名。
func ProxyHTTPClient ¶ added in v2.2.0
ProxyHTTPClient 返回访问 gateway HTTP 代理的 http.Client(标准 URL 路由,无自定义 Transport)。
func RegisterTransport ¶
func RegisterTransport(name string, factory TransportFactory)
RegisterTransport 注册传输层工厂
func ServiceURL ¶ added in v2.2.0
ServiceURL 构造经 gateway HTTP 代理访问某服务的 URL。
gatewayHTTP 为 gateway HTTP 代理根地址,如 http://gateway:8080; serviceName 为已注册服务名;subPath 为服务内路径(可空)。
示例:ServiceURL("http://gw:8080", "my-api", "/v1/users") → http://gw:8080/my-api/v1/users
func SetClientTokenHeader ¶ added in v2.2.0
SetClientTokenHeader 为出站 HTTP 请求设置 token。
func SetGatewayMetrics ¶ added in v2.2.0
SetGatewayMetrics 为 Gateway 绑定 metrics(实现 SetMetricsRecorder 时生效)。
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"`
// P2PSignalHandler 收到 gateway 转发的 P2P 信令时回调(JSON 为 signaling.Message)。
P2PSignalHandler func(payload []byte)
}
AgentConfig 代理客户端配置
func AgentConfigFromEnv ¶ added in v2.2.0
func AgentConfigFromEnv() AgentConfig
AgentConfigFromEnv 从环境变量加载 Agent 配置(在 DefaultAgentConfig 基础上覆盖)。
环境变量:
- TUNNEL_GATEWAY_ADDR Gateway 地址(必填方可连接)
- SERVICE_NAME 服务名(CLI 默认用项目名)
- TUNNEL_AUTH_TOKEN 写入 metadata["auth_token"]
- TUNNEL_TLS_* 见 TLSConfig.ApplyEnv
func (*AgentConfig) Normalize ¶ added in v2.2.0
func (c *AgentConfig) Normalize()
Normalize 合并 TLS 到 TransportOptions,应在创建 Agent 前调用。
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 GRPCDialOptions ¶ added in v2.2.0
type GRPCDialOptions struct {
GatewayAddr string
// Token 非空时发送 Authorization 行;gateway 启用 auth 时必填。
Token string
}
GRPCDialOptions 经 gateway gRPC 代理拨号的配置。
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 代理端口。
// 客户端连接后须先发送路由行 "TUNNEL <service-name>\n",再发送 gRPC/HTTP2 流量。
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"`
// P2PSignalRateLimit 每 peer 每秒最大 P2P 信令条数(0 表示默认 60)
P2PSignalRateLimit int `yaml:"p2p_signal_rate_limit"`
// P2PRegisterRateLimit 每 agent 每秒最大 P2P 注册次数(0 表示默认 10)
P2PRegisterRateLimit int `yaml:"p2p_register_rate_limit"`
// TLS TLS 配置
TLS TLSConfig `yaml:"tls"`
}
GatewayConfig 网关配置
func GatewayConfigFromEnv ¶ added in v2.2.0
func GatewayConfigFromEnv() GatewayConfig
GatewayConfigFromEnv 从环境变量加载 Gateway 配置(在 DefaultGatewayConfig 基础上覆盖)。
环境变量:
- TUNNEL_LISTEN_ADDR Agent 连接监听地址(默认 :7007)
- TUNNEL_HTTP_PORT HTTP 代理端口(默认 8080)
- TUNNEL_GRPC_PORT gRPC 代理端口(默认 9090)
- TUNNEL_DEBUG_PORT Debug 代理端口(默认 6060)
- TUNNEL_P2P_SIGNAL_RATE_LIMIT 每 peer 每秒 P2P 信令条数(默认 60)
- TUNNEL_P2P_REGISTER_RATE_LIMIT 每 agent 每秒 P2P 注册次数(默认 10)
- TUNNEL_TLS_* 见 TLSConfig.ApplyEnv
func (*GatewayConfig) Normalize ¶ added in v2.2.0
func (c *GatewayConfig) Normalize()
Normalize 合并 TLS 到 TransportOptions,应在创建 Gateway 前调用。
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 // MessageTypeP2PRegister P2P 节点注册 peerID(经 gateway 路由信令) MessageTypeP2PRegister // MessageTypeP2PSignal P2P ICE 信令(Offer/Answer/Candidate) MessageTypeP2PSignal )
type MetricsRecorder ¶ added in v2.2.0
type MetricsRecorder struct {
// contains filtered or unexported fields
}
MetricsRecorder 上报 tunnel gateway 指标(scope 为 nil 时为 noop)。
func NewMetricsRecorder ¶ added in v2.2.0
func NewMetricsRecorder(scope metrics.Metric) *MetricsRecorder
NewMetricsRecorder 创建指标记录器;scope 为 nil 时返回 nil。
func (*MetricsRecorder) ObserveProxyAuthFailure ¶ added in v2.2.0
func (m *MetricsRecorder) ObserveProxyAuthFailure()
ObserveProxyAuthFailure 记录一次代理鉴权失败。
func (*MetricsRecorder) ObserveProxyRequest ¶ added in v2.2.0
func (m *MetricsRecorder) ObserveProxyRequest(service, endpoint string)
ObserveProxyRequest 记录一次代理请求。
func (*MetricsRecorder) ObserveRateLimited ¶ added in v2.2.0
func (m *MetricsRecorder) ObserveRateLimited(service string)
ObserveRateLimited 记录一次限流拒绝。
func (*MetricsRecorder) ObserveRegister ¶ added in v2.2.0
func (m *MetricsRecorder) ObserveRegister(service string)
ObserveRegister 记录一次服务注册。
func (*MetricsRecorder) SetRegisteredServices ¶ added in v2.2.0
func (m *MetricsRecorder) SetRegisteredServices(n int)
SetRegisteredServices 更新当前注册服务数。
type P2PRegisterPayload ¶ added in v2.2.0
type P2PRegisterPayload struct {
PeerID string `json:"peer_id"`
AuthToken string `json:"auth_token,omitempty"`
}
P2PRegisterPayload 节点向 gateway 注册 P2P peerID。
func DecodeP2PRegisterPayload ¶ added in v2.2.0
func DecodeP2PRegisterPayload(data []byte) (P2PRegisterPayload, error)
DecodeP2PRegisterPayload 解析 P2P 注册负载。
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 TokenAuthProvider ¶ added in v2.2.0
type TokenAuthProvider struct {
// contains filtered or unexported fields
}
TokenAuthProvider 基于预共享 token 的 AuthProvider 实现。
Agent 注册时在 ServiceInfo.Metadata["auth_token"] 携带 token; Gateway 在 Authenticate 阶段校验该 token 是否在允许列表中。
func NewTokenAuthProvider ¶ added in v2.2.0
func NewTokenAuthProvider(tokens ...string) (*TokenAuthProvider, error)
NewTokenAuthProvider 创建 token 鉴权提供者,至少需要一个 token。
func (*TokenAuthProvider) Authenticate ¶ added in v2.2.0
func (p *TokenAuthProvider) Authenticate(service *ServiceInfo) error
func (*TokenAuthProvider) Authorize ¶ added in v2.2.0
func (p *TokenAuthProvider) Authorize(serviceID, clientID string) error
func (*TokenAuthProvider) GenerateToken ¶ added in v2.2.0
func (p *TokenAuthProvider) GenerateToken(service *ServiceInfo) (string, error)
func (*TokenAuthProvider) ValidateToken ¶ added in v2.2.0
func (p *TokenAuthProvider) ValidateToken(token string) (*ServiceInfo, error)
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
// MinVersion 最小 TLS 版本 (TLS12, TLS13)
MinVersion string
// CipherSuites TLS 密码套件名列表
CipherSuites []string
// ClientAuth 服务端 mTLS 模式(见 TLSConfig.ClientAuth)
ClientAuth string
// SessionCacheSize TLS 会话缓存大小
SessionCacheSize int
}
TransportOptions 传输层选项
func DefaultTransportOptions ¶
func DefaultTransportOptions() *TransportOptions
DefaultTransportOptions 默认传输层选项
func MergeTransportOptions ¶ added in v2.2.0
func MergeTransportOptions(opts *TransportOptions, tls TLSConfig) *TransportOptions
MergeTransportOptions 将 TLS 配置合并进 TransportOptions,供传输层使用。
合并规则:
- 若 TransportOptions 为 nil,使用 DefaultTransportOptions()
- tls.enabled 或提供了 cert/key 文件时启用 EnableTLS
- TLS 块中的 cert/key/ca/insecure 仅在 TransportOptions 对应字段为空/false 时填充
Source Files
¶
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. |
|
auth
command
Demo: 代理鉴权 —— 配置 TUNNEL_AUTH_TOKEN 后,HTTP 代理要求客户端携带 token。
|
Demo: 代理鉴权 —— 配置 TUNNEL_AUTH_TOKEN 后,HTTP 代理要求客户端携带 token。 |
|
grpc
command
Demo: gRPC over tunnel —— 经网关 gRPC 代理调用后端 gRPC 服务。
|
Demo: gRPC over tunnel —— 经网关 gRPC 代理调用后端 gRPC 服务。 |
|
quickstart
command
Demo: 最简上手 —— Standalone Agent + HTTP 代理(单进程跑通)。
|
Demo: 最简上手 —— Standalone Agent + HTTP 代理(单进程跑通)。 |
|
tls
command
Demo: TLS 传输 —— Agent ↔ Gateway 之间启用 TLS(yamux over TLS)。
|
Demo: TLS 传输 —— Agent ↔ Gateway 之间启用 TLS(yamux over TLS)。 |
|
Package ratelimit 提供令牌桶速率限制,供 gateway 代理与 P2P 信令复用。
|
Package ratelimit 提供令牌桶速率限制,供 gateway 代理与 P2P 信令复用。 |
|
Package testhelper provides polling helpers for tunnel integration tests.
|
Package testhelper provides polling helpers for tunnel integration tests. |
|
Package tunnelagent 提供隧道代理客户端实现
|
Package tunnelagent 提供隧道代理客户端实现 |
|
Package tunneldebug 提供 Tunnel Gateway 的 Web 管理界面
|
Package tunneldebug 提供 Tunnel Gateway 的 Web 管理界面 |