1.微服务架构演变历程 
注:从软件设计的角度上来说,SOA面向服务架构中的ESB 是一个抽象的间接层,提取了服务调用过程中调用与被调用动态交互中的一些共同的东西,减轻了服务调用者的负担。
SOA面向服务架构:
(1)特点:
- 基于SOA基于 SOA 的架构思想将重复公用的功能抽取为组件,以服务的形式给各系统提供服务。
- 各项目(系统)与服务之间采用 WebService、RPC 等方式进行通信。
- 使用 ESB 企业服务总线作为项目与服务之间通信的桥梁。
(2)优点
- 将重复的功能抽取为服务,提高开发效率,提高系统的可重用性、可维护性。
- 可以针对不同服务的特点制定集群及优化方案;
- 采用 ESB 减少系统中的接口耦合。
(3)缺点
-
系统与服务的界限模糊,不利于开发及维护。
-
虽然使用了 ESB,但是服务的接口协议不固定,种类繁多,不利于系统维护。
-
抽取的服务的粒度过大,系统与服务之间耦合性高。
-
涉及多种中间件,对开发人员技术栈要求高。
-
服务关系复杂,运维、测试部署困难
微服务架构:
微服务就是将一个单体架构的应用按业务划分为一个个的独立运行的程序即服务,它们之间通过 HTTP 协议进行通信(也可以采用消息队列来通信,如 RabbitMQ,Kafaka 等),可以采用不同的编程语言,使用不同的存储技术,自动化部署(如 Jenkins)减少人为控制,降低出错概率。微服务是一种架构风格,架构就是为了解耦,实际使用的是分布式系统开发。
(1)特点:
-
将系统服务层完全独立出来,并将服务层抽取为一个一个的微服务。
-
微服务中每一个服务都对应唯一的业务能力,遵循单一原则。
-
微服务之间采用 RESTful 等轻量协议传输。
(2)优点:
-
前后端分离:采用前后端分离开发,提供统一 Rest 接口,后端不用再为 PC、移动端开发不同接口;
-
数据库分离:每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库;
-
服务拆分粒度更细,有利于资源重复利用,提高开发效率;
-
一个团队的新成员能够更快投入生产;
-
可以更加精准的制定每个服务的优化方案(比如扩展),提高系统可维护性;
-
适用于互联网时代,产品迭代周期更短。
(3)缺点:
-
微服务过多,服务治理成本高,不利于系统维护;
-
分布式系统开发的技术成本高(网络问题、容错问题、调用关系、分布式事务等),对团队挑战大;
-
微服务将原来的函数式调用改为服务调用,不管是用 rpc,还是 http rest 方式,都会增大系统整体延迟。这个是再所难免的,这个就需要我们将原来的串行编程改为并发编程甚至异步编程,增加了技术门槛;
-
多服务运维难度,随着服务的增加,运维的压力也在增大;
-
测试的难度提升。服务和服务之间通过接口来交互,当接口有改变的时候,对所有的调用方都是有影响的,这时自动化测试就显得非常重要了,如果要靠人工一个个接口去测试,那工作量就太大了,所以 API 文档的管理尤为重要。
2.微服务设计原则
2.1 AKF拆分原则
理论上按照这三个扩展模式,可以将一个单体系统,进行无限扩展。
Y轴:微服务的拆分模式,就是基于不同的业务拆分,Y 轴扩展会将庞大的整体应用拆分为多个服务。
X轴:指得是水平复制,通过绝对平等地复制服务与数据,以解决容量和可用性的问题。很好理解,就是将单体系统多运行几个实例,成为集群加负载均衡的模式。
Z轴:通常是指基于请求者或用户独特的需求,进行系统划分,并使得划分出来的子系统是相互隔离但又是完整的。
2.2 前后端分离原则
- 前后端技术分离,可以由各自的专家来对各自的领域进行优化,这样前端的用户体验优化效果更好。
- 前后端分离模式下,前后端交互界面更清晰,就剩下了接口模型,后端的接口简洁明了,更容易维护。
- 前端多渠道集成场景更容易实现,后端服务无需变更,采用统一的数据和模型,可以支持多个前端:例如:微信 h5 前端、PC 前端、安卓前端、IOS 前端。
2.3 CAP 原则与 BASE 理论
CAP 原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
BASE 理论是对 CAP 中一致性和可用性权衡的结果,其来源于对大型互联网分布式实践的总结,是基于 CAP 定理逐步演化而来的。其核心思想是:
既然无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
3.微服务带来的问题
(1)客户端如何访问服务?
在后台 N 个服务和客户端之间一般会一个代理(API Gateway),作用如下:
-
提供统一服务入口,聚合接口使得服务对调用者透明,客户端与后端的耦合度降低
-
聚合后台服务,节省流量,提高性能,提升用户体验
-
提供安全、流控、过滤、缓存、计费、监控等 API 管理功能
(2)服务之间如何通信?
同步通信:
-
REST(JAX-RS,Spring Boot)
-
RPC(Dubbo,Thrift)
异步通信:
-
RabbitMQ,Kafka
总结:对外 Rest 对内 RPC 异步 MQ。
(3)这么多服务如何查找?
基本都是通过类似 ZooKeeper 等类似技术做服务注册信息的分布式管理。(注册中心)
(4)服务挂了怎么办?
解决方案大概可以分为以下几种:
-
请求缓存:支持将一个请求与返回结果做缓存处理;
-
请求合并:将相同的请求进行合并然后调用批处理接口;
-
请求限流:当请求过多时,可能会拖垮整个网站,通常会采取限流措施,降低机器的负载;
-
服务隔离:限制调用分布式服务的资源,某一个调用的服务出现问题不会影响其他服务调用;
-
服务熔断:牺牲局部服务,保全整体系统稳定性的措施;
-
服务降级:服务熔断以后,客户端调用自己本地方法返回缺省值。