李鑫 京东服务框架实践

peterzyliu

贡献于2015-04-27

字数:0 关键词: 软件架构

打造坚实的服务平台 --京东服务化实践 李鑫 lixininfo@jd.com 为何要服务化 • 系统规模随着业务的发展⽽增⻓,原有系统架构模式,逻辑过于 耦合 不再适应; • 拆分后的⼦系统逻辑内聚,易于局部扩展; • ⼦系统之间通过接⼝来进⾏交互,接⼝契约不变的情况下可独⽴ 变化; DB APP2 APP1 APP3 交互通过 DB来进⾏ Data Store Data Store Data Store App1 App2 App3 交互通过同步/异步接⼝来进⾏ 为什么要打造服务平台 3 服务发布 服务寻址 服务调⽤ 调⽤分析图表 存活监控 服务性能数据收集 服务⻔户 配置查看/推送 降级 限流 负载均衡 第⼀代服务框架 • 2012年初开始研发; • zookeeper集群作为注册中⼼; • base on开源的服务框架; 4 5 zookeeper 服务消费者 1 服务消费者 2 服务消费者 3 服务提供者 1 服务提供者 2 服务提供者 3 Web管理端 3.直接服务调⽤ 1.服务提供者进⾏注册 2.服务消费者进⾏订阅 地址举例: WebService://172.17.3.18:20880/? interface=com.jd.arch.HelloService&group=pop&version=0.1 运营中暴露出的不⾜ 1.客户端 • 许多逻辑放到客户端,推出新的会有版本升级问题; • watch时效问题; 2.注册中⼼ • zookeeper作为注册中⼼⾃⼰定制 功能、性能受限; 3.服务治理 • 缺乏流控⼿段,⼤流量打爆线程池; • 更改配置需重启,对运营不够友好; • 缺乏调⽤ 监控,没有调⽤分析图表; 6 7 重装上阵! 新服务平台 JSF • 14年初开始研发; • ⾃主研发 以获得彻底的掌控⼒; • ⽼版本 运营经验⽀撑功能特性设计; • 中⽂名:杰夫 8 9 Index Service Web管理端 Monitor Service Event Worker Index Service 服务注册 服务寻址 配置管理 注册中⼼ 监控数据库 注册中⼼数据库 管理数据库 Monitor Service 服务提供者 1 服务提供者 2 服务提供者 3 服务消费者 1 服务消费者 2 服务消费者 3 JSF协议直接调⽤ 注册/订阅 定期 发送性能统计数据 询问注册中⼼地址 index服务数据库 10 proxy Client ClientTransport ServerTransport ServerTaskExecutor Invoker InterfaceImpl ClientFilterChain ServerFilterChain Header Invocation Body encode/序列化 decode 负载均衡 链接管理 重试策略 JSF核⼼技术- RPC⽰意图 NIO TCP⻓链接 IO-Multiplex多路复⽤ JSF核⼼技术-协议 • 采⽤ Netty来实现⺴络协议栈,异步事件通讯框架; • 同⼀端⼝同时⽀持 Http、 TCP协议访问,根据数据包情况挂载不同 解码器; • TCP⻓链接下使⽤⾃定义⼆进制协议; • HTTP⺴关来应对跨语⾔访问; 11 ad cf 00 00 00 7f 00 0f 01 0a 01 00 00 00 0e 16 01 01 01 00 00 07 d0 97 91 c2 da 00 2f 63 6f 6d 2e 6a 64 2e 6a 6c… … magic full length 协议/序列化/消息 .. 消息 ID 扩展描述 2000 JSF核⼼技术 RPC- callback • TCP⻓链接是双⼯的,服务⽅可以主动推送消息到调⽤⽅ ; • 调⽤端检测到参数列表中有 Callback类型,登记相应的 callback对 象;服务端收到调⽤时,⽣成相应的反向调⽤代理 ; • 服务端并在需要时调⽤此代理来推送 消息; 12 Callback stub Provider Callback Impl Consumer JSF核⼼技术 HA&负载均衡 • ⼀个服务⾄少部署两个以上实例; • 服务消费者运⽤负载均衡算法选择服务提供者,可以设置权重; • 服务消费者对服务提供者有健康监测; • 服务消费者端可以配置重试机制; 13 服务消费者 服务提供者 1 服务提供者 2可⽤列表 重连列表 ⾮健康列表 JSF核⼼技术-性能优化 • 批量处理,请求先写⼊ RingBuffer; • 优化线程模型,将序列化与反序列化这种耗时的操作从 Netty的 IO 线程中挪到⽤户线程池中; • 启⽤压缩以应对⼤数据量的请求,默认 snappy压缩算法; • 定制 msgpack序列化,序列化模版,同时还⽀持 fast json、 hessian 等多种序列化协议; 14 JSF核⼼技术-性能优化 15 蓝⾊⼀代框架 红⾊⼆代框架 JSF核⼼技术-注册中⼼ 16 服务注册 服务寻址 配置管理 客户端 注册中⼼数据库 服务注册 服务寻址 配置管理 客户端 A机房 B机房 JSF核⼼技术-注册中⼼ 17 客户端 客户端 Connection Manager Connection Manager LDMLDS LDMLDS 注册中⼼数据库A机房 B机房 JSF核⼼技术- 配置 • 服务提供者列表维护,动态推送 ; • 查看当前服务⽣效的配置,动态下发新配置:权重/负载均衡算 法/各种功能开关 ; • 服务提供者动态分组⽆需重启 ; 18 JSF核⼼技术-限流 • 每⼀个服务调⽤者都有可能成为潜在的 DDOS攻击者; • 给服务的所有调⽤者带上标⽰,在系统环境变量中带上 APPID; • 开发计数器服务,限定单位时间内最⼤调⽤次数; • 限定服务端调⽤最⼤并发数; • 服务端执⾏时检查请求的状态,如等待时间⼤于超时时间,直接丢 弃; 19 JSF核⼼技术-降级 • 每个服务接⼝都有灾备降级开关; • 配置 mock逻辑,返回的结果⽤ json格式预先设好; • 降级开关打开时将旁路 RPC调⽤; 20 JSF核⼼技术-监控 21 MonitorService MonitorService 服务提供者 服务消费者 influx DB 天表⼩时表分钟表 MonitorQueryService 调⽤情况 报表 JSF核⼼技术-报警 • provider下线报警(⼼跳、 telnet端⼝检查); • 调⽤量超限报警; • Consumer存活报警; • 耗时超限报警; • 异常报警; 22 JSF核⼼技术-监控报 表 (1) 23 JSF核⼼技术-监控报 表 (2) 24 JSF核⼼技术-弹性云部署 • 按需⾃动扩展服务能⼒; • CAP( Cloud Application Platform) 系统⾃动分配物理机并创建容 器; • ⾃动部署系统在容器上 部署业务应⽤; • 应⽤启动并在 JSF服务注册中⼼进⾏注册; 25 接⼝设计的问题 • “⽆缝将本地接⼝发布为远程接⼝ ” • 考虑超时异常的处理; • 考虑业务逻辑粒度; • 考虑是否幂等; • ⼀些不好的接⼝设计举例 • Object 对象被擦除实际类型 • 范型参数 T • 嵌套层数太多 26 京东服务化的现状 • 接⼊ 4000余个接⼝; • 接⼊的物理机 、 docker按独⽴ IP计算共 10000+; • 每⽇上百亿次的调⽤量; • 商品接⼝: 500+多个服务实例, 9000+消费实例 ; 27 2012-06-18 2013-06-18 2014-06-18 7 60 700 商品接⼝单⽇调⽤次数 单位(亿次) 研发中的⼀些感悟 … • 数字化运营(实时数据/阶段性统计数据) ; • 开源软件,必须彻底掌握后再使⽤; • 寻找系统的关键点,详尽的⽇志帮助找到问题所在; • 客户端逻辑尽量简单,逻辑做到服务端 去; 28 研发中的⼀些感悟 … • 重复发明轮⼦不是问题,满⾜客户需求是第⼀位的; • 模拟线上实际情况的压测⾮常重要; • 定时线上容灾演练,验证应急预案的实际执⾏效果 ; 29 下⼀步研发⽅向 • 服务治理,根据应⽤ ID的⼀系列管理增强; • HTTP/2等协议的⽀持; • 增强跨语⾔⽀持; 30 Q&A @InfoQ infoqchina

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档