前言
最近自己摸一个小玩具,开始尝试 GRPC 和 Gateway,于是顺道体验了一下端口复用。
正文
本专案的具体细节:
层级 | 软件 / 包 |
---|---|
1 | Caddy |
2 | cmux |
3 | GPRC & Getaway |
后端先启动 GPRC 服务,随后 Gateway 连接 GRPC 提供 json 格式的接口,由程序内 cmux 包将流入的流量根据类型进行分流,分别传给 GRPC 和 Gateway,最后由 Caddy 根据连接类型进行反向代理。
cmux包
cmux的关键部分:(具体使用请参照官方文档)
代码语言:javascript复制tcpMux := cmux.New(foo)
grpcL := tcpMux.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc"))
httpL := tcpMux.Match(cmux.HTTP1Fast())
Caddy配置:
代码语言:javascript复制foo.bar.cn {
@grpc {
header Content-Type *grpc* # 你也可以使用其他方式匹配 GRPC 的请求
}
reverse_proxy @grpc h2c://127.0.0.1:8888 # 遇到 GPRC 请求使用专门的反代方式
reverse_proxy 127.0.0.1:8888
}
同理你也可以参照上面的配置方式配置负载均衡等操作,因为我的专案中 cmux 使多种流量聚合在了同一个端口上,所以我需要这么配置。