一、整体架构
二、协议
2.1 协议格式
2.1.1 CS
- ws: [头长度][包头][json格式包体]
- http 服务处理来自外部系统的CS包时,还需把请求信息(参数、cookie等)转换为pb,存进包体
2.1.2 SS
格式: [包头长度][pb序列化后的包头][序列化后的包体]
- 包头: servicename, funcname, 包体序列化方式, 路由规则,xxxx
- 包体: pb定义
2.2 打解包函数
- 包头直接pb序列化,反序列化
- 包体json/pb
三、边车代理–go
3.1 集群节点注册、发现
- 启动时,从etcd, 拉取所有服务节点的ip端口,并建立连接,加入服务节点的连接池
- 监听etcd的服务节点,若有节点上线/下线, 建立/断开连接,加入连接池/删除连接池中下线的服务节点
- 负责同pod/本机节点的注册、反注册
3.2 流量转发–可做流量拦截,调用链买点上报
- 监听两个端口, 分别处理来自本机/跨机的连接、流量
- 解包,拿到目标servicename+funcname, 以及路由策略(轮询/一致性hash/广播)
- 通过连接池,找到对应节点的连接,write
四、业务接入层–go
4.1 协议支持
- http
- websocket
4.2 http/ws路由uri的服务信息发现
- 与边车代理的集群节点注册、发现逻辑类似
- 这里主要获取uri对应的servicename、funcname等路由信息
4.3 登录鉴权
- qq、wx、其它
4.4 构造rpc请求包
http/ws请求数据,转成约定的集群内部rpc的pb格式