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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 禾连健康成立于 2014 年,是一家从体检场景切入的健康管理服务公司。对于医院,禾连提供的是围绕体检检前、检中、检后的一套 SaaS 服务;对于企业,提供的是团体体检、健康管理,李锦记、普华永道都是禾连的客户;对于家庭,提供的则是健康管理 APP。目前,禾连已经覆盖全国 200 多个城市,2000 多家医院。

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

——禾连健康 CTO 邓志豪



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


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


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


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


微服务引擎:

https://www.aliyun.com/product/aliware/mse


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


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


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


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


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


image.png


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


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


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


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

image.png

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


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


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


image.png


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


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


容器服务 ACK

https://www.aliyun.com/product/kubernetes


微服务未来规划


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


image.png


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


Dubbo服务治理:

https://help.aliyun.com/document_detail/214749.html


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


image.png

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


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



相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
16天前
|
消息中间件 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【4月更文挑战第25天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。本文深入探讨了如何构建一个高效且可靠的微服务架构,包括关键的设计原则、技术选型以及实践中的挑战和应对策略。通过分析多个成功案例,我们总结了一系列最佳实践,并提出了一套可量化的性能优化方法。文章不仅为开发者提供了具体的技术指导,同时也强调了团队协作和持续学习在微服务转型过程中的重要性。
|
11天前
|
监控 Java 测试技术
现代化软件开发中的微服务架构设计与实践
随着软件开发的发展,传统的单体应用架构已经无法满足现代化应用的需求。微服务架构作为一种新的设计理念,为软件开发提供了更灵活、可扩展的解决方案。本文将介绍微服务架构的设计原则、实践方法以及相关技术工具,并结合实例展示其在现代化软件开发中的应用。
|
2天前
|
存储 监控 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第9天】 在本文中,我们将深入探讨如何在后端开发中构建一个高效的微服务架构。通过分析不同的设计模式和最佳实践,我们将展示如何提升系统的可扩展性、弹性和维护性。我们还将讨论微服务架构在处理复杂业务逻辑和高并发场景下的优势。最后,我们将分享一些实用的工具和技术,以帮助开发者实现这一目标。
|
2天前
|
监控 API 持续交付
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第8天】在当今快速演进的软件开发领域,微服务架构已经成为实现敏捷开发、持续交付和系统弹性的关键模式。本文将探讨构建一个高效且可靠的微服务系统所必须的策略和最佳实践。我们将从服务的划分与设计原则出发,讨论如何通过容器化、服务发现、API网关以及断路器模式来优化系统的可伸缩性和鲁棒性。此外,我们还将涉及监控、日志管理以及CI/CD流程在确保微服务架构稳定运行中的作用。
|
3天前
|
敏捷开发 持续交付 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第8天】 在数字化转型的浪潮中,微服务架构已成为企业追求敏捷开发、持续交付和系统弹性的关键解决方案。本文将深入探讨微服务的核心概念,包括其设计原则、优缺点以及如何在后端开发中实现高效的微服务架构。我们将通过实际案例分析,展示微服务如何帮助企业快速适应市场变化,同时保持系统的可维护性和扩展性。
|
5天前
|
监控 负载均衡 数据安全/隐私保护
探索微服务架构下的服务网格(Service Mesh)实践
【5月更文挑战第6天】 在现代软件工程的复杂多变的开发环境中,微服务架构已成为构建、部署和扩展应用的一种流行方式。随着微服务架构的普及,服务网格(Service Mesh)作为一种新兴技术范式,旨在提供一种透明且高效的方式来管理微服务间的通讯。本文将深入探讨服务网格的核心概念、它在微服务架构中的作用以及如何在实际项目中落地实施服务网格。通过剖析服务网格的关键组件及其与现有系统的协同工作方式,我们揭示了服务网格提高系统可观察性、安全性和可操作性的内在机制。此外,文章还将分享一些实践中的挑战和应对策略,为开发者和企业决策者提供实用的参考。
|
5天前
|
API 持续交付 开发者
构建高效微服务架构:策略与实践
【5月更文挑战第6天】随着现代软件系统的复杂性增加,微服务架构逐渐成为企业开发的首选模式。本文深入分析了构建高效微服务架构的关键策略,并提供了一套实践指南,帮助开发者在保证系统可伸缩性、灵活性和稳定性的前提下,优化后端服务的性能和可维护性。通过具体案例分析,本文将展示如何利用容器化、服务网格、API网关等技术手段,实现微服务的高可用和敏捷部署。
|
6天前
|
缓存 NoSQL Java
构建高性能微服务架构:Java后端的实践之路
【5月更文挑战第5天】在当今快速迭代和高并发需求的软件开发领域,微服务架构因其灵活性、可扩展性而受到青睐。本文将深入探讨如何在Java后端环境中构建一个高性能的微服务系统,涵盖关键的设计原则、常用的框架选择以及性能优化技巧。我们将重点讨论如何通过合理的服务划分、高效的数据存储策略、智能的缓存机制以及有效的负载均衡技术来提升整体系统的响应速度和处理能力。
|
6天前
|
监控 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第5天】 在当今快速发展的软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选模式。本文将探讨如何通过一系列经过验证的策略和最佳实践来构建一个高效且可靠的微服务系统。我们将深入分析微服务设计的核心原则,包括服务的细粒度划分、通信机制、数据一致性以及容错处理,并讨论如何利用现代技术栈来实现这些目标。文章将提供一套综合指南,旨在帮助开发者和架构师在保证系统性能的同时,确保系统的稳健性。
23 4
|
7天前
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
23 0