一文读懂微服务架构

2022-04-28

216

微服务架构概述

微服务架构风格是一类将单一应用程序作为由众多小型服务构成之套件加以开发的方式,其中各项服务都拥有自己的进程并利用轻量化机制(通常为HTTP源API)实现通信。这些服务围绕业务功能建立而成,且凭借自动化部署机制实现独立部署。

微服务的特点

应用程序逻辑分为明确定义的职责范围的粒度组件,这些组件相互协调提供解决方案

每一个组件都有一个小的职责领域,可以完全部署,也就是说一个服务可以跨越多个应用程序复用(独立部署和维护)

服务之间通信基于一些基本的原则,比如服务采用http+json这样的轻量级通信协议,在不同服务之间进行数据交换。这样不同服务可以使用不同的技术栈,互不影响(采用轻量级的通信协议作为通信原则、松耦合)

拆分为微服务之后,服务的数量变多,因此需要有统一的服务治理平台,来对各个服务进行管理。(服务可治理,可管控)

微服务结构的通用性

通过服务实现应用的组件化(按功能拆分、可独立部署和维护)

围绕业务能力组织服务,根据业务不同的需求进行不同组件的使用

所做产品非项目化,对于平台具有一定的通用性

微服务的缺点

运营成本的增加,整体应用可能只需部署至一小片应用服务区集群,而微服务架构可能变成需要构建/测试/部署/运行数十个独立的服务,并可能需要支持多种语言和环境。这导致一个整体式系统如果由20个微服务组成,可能需要40~60个进程。

开发人员需要熟知运维与投产环境,开发人员也需要掌握必要的数据存储技术如NoSQL,具有较强DevOps技能的人员比较稀缺,会带来招聘人才方面的挑战。

把系统分为多个协作组件后会产生新的接口,这意味着简单的交叉变化可能需要改变许多组件,并需协调一起发布。在实际环境中,一个新品发布可能被迫同时发布大量服务,由于集成点的大量增加,微服务架构会有更高的发布风险。

某些底层功能需要被多个服务所用,为了避免将“同步耦合引入到系统中”,有时需要向不同服务添加一些代码,这就会导致代码重复。

作为一种分布式系统,微服务引入了复杂性和其他若干问题,例如网络延迟、容错性、消息序列化、不可靠的网络、异步机制、版本化、差异化的工作负载等,开发人员需要考虑以上的分布式系统问题。

在动态环境下服务间的交互会产生非常微妙的行为,难以可视化及全面测试。经典微服务往往不太重视测试,更多的是通过监控发现生产环境的异常,进而快速回滚或采取其他必要的行动。但对于特别在意风险规避监管或投产环境错误会产生显著影响的场景下需要特别注意。

微服务架构设计过程中需要注意的点

服务划分过细,服务间关系复杂

服务数量太多,团队效率急剧下降

调用链太长,性能下降

调用链太长,问题定位困难

没有自动化支撑,无法快速交付(自动化测试、自动化部署、自动化监控等)

没有服务治理,微服务数量多了后管理混乱(服务路由、服务故障隔离、服务注册与发现等等)

服务之间的配置以来关系

微服务的拆分

服务粒度的划分是伴随着架构演进进行的,需要考虑当前的人力、物力等来有效的统筹,在项目的初期可以把服务的粒度设计大一点,随着项目的不断壮大,团队的规模不断变大,可以对现有的粗粒度服务进行有效的拆分,逐步的向细粒度服务发展。 

基于业务逻辑进行拆分

这是最常见的一种拆分方式,将系统中的业务模块按照职责范围识别出来,每个单独的业务模块拆分为一个独立的服务。基于业务逻辑拆分虽然看起来很直观,但在实践过程中最常见的一个问题就是团队成员对于“职责范围”的理解差异很大,因此根据业务拆分需要权衡当前项目组的情况。

基于可扩展拆分

将系统中的业务模块按照稳定性排序,将已经成熟和改动不大的服务拆分为稳定服务,将经常变化和迭代的服务拆分为变动服务。稳定的服务粒度可以粗一些,即使逻辑上没有强关联的服务,也可以放在同一个子系统中,例如将“日志服务”和“升级服务”放在同一个子系统中;不稳定的服务粒度可以细一些,但也不要太细,始终记住要控制服务的总数量。这样拆分主要是为了提升项目快速迭代的效率,避免在开发的时候,不小心影响了已有的成熟功能导致线上问题。

基于可靠性拆分

将系统中的业务模块按照优先级排序,将可靠性要求高的核心服务和可靠性要求低的非核心服务拆分开来,然后重点保证核心服务的高可用。这样拆分带来下面几个好处:(避免非核心服务故障影响核心服务、核心服务高可用方案可以更简单、能够降低高可用成本)

基于性能拆分

基于性能拆分和基于可靠性拆分类似,将性能要求高或者性能压力大的模块拆分出来,避免性能压力大的服务影响其他服务。常见的拆分方式和具体的性能瓶颈有关,可以拆分 Web 服务、数据库、缓存等。

使用SpringBoot和SpringCloud构建微服务

在基于java的应用程序构建中,spring已经成为事实上的标准开发框架,spring框架迷人的地方就是能够与时俱进的进行自我改造。随着发展,spring团队不仅开发出了单体应用程序模型,还转向了高度分布式的模型,使服务能够轻松的部署到云端,典型代表就是springboot和springcloud。

springboot是对spring框架理念的重新思考,虽然springboot包含了spring的核心特性,但是它剥离了spring中的许多企业特性,而是提供一个基于java的、面向REST的微服务框架,只是需要简单的注解,java开发者就能快速构建一个可打包和部署的REST微服务。

springcloud框架使实施和部署微服务到私有云或者公有云变得更加简单,springcloud在一个公共框架之下封装了许多流行的云管理微服务框架,并且让这些技术的使用和部署像为代码添加注解一样简单。


------------------------------------------------------

SolarMesh(服务网格产品):高效可视化微服务治理平台

技术交流
我们建了一个云原生技术交流群,其中有来自Oracle、Citrix、华为、腾讯等国内外云计算专家,立即扫码,拉你进群。目前已有1000+开发者加入我们......
云原生厂商 云原生技术服务商
在云原生时代,行云创新致力于通过赋能开发者,实现企业快速迭代与交付,大幅提升创新效率。
免费试用