作者 | 王莹、万佳
近十年来,微服务架构不断演进,成为当下最火热的后端架构之一。相比传统的单体架构,微服务架构具有灵活、可扩展、独立部署的特性,更有利于开发者管理和维护代码,快速提高研发交付效率。为构建更加灵活敏捷的系统和促进业务发展,许多企业纷纷将业务迁移到微服务架构。
火热的微服务
2022 年 O'Reilly 技术趋势报告显示:微服务是 2021 年使用量最大的三个技术之一,去年同比增长 13%。同时,报告也发现,企业正大力转型微服务架构,构建云原生应用,充分利用微服务和 Kubernetes 的技术优势。
图片来源:2022 年 O'Reilly 技术趋势报告 https://www.oreilly.com/radar/technology-trends-for-2022/
众所周知,相比单体应用,微服务的优势在于敏捷,快速迭代。可独立部署的小型服务,加上敏捷开发模式的加持,可以实现产品功能快速迭代。同时,微服务可以大幅降低协作成本,这不仅降低了团队内外的沟通协作成本,而且大大提升沟通效率。
此外,微服务扩展灵活,由于每个服务单独部署,所以每个服务可以单独复制和扩展,这样既提高了资源利用率,也更节省成本。
微服务落地过程
如何落地微服务,笔者从微服务的生命周期,总结出一个路线图,帮助开发者更加清晰的了解微服务的落地过程。
前期调研
首先,需要调研微服务架构是否适合当前的业务。不要人云亦云,盲目跟风。从单体架构到微服务的过渡需要一个过程,基础设施的变更需要付出时间、人力和金钱成本,工作量需要团队和各方资源的支持。
其次,建立微服务团队。每个微服务本身都是一个独立的应用程序,因此团队也应该这样做。组建单独的团队来处理不同的业务。这也要求这些团队拥有必要的技能和工具来自行开发、部署和管理微服务,团队间要保持高效的沟通和协作。
设计阶段
在这个阶段,开发者需要重点关注微服务如何拆分的问题。将微服务与业务功能区分开来,避免构建太大或太小的微服务。如果发生前者,您将看不到使用微服务架构的任何好处。后者将导致运营成本呈指数增长,超过预期收益。
将服务设计为松耦合、高内聚、并覆盖单个有界上下文。松耦合的服务对其他服务的依赖程度最低。高内聚要求服务的设计遵循单一职责原则,即只执行一个主要功能。最后,设计服务在某个特定的业务层,同时包含业务的内部细节逻辑。这可确保微服务覆盖单一边界上下文,从而实现领域驱动设计 (DDD)。
使用 API 和事件在服务之间进行通信。服务不应直接相互调用,相反,设计一个 API 网关来处理身份验证、请求和响应以及对服务限制。有了 API 网关,用户可以在服务发生更改时,轻松地将流量从 API 网关重定向到更新的版本中。
技术选型
当用户从单体应用重构微服务架构时,会面临多个微服务技术框架 / 组件的选型。目前,Spring Cloud 等框架、服务网格是微服务领域两类重要的技术选型,两类方案各有各的优缺点和适用场景,用户可根据自己的业务需求选择适合框架即可。
微服务框架
Spring Cloud、Dubbo 等微服务框架在中小型项目中的应用,用户不需要太多改造和适配,即可实现微服务的基本功能,其优点在于:去中心化,服务间的通信及容错机制模块化,将非功能性能力下沉,集成了各个微服务组件,提供完整的微服务能力。相比于服务网格,性能损耗小,非常适用于性能要求较高的应用。缺点在于:框架的使用语言有限,目前 Java 框架比较成熟,近期 Go 语言框架蓬勃发展。整体对业务存在一定的侵入性,框架的维护升级成本高。
服务网格
服务网格是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证请求在这些拓扑中可靠地穿梭。在实际应用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但对应用程序透明。其优点在于:屏蔽分布式系统通信的复杂性 (负载均衡、服务发现、认证授权、监控追踪、流量控制等等),服务只用关注业务逻辑;适用于多种语言,利于异构多语言应用构建统一、标准化的服务治理体系;对应用透明,Service Mesh 组件可以单独升级;其缺点在于:由于服务间通信加了一层代理,一定程度上存在性能损耗,引入 Service Mesh 服务实例的运维和管理困难等问题。
支撑端组件
在微服务架构中,支撑端组件的选型也非常重要。其中,注册中心是最核心的基础服务之一,注册中心可以看做是微服务架构里的通信中心,当一个服务去请求另一个服务时,通过注册中心可以获取该服务的状态、地址等核心信息,因此,注册中心的数据一致性和高可用的能力非常重要,下面是业内主流注册中心的对比:
Apollo、Nacos 为目前国内主流的配置中心产品,功能完善、社区活跃度高,由于 Apollo 只包含配置中心能力,Nacos 既包含配置中心又包含注册中心能力,所以仅对比配置中心,Apollo 整体产品能力强于 Nacos,但整体复杂度略高于 Nacos。Zookeeper/Consul 只包含核心的推送数据能力,需要针对配置中心场景二次封装,例如较早开源的产品 disconf(已停止维护)。所以不建议裸用 Zookeeper/Consul 作为配置中心。Spring Cloud Config 是 Spring Cloud 中动态配置解决方案,仅适用于 Java 生态,且由于使用成本高,在国内使用度低。
开发态
在开发阶段,用户聚焦业务开发,可以通过脚手架、低代码等工具快速的构建业务代码,提升研发交付效率。做好各个服务的版本管理,每个服务都应该有自己的存储库,以便访问配置。同时保持清晰的版本更新日志,以便后期查看。
运维态
运维态重点需要关注应用的发布和部署,用户可以通过持续集成和持续交付 (CI/CD) 来自动化 DevOps 工作流,实现一键部署,提高发布和部署效率。而微服务架构中,服务的数量在服务拆分后变得繁多杂乱,发布部署管理起来相对麻烦,需要加强灰度发布、蓝绿发布、滚动发布、快速回滚的能力建设,避免新版本发布时服务需要中断、新版本升级失败无法快速回滚带来更长时间服务不可以等问题。
运行态
在运行态,主要包括服务的可观测性、异常处理、优雅上下线、服务治理等方面的内容。服务在运行过程中,需要关注其运行的健康状态。高流量的服务请求,服务治理、服务的注册与发现、服务限流、服务熔断等能力是服务健康运行的保障。在可观测性上,需要建设可视化的数据监控能力,帮助用户快速高效的排查定位问题,建设异常处理机制,方便快速响应异常处理请求。
如何高效构建微服务
在了解过微服务的落地路径后,我们再来看看如何高效、快速地落地微服务。基于分层设计的思想,可以将微服务生命周期中的几个阶段统一划分为两层:业务层和支撑端层,将业务逻辑与技术相互隔离,各层分别高效构建,相互协作。
在业务层,用户只需专注业务本身,包括服务的开发、敏捷部署、服务可观测性、异常处理、优雅上下线、服务治理等;在支撑端层,提供微服务生命周期用到的支撑组件,聚焦为业务层提供高可用、高性能的技术支撑。作为国内三大云厂商之一,腾讯云也针对这两层布局了完整的产品矩阵:弹性微服务 TEM(Tencent Cloud Elastic Microservice,TEM)和微服务引擎 TSE(Tencent Cloud Service Engine,TSE)。
弹性微服务 TEM 主要解决业务层应用场景,是新一代面向微服务应用的 Serverless 平台,实现 Serverless 与微服务的完美结合,提供应用的全生命周期托管,并联动上下游产品为用户服务注册发现、微服务治理、多维度监控等能力。
微服务引擎 TSE 主要解决支撑端层的应用场景,一套灵活、轻量级、可插拔的组件化微服务解决方案,为用户提供高可用、免运维、开源增强的注册配置中心、服务治理、云原生网关组件服务,让用户只需关注上层业务开发,帮助用户在云原生时代轻量上云,快速构建微服务体系,提高研发交付效率和运维效率,同时为用户降低人力资源成本。
微服务引擎,加速落地微服务
微服务引擎 TSE 在功能上主要提供注册配置中心、服务治理中心、云原生网关三大能力。其中,注册配置中心,微服务引擎 TSE 提供高可用、免运维、开源增强的 ZooKeeper、Nacos 、Apollo 、Eureka 组件,用户可以灵活使用,即开即用,零代码改造。而服务治理中心,微服务引擎 TSE 基于腾讯的开源项目北极星 PolarisMesh,提供强大的服务治理能力,为用户解决服务寻址、流量调度、故障容错、访问控制和可观测性等问题,并针对虚拟机和容器环境两个体系的服务,提供一体化的服务发现和治理方案。
在落地上,主要有四大应用场景:
- 微服务注册发现:它提供 ZooKeeper、Nacos、Eureka 注册配置中心。并提供多指标的监控管理,帮助用户实现高效、稳定和高可用的服务注册发现能力。
- 微服务治理:在服务治理场景中,提供服务调用中的注册发现、流量控制、熔断限流等能力,支持多语言客户端、集成多种主流服务框架,帮助用户实现高效、稳定、高可用、免运维的服务治理能力。
- 分布式配置:分布式配置是将分布式应用配置的集中管理,它提供配置热生效、记录配置变更操作的分布式应用配置集中管理能力,原生数据无缝迁移,支持主流的 Apollo、Nacos 配置中心,帮助用户高效解决分布式环境下的配置管理问题。
- 云原生网关:云原生网关是基于开源网关 Kong 构建的的高可用、易扩展的 API 网关,云原生网关作为承载所有请求的流量入口,除提供高性能低延迟的转发能力外,还基于插件体系提供认证鉴权、流量控制、灰度发布、熔断降级等高级流量治理能力,是微服务体系中不可或缺的一部分。
据悉,腾讯云微服务引擎 TSE 有六大特点:
- 一键部署:微服务引擎提供一键式开箱即用的微服务注册、配置中心托管能力,用户无需关注资源部署;
- 免运维:微服务引擎可以保证托管引擎后端的健康运行,用户无需投入人力运维相关组件,只需专注自身业务实现;
- 高可用容灾:微服务引擎提供多可用区部署、健康探测、自动恢复等能力,实现高可用容灾;
- 无缝迁移:微服务引擎托管引擎使用方式与开源框架完全一致,用户可零代码改造,实现无缝迁移;
- 灵活扩容:微服务引擎提供一键扩容的能力,用户可根据业务增长情况,轻易完成扩容与升级;
- 低成本:微服务引擎优化了托管服务的部署方式,让用户在免运维使用微服务引擎时,获得更低的单位时间使用成本。
值得一提的是,微服务引擎 TSE 的服务治理中心,基于腾讯去年正式开源的微服务解决方案“北极星”(PolarisMesh),通过北极星对这些组件进行抽象和整合,打造公司标准化的服务发现和治理方案,帮助业界提升研发效率和运维效率。截至 2021 年 9 月,北极星在线节点超过 5000000 个,每日服务调用量超过 30 万亿,接口的调用成功率超过 99.999%,覆盖腾讯内部 90% 以上的业务部门。
此外,北极星的服务治理方案也被越来越多的公司所采用,比如好未来。据悉,好未来 AI 中台服务发现已采用北极星。此前,其 AI 中台具有上万服务节点,基于 Eureka 实现服务发现。但由于架构的局限,Eureka 无法实现平行扩展,在上万服务节点注册和上报心跳的情况下,经常出现高负载,导致服务节点状态异常。为此,好未来将服务注册中心升级成北极星。由于北极星服务端采用计算存储分离的架构,计算层可随接入节点的增加平行扩展,轻松支持百万节点。同时,北极星兼容 Eureka 服务端接口,支持无缝切换。
文章参考文献:
https://mp.weixin.qq.com/s__biz=MjM5MDE0Mjc4MA==&mid=2651087824&idx=2&sn=bd9ab0f76e8d1aa82a7b6a2fcd7dc686
https://www.oreilly.com/radar/technology-trends-for-2022/
https://www.bmc.com/blogs/microservices-best-practices/
https://blog.csdn.net/fly910905/article/details/100023415