在低容错业务场景下落地微服务的实践经验

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“健康体检是一个低容错的场景用户到医院体检由于 IT 原因导致无法完成预约的项目会对用户体验造成极大的影响。”

——禾连健康 CTO 邓志豪

禾连健康成立于 2014 年是一家从体检场景切入的健康管理服务公司。对于医院禾连提供的是围绕体检检前、检中、检后的一套 SaaS 服务对于企业提供的是团体体检、健康管理李锦记、普华永道都是禾连的客户对于家庭提供的则是健康管理 APP。目前禾连已经覆盖全国 200 多个城市2000 多家医院。

禾连健康经历了哪些技术发展阶段

第一个阶段宏应用。从 0 到 1迭代速度很快同时故障也很多业务需要禾连快速迭代并验证怎么快怎么来当时还用过阿里云聚石塔提供的一个容器管理服务也算是容器化的雏形。总结来看关注速度但是会出现技术债务、故障多、达不到业务的预期。

第二个阶段微服务化。当禾连对接的医院越来越多后故障也更多了客户抱怨很大那时候开发整天在“救火”。随后禾连开始做模块化的解耦和服务拆分引入了 Dubbo 和 Nacos但当时对业务的理解还是不够深刻服务拆的有问题导致服务交叉调用非常多出现几乎所有接口都会调用到的超级服务对稳定性有害。总结来看对业务理解不深刻的微服务拆分治标不治本。

第三个阶段微服务重构。以横向的订单、落单、数据同步为主重新梳理了模块和服务同时部署架构换成了 K8s并把用于服务治理的一些中间件替换成阿里云微服务引擎 MSE 这类云服务[1]这个时候整个系统总体就比较稳定了。总结来看围绕业务来构建微服务结合云的优势提升了开发运维效率和线上稳定性。

低容错的体检业务有哪些不一样的技术挑战

低容错是禾连的业务特点。例如用户到医院体检由于 IT 原因导致无法完成预约的项目会对用户体验造成极大的影响不仅是体检其实整个医疗行业都有着低容错的特点。另外对于大多数人而言体检的频率一年也就1-2次是非常低频的场景因此流量也非常低。而低流量带来的问题是灰度发布几乎是无效的甚至全量发布都可能无法发现 bug有些 bug 会在代码发布一年以后才会被发现。

因此禾连首先要解决复杂逻辑的问题必须做模块化、做解耦。

但如果只做业务解耦那么实现模块化就足够了。例如如果使用的是 Java 语言将 Java 模块分为 JAR 包用 Maven 管理不同依赖即可。但是早期很多技术架构是通过单一的包支撑不同业务业务模块多、业务不隔离。没有做微服务拆分时可能会出现企业业务代码有问题导致医院容错较低的业务崩溃这对业务来说是难以接受的。

因此禾连直接实现了服务化将服务拆分开有公共的基础服务可以调用不同业务之间不会互相影响。服务化不仅实现了业务解耦也实现了服务分层保障履约的核心服务。例如针对容错率非常低的业务可以构建专门针对问题场景的保障服务。同时可以对服务做独立质检而如果打包在一起则无法做独立的质检。

服务拆分主要有两种模式一种为按照业务拆分一种为按照能力拆分不同业务可以互相调用。最终禾连的架构如上图所示。以按照能力拆分为主按照业务拆分为辅。比如最前端是 web 服务蓝色块是业务核心迭代的业务服务底层按照能力拆分订单、支付、消息三种服务。往下一层与业务较远的比如医院数据同步服务、人工履约服务是自建的独立服务。

业务迭代最频繁的服务与相对稳定的服务各自区分独立两边通过 HTTP 打通业务集群内使用 Dubbo 做 RPCNacos 做注册和配置中心RocketMQ 做异步消息。

微服务演进过程中的实践经验

微服务上禾连使用的是 Dubbo + Nacos 这套技术栈。

Dubbo 是一个 基于 Java Interface 的 RPC 框架对于 Java 程序员而言只需加简单的注解即可成为微服务于是在团队中推行。同时调用几乎不侵入代码将 @Autowire 改为 @DubboReference 即可注入服务。Nacos 在 Dubbo 的集成非常完善只需几行配置即可使用控制面板简单易用与 Dubbo 一样均为中文社区对于程序员的门槛更低。

早期禾连自行搭建社区版 Nacos 曾遇到较大性能瓶颈当时的 Dubbo2 服务模型基于接口一个接口、一个函数就会带来一个服务流量非常大。阿里云的微服务引擎 MSE 帮助禾连扛住了 Dubbo 的压力它具有良好的兼容性后续禾连跟随社区升级至 Dubbo 3解决了 Dubbo 2 服务模型的问题。另外从内存视角看MSE 具有出色的调优能力使业务性能提升 4 倍降低了资源成本。

禾连服务大量的医院每个医院的需求不确定、也不尽相同会存在大量的特性开关。此类开关的操作非常危险一般由开发人员进行配置而 MSE 很好地解决了痛点。MSE 的特性开关可以做动态配置无需重启应用。同时可以一键与 KMS 阿里云密钥管理服务相结合对数据进行加密存储但是用户无感知。

HTTP 网关主要解决协议转换的问题。禾连的 App 前端业务逻辑重无需做任何结果封装只要暴露服务能力即可。因此基于开源的 Apache ShenYu 做了改造将 HTTP 协议转为 Dubbo 同时支持 POST/GET将鉴权和授权逻辑都放至网关。

DevOps 方面K8s +镜像发布回滚使用了 ACK[2]持续集成使用了云效 CI 为禾连带来了极高的发布效率一周最多时会发布 20-30 次单次发布时间从原先的 2-3 小时降低至 8 分钟内。另外禾连基于 Dubbo 做了服务隔离例如同一个服务可以部署两个版本代码和使用方式均一致实例不同。两个服务均有独立内存一个服务故障时不会影响到另外一个相同的服务。但该能力目前依然较弱控制面能力的增强是未来的发展方向。

微服务未来规划

未来禾连希望能够实现 Service Mesh 的控制面。

如上图所示比如服务请求到达时如果是 req*则希望它路由至特殊版本 ServiceA* 。请求经过 MQ 之后发出的消息不能被 Service 消息接收而是应被 Service* 接收实现全链路的路由能力。目前阿里云的 ASM 提供的 Istio 托管具备以上能力也提供了基本的 Dubbo 治理能力[3] 后续也将探索在 ASM 中如何进行融合演进。

实现 Service Mesh 的目的是降低测试环境成本。当前禾连的大集群里有 7-8 套测试环境供各个业务小组使用每个小组各用一套互不干扰但成本过高。如果能实现全链路的路由每个开发小组只要做服务的测试环境发布使用打标流量即可实现发布。

参考目前业界的实践全链路的灰度路由可以通过在网关层面识别流量并打标、每个测试环境都有单独的标签每一跳服务调用传递流量标签并在每一跳调用时根据流量标签和对端机器标签做不同策略的匹配路由。最终禾连可以做到每个环境只需要部署当前环境修改后的服务最大限度地重用基线环境的服务降低了总体成本。

另外禾连将实现全量 HTTP 网关。从未来趋势看前端越来越重无需后端做 web 层将后端服务直接暴露给前端即可。因此禾连考虑将所有 web 层替换成 BFF 网关期待紧密跟进社区的步伐联合云原生社区一起向前发展。

参考链接

[1] https://www.aliyun.com/product/aliware/mse

[2] https://www.aliyun.com/product/kubernetes

[3] https://help.aliyun.com/document_detail/214749.html

原文链接

本文为阿里云原创内容未经允许不得转载。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6