京东京麦TCP网关服务化架构实践
您目前处于:架构&实践  -  架构  2018年01月03日

京麦TCP网关是基于Netty4.x+Protobuf3.x实现的高可用、高性能、高稳定的TCP长连接网关,对接京麦pc、android、ios、mac 4个客户端实现上下行通信。TCP网关的架构实现和上下行通信等具体原理及代码细节可参考张松然老师的博客(链接:http://linkedkeeper.com/detail/blog.action?bid=1042)。本文重点介绍京麦TCP网关服务化架构的演进与实践。


概述

京麦是京东商家一站式工作平台,是商家在京东开店必备的工具。TCP网关主要负责与客户端的上下行通信,保证客户端的稳定。TCP网关如今承载着京麦客户端日均上亿次的调用量,一套高可用、高性能、高稳定的架构对于保证客户端稳定,提升京东商家体验与办公效率至关重要。


总体架构

下图为TCP网关的总架构图,下面简单讲一下每个模块的作用。



1. 客户端通过域名+端口的方式访问TCP网关,TCP网关基于Netty实现,保证了高质量的通讯。客户端与服务端的通信数据均需加密,登录时数据采用RSA加密,创建Session管理机制构建会话层来提供应用层服务,后续请求采用aes加密,aes秘钥由客户端随机生成。客户端与TCP网关的通信协议是Protocol Buffer,保证了数据传输效率,通信协议分为协议层和数据层,协议层包含客户端版本、设备号、加密协议、oauth校验参数等信息。

2. TCP网关负责接入客户端的channel链接,处理客户端的请求,返回处理结果,同时负责将下行通知推送给客户端;TCP网关会对客户端每一个请求做oauth校验,通过时间戳、签名、token认证等机制保证安全,拦截恶意请求;TCP网关通过心跳机制和断线重连机制管理客户端的链接,及时关闭掉长时间无通信过期的链接;TCP网关支持泛化调用,泛化可以理解为通过配置和协议转化直接调用JSF接口(JSF是京东服务框架,可以类比为阿里的HSF),而不需要每次有新需求都要在网关增加Protocol Buffer对象,定义新接口,具体架构及原理下面篇幅单独介绍;TCP网关是京麦客户端平台所有请求的入口,构建一套完善的监控系统对于保证客户端稳定、实现提前预警和降级处理至关重要,后面会有单独篇幅介绍TCP网关的监控平台。

3. 京麦服务中心负责提供京麦工作台一些核心的业务接口,比如插件接口、店铺经营数据接口等,实现业务与网关的隔离。服务中心按接口的重要程度将接口实现隔离,核心的接口单独部署,同时可对非核心接口实时降级,保证故障期间客户端的高可用。

4. 其他业务线的服务中心可以理解为京东其他部门的原子服务中心,比如订单中心、商品中心等。京麦服务中心会依赖其他部门的接口服务。京麦是京东商家开放平台,随着业务的壮大,会有其他团队直接对接客户端里的部分频道页,但又不能提供多个网关给客户端增加客户端的复杂度,所以TCP网关支持了泛化调用,通过配置和协议转化直接调用其他部门接口,同时可实时对接口进行降级处理。

5. 京东商家关心的消息都可以通过京麦触达到商家,京麦消息中心负责对接上游消息源,通过配置实现协议统一,将消息进行存储、记录日志并分发给TCP网关。TCP网关实现在线通知和离线提醒。消息系统的架构后面篇幅单独介绍。


消息架构

下图为京麦消息系统架构图,Anycall是京东商家消息中间件系统,负责接收各业务中心的订单、商品、商家等消息,进行统一的消息过滤、转换、存储,及监控和统计等。Anycall处理消息后再将消息推送到订阅该消息的商家系统,目前京麦客户端的消息大部分来源于Anycall。自定义消息是运营可在后台配置消息定向推送。下面简单阐述下消息系统的实现。



1. 消息中心负责接收上游系统消息,根据消息源不同分发到不同的broker,消息中心有一个配置中心,作用是把上游消息和京麦消息关联起来,按照不同的协议处理消息;

2. 消息中心按照不同的协议生成消息体和离线推送消息,客户端解析消息并根据协议打开特定页面;

3. 消息存储在Hbase集群,消息追踪日志存放在Elasticsearch集群;

4. 消息中心可实现根据消息源、消息类型实现多维度的降级处理,通过mq重试保证消息不丢;

5. 消息中心将消息统一推送到TCP网关,TCP网关读取用户消息设置,判断是否推送在线通知和离线提醒;

6. 在线通知是通过MQ广播机制到