近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

携程经历了从基于.NET的ESB到基于Java的CDubbo服务框架的升级,重点介绍了CDubbo的服务注册、发现、监控、动态配置、协议兼容性和性能优化等内容,展示了携程在微服务架构中的实践经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

==========

携程从 .Net 技术栈开始,最开始是基于 ESB 总线,虽然解决了内网服务调用的治理问题,但是集中式的服务架构,经常会出现单个服务把整个总线拖垮的情况,进而导致全网瘫痪的现象。基于注册中心的 SOA 服务架构,通过分布式的服务调用,解决了单点故障带来的巨大影响。目前,携程主要是以 Java 技术栈为主,考虑到兼容历史 .Net 技术栈,所以现在的框架以自研为主,但是对比开源的高性能服务框架,自研的框架可能又存在下述提到的几个问题。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

现在(CDubbo 服务框架)

===============

CDubbo 名字里的 C 代表携程的治理,Dubbo 代表阿里开源的 Dubbo SDK。纵观过去两年的实践和探索,从 2018 年 4 月的第一个版本落地,到现在的近万服务实例,我们大致可以总结为下面的几个主要里程碑。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

1. 注册发现

========

注册发现是分布式服务框架的核心要素,为了支持现有的服务互通,所以需要接入携程的注册中心。

服务注册支持健康检测扩展机制,业务可以根据业务场景自定义健康检测扩展,例如当依赖的数据库不可用时不再对外提供服务。服务端通过 5s 一次的心跳保持服务的可用性,当连续 N 次没有发送信息时就会自动通知客户端。

客户端发起对服务的订阅,通过推拉结合的模式,保证节点在客户端的最终一致性。通过 Dubbo 的扩展机制,实现了自定义的路由策略,比如根据方法名指定路由策略,以及根据请求参数决定不同的路由策略,同时也能够支持就近访问,优先访问本机房的服务。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

2. 监控 - CAT

============

对微服务来说,没有了监控就好比瞎子一样,什么也不清楚。CAT 提供了分布式链路追踪的能力,可以提供很好的报表,以及场景化的问题分析。

有时,需要了解服务总的请求量以及单机的请求分布和 QPS,或者还要知道服务的执行耗时及 99 线。CAT 的聚合报表可以帮助我们更好的了解服务的健康状况。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

对于超时,可能需要知道哪个阶段变慢,客户端还是服务端,序列化阶段还是服务执行过程太慢。对于异常报错,可以看到哪个过程出现的异常,同时会打印异常堆栈信息,帮助问题的定位。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

3. 监控-Metrics

==============

框架人员需要了解公司服务的宏观情况,比如各机房都有哪些服务,哪些服务使用了 protobuf 序列化格式,哪些服务使用了 SOA 协议等,以及平均执行耗时等情况。业务同事可能也想知道自己服务具体情况,比如有哪些调用方,线程池是否已经跑满了。

通过接入携程的 Dashboard,可以提供全局的总量、错误量、线程池统计信息,也可以根据机房、协议、序列化格式等聚合数据。还能够自定义告警规则,在问题发生时能够尽早的介入。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

4. 动态配置

========

对业务同事来说,有可能会存在依赖的服务突然变慢导致客户端超时的情况。框架人员可能需要在机房故障时,需要全局调整 check 为 false,以解决 A B 服务循环依赖谁都无法启动的问题。动态配置提供了配置热生效的能力,不需要为了一个配置重新发布,成本很高。

服务端的多个方法,可能执行耗时也会有所不同,通过多级别的参数配置,可以设置服务默认超时为 1s,单独为执行较慢的方法设置独立的超时时间为 5s。

服务 Owner 可能更清楚自己服务的耗时,通过服务端对客户端的参数设置,不需要每个调用方都设置一次超时,设置的时间也会更合理一些。为了避免配置出错带来的损失,我们提供了友好的可视化界面。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

5. SOA 协议及互通

=============

为了支持现有客户端迁移到 CDubbo,需要考虑支持现有的 SOA 协议。除了要确保兼容 HTTP 1.1 协议不变,其次要保证跟客户端的序列化器一致。

CDubbo 会通过 Tomcat 端口接收 SOA 协议的请求,利用现有的序列化器执行请求对象的转换,并保证 Dubbo 内部调用和 Filter 链路的一致性,确保业务逻辑的统一,也就是业务代码不需要改动,就可以启动两个协议。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

6. 测试平台

========

对于私有的二进制协议来说,没有现成的 Postman 等工具可以使用。有时,开发人员需要在本地验证测试环境的服务,也可能要验证本地启动的服务端,每个开发人员都构造一个客户端显得成本比较高。

通过 VI(github 开源叫 coreStone),以及利用 Dubbo 2.7.3 提供的元数据中心和泛化调用能力,我们实现了类似 postman 的调用工具。不但可以支持直连,也能够支持本地测试,同时还可以支持 protobuf 序列化格式。关于 protobuf 序列化的测试方案,已经贡献到 dubbo 社区,感兴趣的同学可以自行了解。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

7. 升级 Dubbo 2.7.3

==================

关于 Dubbo 2.7.3 的详细升级历程,可以参考:https://www.infoq.cn/article/kOxdaV3y9fMZ0Bzs0jb2

现在回顾下升级的最终结果如何。目前,携程 99% 的服务已经跑在 dubbo 2.7.3 之上,迄今为止 0 故障,只有一些不兼容的小问题,对于不兼容的问题也是确保了编译时提前暴露,运行时没有任何问题。

在发布后,也陆续的出现了一些小的问题,比如预热能力不生效,异常情况下不会回调 onError 等问题,支持服务端异步的 Trace 埋点等,这些问题已经在开源版本彻底修复了。

8. Threadless

==============

业务同事反馈,需要把线程控制在理想的范围之内。但是,dubbo 的线程数量太多,一方面是服务级独享线程池,当调用方依赖了 10 个服务,每个服务的 QPS 为 1,lantency 可能只有 10ms 的情况下,由于每个服务独立线程池,至少也需要 10 个线程了。如果多服务共享一个线程池,由于客户端默认是 Cached 的线程池模式,那么在这个场景下可能只要 1 个线程就足够了。另一方面,对同步服务来说,dubbo 2.7.5 的 threadless 可以省去 DubboClientHandler 线程,Netty IO 线程直接把响应交给业务线程,从而节省了一次线程切换。

通过实践,业务线程数量有了很大程度的下降,在高 QPS 以及依赖服务数量较多的情况下,甚至可以下降 60-70%。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

9. CDubbo 服务体系

===============

现有 CDubbo 的服务体系,同时支持 Dubbo 和 SOA 协议,对于 Dubbo 客户端能够支持 TCP 协议的传输,对于现有的 SOA 客户端,能够兼容现有的 SOA 协议。

同时,也能够支持内网和外网 gateway 的请求,保证了多协议的配置统一,以及兼容了 SOA 的序列化格式。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

10. 性能表现

=========

从协议层面来看,Dubbo 协议的响应较 SOA 协议有所提升,平均耗时从之前的 1ms 降低到了 0.3ms 左右,当然具体提升也要根据服务的报文及请求量有所差异。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

可能有些人会觉得几毫秒的性能提升不足以挂齿,但是性能的稳定性对服务来说会很重要。我们观察了服务流量突增 3-4 倍的情况下,客户端还能保持 0 异常。长连接的多路复用,提供了很好的抗冲击能力。

近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?

11. 扩展性

========

最后

面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

大厂面试题

面试题目录

讲解视频】](https://bbs.csdn.net/topics/618166371)**

[外链图片转存中…(img-uFZ38hLf-1714766335163)]

[外链图片转存中…(img-tFaQTvFB-1714766335164)]

[外链图片转存中…(img-n5CprzEv-1714766335165)]

[外链图片转存中…(img-xI5YyLSD-1714766335165)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值