1.4 微服务架构的基础组件和关键要素
微服务架构的实现技术可以分为两类:一类是基础组件;另一类是关键要素。本节将对这两类组件做简要介绍。
1.4.1 微服务架构的基础组件
微服务架构的实现首先需要提供一系列基础组件,既包括事件驱动架构、集群与负载均衡、服务路由等分布式环境下的通用组件,又包括API网关和配置管理等微服务架构所特有的功能组件。
事件驱动架构(Event-Driven Architecture,EDA)定义了一个设计和实现应用系统的架构风格,在这个架构风格里事件可传输于松散耦合的组件和服务之间。事件处理架构的优势在于当系统中需要添加另一个业务逻辑来完成整个流程时,只需要对该事件添加一个订阅者即可,不需要对原有系统做大量修改。考虑到在微服务架构中服务数量较多且需要对服务进行重构,事件处理架构在系统扩展性上的优势尤为明显。而在技术实现上,通过消息传递机制,我们不必花费太大代价就能实现事件驱动架构。
集群(Cluster)指的是将几台服务器集中在一起,实现同一业务。而负载均衡(Load Balance)就是将请求分摊到位于集群中的多个服务器上进行执行。负载均衡根据服务器地址列表所存放的位置可以分成两类,一类是服务器端负载均衡,一类是客户端负载均衡。以各种负载均衡算法为基础的分发策略决定了负载均衡的效果。
在集群化环境中,当客户端请求到达集群,如何确定由某一台服务器进行请求响应就是服务路由(Routing)问题。从这个角度讲,负载均衡也是一种路由方案,但是负载均衡的出发点是提供服务分发而不是解决路由问题,常见的静态、动态负载均衡算法也无法实现精细化的路由管理。服务路由的管理可以归为几个大类,包括直接路由、间接路由和路由规则。
API网关本质上是一种外观模式(Facade Pattren)的具体实现,它是一种服务器端应用程序,并且是系统访问的唯一入口。API网关封装了系统内部架构,为每个客户端提供一个定制的API。同时,它可能还具有身份验证、监控、缓存、请求管理、静态响应处理等功能。在微服务架构中,API网关的核心要点是所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理通用的非业务功能。
在微服务架构中,一般都需要引入配置中心(Configuration Center)的相关工具。采用配置中心也就意味着采用集中式配置管理的设计思想。对于集中式配置中心而言,开发、测试和生产等不同的环境配置信息保存在统一存储媒介中,这是一个维度。而另一个维度就是分布式集群环境,需要确保集群中同一类服务的所有服务器保存同一份配置文件并且能够同步更新。
1.4.2 微服务架构的关键元素
在微服务架构中,还有一些实现上的关键要素需要考虑。基于服务注册中心的服务发布和订阅机制是微服务体系下实现服务治理的基本手段。同时,在保证服务的可靠性上,也需要考虑服务容错、服务隔离、服务限流和服务降级等需求和实现方案。
1. 服务注册中心
在微服务架构中,服务治理(Service Governance)可以说是最为关键的一个要素,因为各个微服务都需要通过服务治理实现自动化的注册(Registration)和发现(Discovery)。服务治理的需求来自服务的数量。在服务数量并不是太多的场景下,服务消费者获取服务提供者地址的基本思路是通过配置中心,当服务的消费者需要调用某个服务时,基于配置中心中存储的目标服务的具体地址构建链路完成调用。这是常见的路由方案,但并不是一种好的方案。为了实现微服务架构中的服务注册和发现,通常都需要构建一个独立的媒介来管理服务的实例,这个媒介一般被称为服务注册中心(Service Registration Center)。
注册中心应该具备发布-订阅功能,即服务提供者可以根据服务的元数据发布服务,服务消费者可以通过对自己感兴趣的服务进行订阅获取包括服务地址在内的各项元数据。发布-订阅的功能还体现在数据变更推送上,即当注册中心服务定义发生变化时,主动推送变更到该服务的消费者从而实现间接路由。由于服务提供者和服务消费者同时依赖于注册中心,这就需要确保数据一致性,即在任何时候服务提供者和消费者都应该看到同一份数据。作为发布-订阅模式的一种实现,注册中心的这些功能都是与该模式的基本原理保持一致的。
为了确保服务高可用性,一般也需要注册中心本身保持高可用性,也就意味着注册中心本身需要构建对等集群。所谓对等集群(Peer-to-peer Server Cluster),是指集群中所有的服务器都提供同样的服务,所以在对等集群中,客户端只要连接一个服务器完成服务注册和发现即可,任何一台服务器宕机都不影响客户端正常使用。
作为注册中心的客户端程序,一般会嵌入在服务提供者和服务消费者的应用程序中。在应用程序运行时,服务提供者的注册中心客户端程序会向注册中心注册自身提供的服务,而服务消费者的注册中心客户端程序则从注册中心查询当前订阅的服务信息并周期性地刷新服务状态。同时,为了提高服务路由的效率和容错性,服务消费者可以配备缓存机制以加速服务路由,更重要的是当服务注册中心不可用时,服务消费者可以利用本地缓存路由实现对现有服务的可靠调用。
2. 服务可靠性方案
在微服务架构中,各个服务独立部署且服务与服务之间存在相互依赖的关系。和单块系统相比,微服务架构中出现服务访问失败的原因和场景非常复杂,这需要从服务可靠性的角度出发对服务自身以及服务与服务之间的交互过程进行分析。
对于服务提供者而言,一旦自身服务发生错误,那么应该快速返回合理的处理结果;而对于服务消费者而言,则重点关注不要被服务提供者所产生的错误影响到自身服务的可用性。
对于服务的失败,常见的应对策略有超时(Timeout)机制和重试(Retry)机制两种。超时机制指的是调用服务的操作可以配置为执行超时,如果服务未能在这个时间内响应,将回复一个失败消息。同时,为了降低网络瞬态异常所造成的网络通信问题,可以使用重试机制。这两种方式都会产生同步等待,因此合理限制超时时间和重试次数是一般的做法。
当服务运行在一个集群中,出现通信链路故障、服务端超时以及业务异常等场景都会导致服务调用失败。容错(Fault Tolerance)机制的基本思想是冗余和重试,即当一个服务器出现问题时不妨试试其他服务器。集群的建立已经满足冗余的条件,而围绕如何进行重试就产生了Failover、Failback等几种常见的集群容错策略。
服务隔离(Isolation)包括一些常见的隔离思路以及特定的隔离实现技术框架。所谓隔离本质上是对系统或资源进行分割,从而实现当系统发生故障时能限定传播范围和影响范围,即发生故障后只有出问题的服务不可用,保证其他服务仍然可用。常见的隔离措施包括线程隔离、进程隔离、集群隔离、机房隔离和读写隔离等。
关于服务可靠性还有一个重要的概念——服务熔断(Circuit Breaker),服务熔断类似现实世界中的“保险丝”,当某个异常条件被触发就直接熔断整个服务,并不是一直等到此服务超时。而服务降级就是当某个服务熔断之后,服务端准备一个本地的回退(Fallback)方法,该方法返回一个默认值。