反向代理

proxy 包提供多协议反向代理,统一 http.Handler 入口按协议自动嗅探分流。

 1import (
 2    "net/http"
 3    "net/url"
 4    "github.com/go-zeus/zeus/proxy"
 5    "github.com/go-zeus/zeus/balancer/roundrobin"
 6)
 7
 8// 静态模式
 9target, _ := url.Parse("http://127.0.0.1:9000")
10p := proxy.New(proxy.WithSelector(proxy.NewStaticSelector(target)))
11http.ListenAndServe(":8081", p)
12
13// 动态模式(服务发现 + 集群路由)
14p := proxy.New(proxy.WithSelector(
15    proxy.NewDiscoverySelector("api-svc", dis, roundrobin.New()),
16))

支持的协议

协议实现
HTTP/HTTPS基于 httputil.ReverseProxy,自动注入 X-Forwarded-For/X-Real-IP/X-Request-ID
WebSocketHijack + raw io.Copy 透传(nginx 风格,不解析 RFC6455 帧)
SSE禁用缓冲 + Flusher,串行 read-write-flush 保证事件顺序
gRPC走独立 plugin 模块 plugins/proxy/grpc,独立监听端口(HTTP/2 多路复用)

Selector 接口

抽象后端选择:

实现说明
NewStaticSelector(target *url.URL)固定后端
NewDiscoverySelector(name, dis, lb)动态服务发现 + 负载均衡 + 集群路由

扩展点:WithDirector / WithResponseRewriter / WithErrorHandler / WithTransport

内置负载均衡

算法
balancer/random随机
balancer/roundrobin轮询

实现 Balancer 接口,可在 NewDiscoverySelector 中替换。