如果一个应用需要同时对外提供 HTTP 和 gRPC 服务,通常情况下我们会为两个服务绑定不同的监听端口,而本文要介绍的 cmux 为我们提供了一种连接多路复用的新选择,使用 cmux 可以将不同服务绑定在同一个网络端口上!
✦
简介
✦
多路复用是个很常见的概念,我们在编写 HTTP 服务时通常会用 http.ServeMux
或类似的三方工具实现请求与 handler 的匹配和绑定,这类多路复用一般作用在某个服务内部。而 cmux(github.com/soheilhy/cmux) 则提供了基于请求内容对连接进行多路复用的能力,使用 cmux 我们可以在同一个 TCP 监听(端口)上提供包括 gRPC、SSH、HTTPS、HTTP、Go RPC 在内的几乎任何协议。
cmux 通过扩展 net.Listener
的方式实现了连接多路复用能力,在接收到客户端请求后,cmux 会根据注册的规则对客户端请求进行鉴别和匹配,并根据匹配结果将请求转发给相应的服务。
✦
使用举例
✦
cmux 的使用特别简单,我们只需要为每个服务指定相应的匹配规则即可:
package main
import (
"context"
"log"