京东微服务实践--杰夫服务框架

lizhi_java

贡献于2017-01-05

字数:3863 关键词: 安全相关框架 HTTP Java JSON

京东微服务实践 -杰夫 服务框架 云平台 系统技术部 李鑫 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 LDS LDS 注册中⼼数据库A机房 B机房 JSF核⼼技术- 配置 • 服务提供者列表维护,动态推送 ; • 查看当前服务⽣效的配置,动态下发新配置:权重/负载均衡算 法/各种功能开关 ; • 服务提供者动态分组⽆需重启 ; 18 JSF核⼼技术-限流 • 每⼀个服务调⽤者都有可能成为潜在的 DDOS攻击者; • 给服务的所有调⽤者带上标⽰,在系统环境变量中带上 APPID; • 开发计数器服务( Counter Service),限定单位时间内最⼤调⽤次 数(如 400次/分钟); • 限定服务端调⽤最⼤并发数(设定到接⼝-⽅法级别); • 服务端执⾏时检查请求的状态,如等待时间⼤于超时时间,直接丢 弃; 19 JSF核⼼技术-降级 • 每个服务接⼝的每个⽅法都有灾备降级开关; • 配置 mock逻辑,返回的结果⽤ json格式预先设好; • 降级开关打开时将在 consumer端短路 RPC调⽤,直接返回 JSON结 果; 20 JSF核⼼技术-监控 21 MonitorService MonitorService 服务提供者 服务消费者 influx DB 天表⼩时表分钟表 MonitorQueryService 调⽤情况 报表 JSF核⼼技术-报警 • provider下线报警(⼼跳、 telnet端⼝检查); • 某应⽤调⽤量超限额报警; • Consumer存活报警; • 耗时超过阀值报警; • 异常( Exception)捕获报警; 22 JSF核⼼技术-监控报 表 (1) 23 JSF核⼼技术-监控报 表 (2) 24 JSF核⼼技术-弹性云部署 • 按需⾃动扩展服务能⼒; • CAP( Cloud Application Platform)系统负责资源调度 ; • ⾃动部署系统在容器上 部署业务应⽤; 25 CAP JSF监 控接⼝ JDOS 新服务 实例 服务注 册中⼼ 注册 分配资源/部署 接⼝设计的问题 • “⽆缝将本地接⼝发布为远程接⼝,调⽤与本地⼀样 ”-只能是理想 • 考虑服务调⽤超时异常的处理; • 考虑服务业务逻辑粒度; • 考虑服务是否幂等; • ⼀些不好的接⼝设计举例: • 返回值类型为 Object ,实际对象类型被擦除 • 接⼝声明中使⽤范型参数 T • 嵌套层数太多 26 JSF运营 的现状 27 • 接⼊ 4000余个接⼝(按 Java Interface计算); • 接⼊的物理机 、 docker按独⽴ IP计算共 10000+; • 每⽇上百亿次的调⽤量; • 商品接⼝: 500+多个服务实例, 9000+消费实例 ; 下⼀步研发⽅向 • 服务治理,根据应⽤ ID的⼀系列管理增强; • 增强接⼝⽂档管理,建⽴接⼝⽂档中⼼,帮助⽤户使⽤接⼝; • 增强跨语⾔⽀持; 28 谢谢 ! Thank you! Q&A

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

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

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

下载文档

相关文档