3.3.3 具有代表性的微服务架构
ZeroC IceGrid、Spring Cloud、基于消息队列的微服务架构、Docker Swarm是微服务中较为常见的架构,下面对其进行一一介绍。
1. ZeroC IceGrid
ZeroC IceGrid是在RPC架构的基础上发展而来的一种微服务架构,它具有良好的性能与分布式能力,其整体示意图如图3-11所示。
图3-11 ZeroC IceGrid整体示意图
IceGrid域由注册表和任意数量的节点(Node)组成。注册表和节点一起协作管理组成应用程序的信息和服务器进程。每个应用程序将服务器分配给特定节点。注册表维护此信息的持久记录,而节点负责启动和监视其分配的服务器进程。在典型配置中,一个节点在托管Ice服务器的每台计算机上运行。注册表不会占用很多处理器时间,因此它通常与节点在同一台计算机上运行。实际上,如果需要,注册表和节点可以在同一进程中运行。如果需要容错,则注册表支持使用主从设计进行复制。下面对IceGrid的功能集及工作机制进行介绍。
1)定位服务
作为Ice定位服务的一种实现,IceGrid使客户能够间接绑定到它们的服务器上,使应用程序更灵活,更能适应不断变化的需求。其中,IceDiscovery是一种替代的轻量级位置服务实现,适用于不需要IceGrid附加功能的应用程序。
2)按需服务器激活
启动Ice服务器进程称为服务器激活。IceGrid可以按需激活服务器,也就是说,当客户端尝试访问服务器托管的对象时,激活通常作为间接绑定的副作用发生,并且对客户端完全透明。
3)应用分发
IceGrid提供了一种将应用程序分发到一组计算机上的便捷方式,无须共享文件系统或复杂的脚本,只需配置一个IcePatch 2服务器,让IceGrid下载必要的文件并保持同步。如图3-12所示为IcePatch 2的工作机制,IcePatch 2 server类似于FTP sever,用于存放要发布到每个Node上的二进制代码与配置文件,而位于每个Node上的IcePatch 2 client则从IcePatch 2 server上拉取文件,这个过程采用了压缩传输及差量传输等高级特性,以减少不必要的文件传输过程。
图3-12 IcePatch 2的工作机制
4)复制和负载平衡
IceGrid通过将多个服务器的对象适配器分组到一个虚拟对象适配器中来支持复制。在间接绑定期间,客户端可以绑定到任何适配器的端点上。此外,IceGrid监视每台计算机上的负载,并可以使用该信息来决定将哪些端点返回给客户端。
5)会话和资源分配
IceGrid客户端建立会话以分配诸如对象或服务器之类的资源。IceGrid阻止其他客户端使用该资源,直到客户端释放它或会话到期。会话通过使用可与Glacier2路由器集成的身份验证机制来增强安全性。
6)自动故障转移
Ice支持在包含多个端点的任何代理中自动重试请求和故障转移。结合IceGrid对复制和负载平衡的支持,自动故障转移意味着失败的请求会导致客户端在下一个负载最低的端点上透明地重试请求。
7)动态查询
除透明绑定外,应用程序还可以直接与IceGrid交互,以多种方式定位对象。
8)状态监测
IceGrid支持Slice接口,允许应用程序监视其活动并接收有关重要事件的通知,支持开发自定义工具或将IceGrid状态事件集成到现有管理框架中。
9)管理
IceGrid包括命令行和图形管理工具。它们可在所有支持的平台上使用,并允许启动、停止、监视和重新配置由IceGrid管理的任何服务器。
10)部署
在IceGrid里,一个IceBox是一个单独的进程。其使用XML文件来进行自身的服务注册,相关设计人员可以描述要在每台计算机上独立部署的服务器。这种使用模板的方式简化了相同服务器的描述。其使用的服务注册中心是Ice Register,这是一个独立的进程,并且提供了HA高可用机制。
2. Spring Cloud
Spring框架提供了一组用于在Java中创建微服务的库,它们是Spring Cloud项目的一部分。Spring Cloud是基于Spring Boot的一整套实现微服务的框架,因此它只能采用Java语言,这是它与其他几个微服务框架的最明显区别,如图3-13所示为Spring Cloud示意图。
图3-13 Spring Cloud示意图
该架构通过自动配置Spring环境及其他Spring编程模型为Spring Boot应用程序提供Netflix OSS集成。通过一些简单的注释,可以快速启用和配置应用程序内的常见模式,并使用Netflix组件构建大型分布式系统。因此,Spring Cloud也被称为Spring Cloud Netflix。它提供的模式包括服务发现(Eureka)、断路器(Hystrix)等。
(1)服务发现:可以注册Eureka实例,客户端可以使用Spring管理的bean发现实例,而且可以使用声明性Java配置创建嵌入式Eureka服务器。Eureka提供服务注册中心、服务发现的客户端,还有一个简单的管理界面,所有服务使用Eureka的服务发现客户端来将自己注册到Eureka中。
(2)断路器:在Spring Cloud中使用了Hystrix来实现断路器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离、请求缓存和请求打包,以及监控和配置等功能。
(3)声明性REST客户端:声明一个REST客户端来完成远程服务的调用,Feign会动态实现由JAX-RS或Spring MVC注解装饰的接口,其主要用途是简化服务之间的相互调用。
(4)外部配置:从Spring Environment到Archaius的桥接(使用Spring Boot约定启用Netflix组件的本机配置)。
(5)路由器和过滤器:Zuul过滤器的自动注册,以及反向代理创建的配置方法的简单约定。Zuul类似一个Nginx的服务网关,所有客户端请求都通过这个网关来访问后台的服务。如图3-14所示为一个Zuul类。由于Spring Cloud的微服务接口主要是基于REST协议实现的,因此它采用了传统的HTTP Proxy机制。
图3-14 一个Zuul类
(6)客户端负载均衡:Zuul从Eureka那里获取服务信息,自动完成路由规则的映射,无须手工配置。当Zuul转发请求到某个指定的微服务上时,会采用类似ZeroC IceGrid的客户端负载均衡机制,称为Ribbon组件。如图3-15所示为Zuul与Eureka的关系及实现服务负载均衡的示意图。
图3-15 Zuul与Eureka的关系及实现服务负载均衡的示意图
(7)基于Spring Security的OAuth:解决服务安全问题。
(8)监控用Dashboard:可以简化运维相关的开发工作。
这些常用的技术与功能模块共同构成了Spring Cloud微服务架构平台的全景图,如图3-16所示。
图3-16 Spring Cloud微服务架构平台的全景图
3. 基于消息队列的微服务架构
在微服务架构中,不是所有微服务都可以基于同步REST模型的,即请求一旦进入就立即提供服务,并再次发送。对许多类型的服务而言,这种通信方式很好,但是对于某些类型的服务,能够在很短的时间内做出响应是不切实际的。例如,在一个每秒处理1000个请求的系统中,这种基于同步的通信方式是不可行的,所以在这种情况下,需要一个异步模型,它通过请求排队和客户端轮询的方式解决问题,即基于消息队列的微服务架构,这种架构下的微服务采用发送消息(Publish Message)与监听消息(Subscribe Message)的方式来实现彼此之间的交互。如图3-17所示是基于消息队列的各组件之间的交互示意图,其中,消息中间件是关键,它负责连通各微服务与UI组件,承担了整个系统互联互通的重任。
图3-17 基于消息队列的各组件之间的交互示意图
基于消息队列的通信方式十分适用于微服务架构中的某些场景。例如,有一个电子商务应用程序,用户购买各种商品,他们获得了该电商提供的积分或优惠券。电商在这些用户下订单后,对他们所购商品进行审核,每6个月检查一次用户活动并更新其会员级别、积分或优惠券。现在需要将这些详细信息发送给用户,电商通过两个步骤来告知用户,第一步是计算这些属性,第二步是通过邮件、短信、推送向用户发送通知。有两种处理方法,第一种是休息同步模型,电商可以在其中对消息传递服务进行外部调用并等待响应;第二种是基于消息传递的异步模型。
第一种方法存在相当大的问题,由于存在大量请求,电商可能无法在非常短的时间内响应,并且对于每个请求,同步进行外部调用会阻止当前线程,直到其从外部获得响应服务。同时,由于不确定消息传递服务的外部依赖性,会导致外部服务中断的情况。如果使用第二种方法,它会将这些事件推送到队列中,并回复给用户。该种方式还允许多个接收器异步处理这些消息,并提高性能。当在多个节点上运行时,其可以提供高可用性的结果。因此,消费者/接收者可以从队列中读取消息,并进行异步处理,不会出现第一种方法所产生的问题,并且该种方式还提供微服务之间的松耦合。
4. Docker Swarm
在Docker Swarm中,有以下3个概念需要介绍。
(1)节点:节点是参与群集的Docker引擎的实例。从技术上讲,可将其视为拥有自己的CPU资源、内存和网络接口的主机,它可以是管理器节点或工作节点。
(2)服务:服务是由容器映像定义的在工作节点上执行的内容,以及指示容器执行的命令。服务可以是局部的,也可以是全局的。服务可以让容器形成一个逻辑“服务”,可以通过名称访问整个群集,也可以在群集外部,而无须了解有关环境内部网络拓扑的任何信息。
(3)任务(如容器):Docker Swarm将任务视为Docker容器。Docker文档将任务定义为“携带Docker容器和在容器内运行的命令”。管理器节点将给定的容器映像的任务分配给工作节点,其中容器映像在服务中被指定。
这些节点、服务和任务形成了Docker Swarm集群,Swarm集群的结构图如图3-18所示。
图3-18 Swarm集群的结构图
Docker Swarm同时也存在一定的特征,具体如下。
(1)Docker Swarm非常易于创建,可以在几分钟内完成设置。易于扩展,任何新机器只需要一个令牌即可成为工作节点或管理器节点;
(2)扩展服务非常容易,通过Docker命令行“docker scale service<servicename>=3”即可创建3个Docker容器实例,如图3-19所示为用Docker命令行创建Swarm集群;
图3-19 用Docker命令行创建Swarm集群
(3)其开源和社区版本在生产中也很有效,从而为小型企业节省了大量资金。