京东微服务实践-杰夫服务框架云平台系统技术部李鑫lixininfo@jd.com为何要服务化•系统规模随着业务的发展⽽而增⻓长,原有系统架构模式,逻辑过于耦合不再适应;•拆分后的⼦子系统逻辑内聚,易于局部扩展;•⼦子系统之间通过接⼝口来进⾏行交互,接⼝口契约不变的情况下可独⽴立变化;DBAPP2APP1APP3交互通过DB来进⾏行DataStoreDataStoreDataStoreApp1App2App3交互通过同步/异步接⼝口来进⾏行为什么要打造服务平台3服务寻址服务调⽤用服务发布调⽤用分析图表存活监控服务性能数据收集服务⻔门户配置查看/推送降级限流负载均衡第⼀一代服务框架•2012年初开始研发;•zookeeper集群作为注册中⼼心;•baseon开源的服务框架;45zookeeper服务消费者1服务消费者2服务消费者3服务提供者1服务提供者2服务提供者3Web管理端3.直接服务调⽤用1.服务提供者进⾏行注册2.服务消费者进⾏行订阅地址举例:WebService://172.17.3.18:20880/?interface=com.jd.arch.HelloService&group=pop&version=0.1运营中暴露出的不⾜足1.客户端•许多逻辑放到客户端,推出新版本;有版本升级问题;•watch时效问题;2.注册中⼼心•zookeeper作为注册中⼼心,功能定制扩展受限;3.服务治理•缺乏流控⼿手段,⼤大流量打爆线程池;•更改配置需重启,对运营不够友好;•缺乏调⽤用监控,没有调⽤用分析图表;67重装上阵!新服务平台JSF•14年初开始研发;•⾃自主研发以获得彻底的掌控⼒力;•⽼老版本运营经验⽀支撑功能特性设计;•中⽂文名:杰夫89IndexServiceWeb管理端MonitorServiceEventWorkerIndexService服务注册服务寻址配置管理注册中⼼心监控数据库注册中⼼心数据库管理数据库MonitorService服务提供者1服务提供者2服务提供者3服务消费者1服务消费者2服务消费者3JSF协议直接调⽤用注册/订阅定期发送性能统计数据询问注册中⼼心地址index服务数据库10proxyClientClientTransportServerTransportServerTaskExecutorInvokerInterfaceImplClientFilterChainServerFilterChainHeaderInvocationBodyencode/序列化decode负载均衡链接管理重试策略JSF核⼼心技术-RPC⽰示意图NIOTCP⻓长链接IO-Multiplex多路复⽤用JSF核⼼心技术-协议•采⽤用Netty来实现⺴⽹网络协议栈,异步事件通讯框架;•同⼀一端⼝口同时⽀支持Http、TCP协议访问,根据数据包情况挂载不同解码器;•TCP⻓长链接下使⽤用⾃自定义⼆二进制协议;•HTTP⺴⽹网关来应对跨语⾔言访问;11adcf0000007f000f010a010000000e16010101000007d09791c2da002f636f6d2e6a642e6a6c……magicfulllength协议/序列化/消息..消息ID扩展描述2000JSF核⼼心技术RPC-callback•TCP⻓长链接是双⼯工的,服务⽅方可以主动推送消息到调⽤用⽅方;•调⽤用端检测到参数列表中有Callback类型,登记相应的callback对象;服务端收到调⽤用时,⽣生成相应的反向调⽤用代理;•服务端持有此代理,并在需要时调⽤用此代理来推送消息;12CallbackstubProviderCallbackImplConsumerJSF核⼼心技术HA&负载均衡•⼀一个服务⾄至少部署两个以上实例;•服务消费者运⽤用负载均衡算法选择服务提供者,可以设置权重;•服务消费者对服务提供者有健康监测;•服务消费者端可以配置重试机制;13服务消费者服务提供者1服务提供者2可⽤用列表重连列表⾮非健康列表JSF核⼼心技术-性能优化•批量处理,请求先写⼊入RingBuffer;•优化线程模型,将序列化与反序列化这种耗时的操作从Netty的IO线程中挪到⽤用户线程池中;•启⽤用压缩以应对⼤大数据量的请求,默认snappy压缩算法;•定制msgpack序列化,序列化模版,同时还⽀支持fastjson、hessian等多种序列化协议;14JSF核⼼心技术-性能优化15蓝⾊色⼀一代框架红⾊色⼆二代框架JSF核⼼心技术-注册中⼼心16服务注册服务寻址配置管理客户端注册中⼼心数据库服务注册服务寻址配置管理客户端A机房B机房优先访问本机房注册中⼼心,各组件均有本地容灾缓存JSF核⼼心技术-注册中⼼心17客户端客户端ConnectionManagerConnectionManagerLDSLDS注册中⼼心数据库A机房B机房JSF核⼼心技术-配置•服务提供者列表维护,动态推送;•查看当前服务⽣生效的配置,动态下发新配置:权重/负载均衡算法/各种功能开关;•服务提供者动态分组⽆无需重启;18JSF核⼼心技术-限流•每⼀一个服务调⽤用者都有可能成为潜在的DDOS攻击者;•给服务的所有调⽤用者带上标⽰示,在系统环境变量中带上APPID;•开发计数器服务(CounterService),限定单位时间内最⼤大调⽤用次数(如400次/分钟);•限定服务端调⽤用最⼤大并发数(设定到接⼝口-⽅方法级别);•服务端执⾏行时检查请求的状态,如等待时间⼤大于超时时间,直接丢弃;19JSF核⼼心技术-降级•每个服务接⼝口的每个⽅方法都有灾备降级开关;•配置mock逻辑,返回的结果⽤用json格式预先设好;•降级开关打开时将在consumer端短路RPC调⽤用,直接返回JSON结果;20JSF核⼼心技术-监控21MonitorServiceMonitorService服务提供者服务消费者influxDB天表⼩小时表分钟表MonitorQueryService调⽤用情况报表JSF核⼼心技术-报警•provider下线报警(⼼心跳、telnet端⼝口检查);•某应⽤用调⽤用量超限额报警;•Consumer存活报警;•耗时超过阀值报警;•异常(Exception)捕获报警;22JSF核⼼心技术-监控报表(1)23JSF核⼼心技术-监控报表(2)24JSF核⼼心技术-弹性云部署•按需⾃自动扩展服务能⼒力;•CAP(CloudApplicationPlatform)系统负责资源调度;•⾃自动部署系统在容器上部署业务应⽤用;25CAPJSF监控接⼝口JDOS新服务实例服务注册中⼼心注册分配资源/部署接⼝口设计的问题•“⽆无缝将本地接⼝口发布为远程接⼝口,调⽤用与本地⼀一样”-只能是理想•考虑服务调⽤用超时异常的处理;•考虑服务业务逻辑粒度;•考虑服务是否幂等;•⼀一些不好的接⼝口设计举例:•返回值类型为Object,实际对象类型被擦除•接⼝口声明中使⽤用范型参数T•嵌套层数太多26JSF运营的现状27•接⼊入4000余个接⼝口(按JavaInterface计算);•接⼊入的物理机、docker按独⽴立IP计算共10000+;•每⽇日上百亿次的调⽤用量;•商品接⼝口:500+多个服务实例,9000+消费实例;下⼀一步研发⽅方向•服务治理,根据应⽤用ID的⼀一系列管理增强;•增强接⼝口⽂文档管理,建⽴立接⼝口⽂文档中⼼心,帮助⽤用户使⽤用接⼝口;•增强跨语⾔言⽀支持;28谢谢!Thankyou!Q&A