微服务架构概述
微服务架构将一个大型的单个应用或服务拆分成多个微服务,可扩展单个组件而不是整个应用程序堆栈,从而满足服务等级协议。微服务架构围绕业务领域将服
务进行拆分,每个服务可以独立进行开发、管理和迭代,彼此之间使用统一接口进行交流,实现了在分散组件中的部署、管理与服务功能,使产品交付变得更加简单,
从而达到有效拆分应用,实现敏捷开发与部署的目的。

微服务项目分层的三层架构 微服务架构拆分_数据库

1.1 复杂应用解耦
微服务架构将单一模块应用分解为多个微服务,同时保持总体功能不变。应用按照业务逻辑被分解为多个可
管理的分支或服务,避免了复杂度的不断积累。每个服务专注于单一功能,通过良好的接口清晰表述服务边界。由
于功能单一、复杂度低,小规模开发团队完全能够掌握,易于保持较高的开发效率,且易于维护。
1.2 独立
微服务在系统软件生命周期中是独立开发、测试及部署的。微服务具备独立的运行进程,每个微服务可进行独
立开发与部署,因此在大型企业互联网系统中,当某个微服务发生变更时无需编译、部署整个系统应用。从测试角
度来看,每个微服务具备独立的测试机制,测试过程中不需要建立大范围的回归测试,不用担心测试破坏系统其它
功能。因此,微服务组成的系统应用具备一系列可并行的发布流程,使得开发、测试、部署更加高效,同时降低了因
系统变更给生产环境造成的风险。
1.3 技术选型灵活
微服务架构下系统应用的技术选型是去中心化的,每个开发团队可根据自身应用的业务需求发展状况选择适
合的体系架构与技术,从而更方便地根据实际业务情况获得系统应用最佳解决方案,并且每个微服务功能单一、
结构简单,在架构转型或技术栈升级时面临风险较低,因此系统应用不会被长期限制在某个体系架构或技术栈上。
1.4 容错
在传统单体应用架构下,当某一模块发生故障时,该故障极有可能在整个应用内扩散,造成全局应用系统瘫
痪。然而,在微服务架构下,由于各个微服务相互独立,故障会被隔离在单个服务中,并且系统其它微服务可通过重
试、平稳退化等机制实现应用层的容错,从而提高系统应用的容错性。微服务架构良好的容错机制可避免出现单
个服务故障导致整个系统瘫痪的情况。
1.5 松耦合,易扩展
传统单体应用架构通过将整个应用完整地复制到不同节点,从而实现横向扩展。但当系统应用的不同组件在
扩展需求上存在差异时,会导致系统应用的水平扩展成本很高。微服务架构中每个服务之间都是松耦合的,可以根
据实际需求实现独立扩展,体现了微服务架构的灵活性。

理微服务器也有自己独立的缓存和数据库。分支微服务器模式是聚合器微服务模式的一种扩展,在分支微服务器
模式下,客户端或服务允许同时调用两个不同的微服务链。两个微服务调用链相互独立,互不影响。
2.2 链式微服务
客户端或服务在收到请求后,会返回一个经过合并处理的响应,该模式即为链式微服务设计模式。例如,服务 A
收到请求后会与服务 B 建立通信,服务 B 收到请求后会与服务 C 建立通信,依次往下游发送请求,并将结果进行合
并处理后作为请求响应返回上游服务调用者。显然,该模式下的所有服务调用都采用同步消息传递方式,在一条完
整的服务链调用完成之前,客户端或调用服务会一直阻塞。因此,在使用该模式过程中,服务调用链不宜过长,以
避免客户端处于长时间等待状态。
2.3 数据共享微服务
运用微服务架构重构现有单体架构应用时,SQL 数据库反规范化可能会导致数据重复与不一致现象。按照微
服务的自治设计原则,在单体架构应用到微服务架构的过渡阶段,可以使用数据共享微服务设计模式。在该模式
下,当服务之间存在强耦合关系时,可能存在多个微服务共享缓存与数据库存储的现象。
2.4 异步消息传递微服务
目 前 流 行 开 发 RESTful风 格 的 API,REST 使 用HTTP 协议控制资源,并通过 URL 加以实现。REST 提供
了一系列架构系统参数作为整体使用,强调组件的独立部署、组件交互的扩展性,以及接口的通用性,并且尽量减少
产生交互延迟的中间件数量。但是 REST 设计模式是同步的,容易造成阻塞,从而耗费大量时间。消息队列将消息
写入一个消息队列中,实现业务逻辑以异步方式运行,从而加快系统响应速度。因此,对于一些不必要以同步方式
运行的业务逻辑,可以使用消息队列代替 REST 实现请求、响应,加快服务调用的响应速度。但该模式可能会降低系
统可用性,并增加系统复杂性,因而在使用过程中,要做好消息队列的选型。常用消息队列有 ActiveMQ、RabbitMQ、
RocketMQ、Kafka 等。

3 微服务架构面临问题与挑战
微服务架构在规模较大的应用中具有明显优势,但其优势也是有代价的,微服务架构也会给人们带来新的问题
和挑战。其中一个主要缺点是微服务架构分布式特点带来的复杂性,开发过程中,需要基于 RPC
或消息实现微服务之间的调用与通信,使服务发现与服务调用链跟踪变得困难。另一个挑战是微服务架构的分区数据库体系,不
同服务拥有不同数据库。受限于 CAP 原理的约束以及采用的 NoSQL 数据库的高扩展性,使人们不得不放弃传
统数据库的强一致性,转而追求最终一致性,因此对开发人员提出了更高要求。微服务架构给系统测试也带来了很大挑战,微服务架构可能涉及多个服务,传统的单体
Web 应用只需测试单一 API 即可,然而对于微服务架构测试,需要启动其依赖的所有服务,该复杂性不可低估。在大规模应用部署中,在监控、管理、分发及扩容等方面,微
服务也存在着巨大挑战。因此,对于微服务架构的取舍,要考虑企业开发团队规模、业务需求变化以及系统用户群体规模等诸多因素。
使用微服务架构主要是为了降低应用程序开发、维护等方面的复杂性,如果系统程序架构已无法再扩展,或数据库
增长速度过快,并且整个团队(包括产品、设计、研发、测试、运维)都具备微服务思维,采用微服务架构的收益会大于成本。但如果系统现有程序架构还能很好地工作,不需
要有太大改动,采用微服务架构则不会有太多收益。综上所述,尽管微服务架构有很多优势,在使用微服务架构之前还是要结合系统自身特点,综合评估以后再决定是否采用微服务架构。