谈京东京麦TCP网关的Netty应用实践
京麦从2014年构建网关,从HTTP网关发展到TCP网关。在2016年重构完成基于Netty4.x+Protobuf3.x实现对接PC和App上下行通信的高可用、高性能、高稳定的TCP长连接网关。本文重点介绍京麦TCP网关的背景、架构及Netty的应用实践。
背景
早期京麦搭建HTTP和TCP长连接功能主要用于消息通知的推送,并未应用于API网关。随着逐步对NIO的深入学习和对Netty框架的了解,以及对系统通信稳定能力的愈加高要求,采用NIO技术应用网关实现API请求调用的想法,最终在2016年实现,并完全支撑业务化运行。由于诸多的改进,包括TCP长连接容器、Protobuf的序列化、服务泛化调用框架等等,性能比HTTP网关提升10倍以上,稳定性也远远高于HTTP网关。
架构
基于Netty构建京麦TCP网关的长连接容器,作为网关接入层提供服务API请求调用。
一、网络结构
客户端通过域名+端口访问TCP网关,域名不同的运营商对应不同的VIP,VIP发布在LVS上,LVS将请求转发给后端的HAProxy,再由HAProxy把请求转发给后端的Netty的IP+Port。
LVS转发给后端的HAProxy,请求经过LVS,但是响应是HAProxy直接反馈给客户端的,这也就是LVS的DR模式。

二、TCP网关长连接容器架构
TCP网关的核心组件是Netty,而Netty的NIO模型是Reactor反应堆模型(Reactor相当于有分发功能的多路复用器Selector)。每一个连接对应一个Channel(多路指多个Channel,复用指多个连接复用了一个线程或少量线程,在Netty指EventLoop),一个Channel对应唯一的ChannelPipeline,多个Handler串行的加入到Pipeline中,每个Handler关联唯一的ChannelHandlerContext。
TCP网关长连接容器的Handler就是放在Pipeline的中。我们知道TCP属于OSI的传输层,所以建立Session管理机制构建会话层来提供应用层服务,可以极大的降低系统复杂度。所以,每一个Channel对应一个Connection,一个Connection又对应一个Session,Session由Session Manager管理,Session与Connection是一一对应,Connection保存着ChannelHandlerContext(ChannelHanderContext可以找到Channel),Session通过心跳机制来保持Channel的Active状态。
每一次Session的会话请求(ChannelRead)都是通过Proxy代理机制调用Service层,数据请求完毕后通过写入ChannelHandlerConext再传送到Channel中。数据下行主动推送也是如此,通过Session Manager找到Active的Session,轮询写入Session中的ChannelHandlerContext,就可以实现广播或点对点的数据推送逻辑。

Netty的应用实践
京麦TCP网关使用Netty Channel进行数据通信,使用Protobuf进行序列化和反序列化,每个请求都将被封装成Byte二进制字节流,在整个生命周期中,Channel保持长连接,而不是每次调用都重新创建Channel,达到链接的复用。
一、TCP网关Netty Server的IO模型
1. 创建ServerBootstrap,设定BossGroup与WorkerGroup线程池。
2. bind指定的port,开始侦听和接受客户端链接。(如果系统只有一个服务端port需要监听,则BossGroup线程组线程数设置为1。)
3. 在ChannelPipeline注册childHandler,用来处理客户端链接中的请求帧。
二、TCP网关的线程模型
TCP网关使用Netty的线程池,共三组线程池,分别为BossGroup、WorkerGroup和ExecutorGroup。其中,BossGroup用于接收客户端的TCP连接,WorkerGroup用于处理I/O、执行系统Task和定时任务,ExecutorGroup用于处理网关业务加解密、限流、路由,及将请求转发给后端的抓取服务等业务操作。

This chapter requires login to view full content. You are viewing a preview.
Login to View Full Content