3 微服务治理框架Spring Cloud
上一篇介绍了服务治理相关背景、概念及服务治理的内容和目标,及相关技术栈,本篇主要介绍服务治理框架Spring Cloud框架。
3.1 微框架Spring Boot
Spring框架是一个轻量级开源的容器框架,最初是由Rod Johnson提出,其本质是为了解决传统Java企业级应用开发中的复杂性问题。Spring框架引入了组件化的思想,采用依赖注入和面向切面编程等技术,解耦对象间的依赖关系,降低应用开发中的复杂性,快速实现企业级应用。早期的Spring框架基于XML的配置方式管理Bean,随着业务的增加,XML配置变得越来越臃肿,依赖关系也变得错综复杂,导致开发效率低下,使得应用更加难以维护和管理。
面对Spring框架XML配置和依赖管理的复杂性问题,Spring Boot应运而生。Spring Boot是基于Spring4搭建的微框架,其宗旨是为了简化Java企业级应用开发。Spring Boot遵循“约定优于配置”的思想,通过自动化配置简化现有Spring框架中XML复杂的配置和依赖关系管理。使用Spring Boot创建应用,其优点如下:
(1)为基于Spring的开发提供方便快捷的入门体验。
(2)开箱即用,可以更快更方便的与第三方应用、常用的组件整合及使用。
(3)自动装配,提供第三方库默认配置,也可以通过修改默认值满足特定的需求。
(4)提供了非功能性特征,如嵌入式服务器、安全性、健康检查、外部化配置等。
(5)零配置,无多余的代码生成和XML配置。
(6)简单,使编码、配置、部署及监控变得更简单,提高了开发、部署效率。
Spring Boot继承了Spring框架的核心特性及相关扩展功能,简化了对Spring已有技术的使用,无须繁杂配置即可快速构建应用程序。Spring Boot是开发单一服务框架的基础,Spring Cloud也建立于Spring Boot框架基础上,利用Spring Boot的开发便捷性简化了微服务基础设施的开发,提供了一套微服务开发工具包,用于增强基于Spring Boot创建的应用程序。图3-1展示了Spring Boot与这些框架之间的关系。
图3-1 Spring与其他框架之间的关系
3.2 服务注册发现Eureka
Eureka是Netflix 开源的服务注册发现组件,也是Spring Cloud的重要组件。Spring Cloud对Netflix Eureka模块进行了封装,用于实现服务注册与发现。Eureka本身是一个基于REST的服务,包括两个组件:Eureka Server和Eureka Client。Eureka Server也称为服务注册中心,支持集群模式部署,每个服务端都可以作为对方的客户端进行相互注册与发现;Eureka Client既可以作为服务提供者,也可以作为服务调用者存在,负责处理服务的注册与发现,发送心跳给Eureka 服务端。图3-2为Eureka的架构图。
图3-2 Eureka架构图
3.3 客户端负载均衡Ribbon
负载均衡是分布式系统架构设计中必须要考虑的重要因素,它对系统的高并发和高可用、缓解网络压力、增加系统吞吐量,提高数据处理能力具有重要作用。负载均衡分为服务端负载均衡和客户端负载均衡。
服务端负载均衡包括软件负载均衡和硬件负载均衡两种解决方案,其中软件负载均衡是指通过在服务器的操作系统上安装具有均衡负载功能的软件,如HAProxy、NGINX等,硬件负载均衡是指在服务器与网络设备之间安装的负载均衡设备,如A10、F5等。它们都维护一份可用的服务端列表,通过心跳健康检查机制确保服务端列表中的服务可用性,当客户端发起请求经过服务端负载均衡时,由服务端负载均衡器选取一个可用的服务端,并转发客户端的请求。
Ribbon是Netflix开源的客户端负载均衡工具,Spring Cloud Ribbon基于Netflix Ribbon实现,通过对Ribbon API的封装实现负载均衡,并将其集成于每个Spring Cloud构建的微服务和基础设施中。与服务端负载均衡不同,Ribbon的客户端负载均衡的每个客户端服务都维护着一份所要访问的服务清单,同样也需要心跳检查机制来维护服务端列表中服务的健康性。
Ribbon的负载均衡机制提供了若干负载均衡策略,用于在服务器列表中进行选择服务器,其内置的负载均衡策略包括:随机策略、轮询策略、重试策略、最低并发策略、可用过滤器策略、响应时间加权策略、区域权重策略。另外,Ribbon还提供了Ping机制和重试机制,Ping机制是通过定时Ping服务器的操作来检查服务器的存活状态,确保服务实例的可用性;而重试机制是为确保服务数据的一致性,当服务调用到故障的实例时,会再次尝试请求,并根据失败次数设置,尝试到所设定的失败次数后,更换实例访问,以达到通过重试解决短暂故障问题的目的。
3.4 服务容错保护Hystrix
在微服务架构中,存在着诸多的服务单元,各服务单元通过服务注册与订阅的方式互相依赖。服务之间的依赖通过远程调用的方式执行,调用过程中若存在网络延迟和服务故障,随着请求的不断增加,可能会阻塞整个调用链,使服务变得不可用,最终导致整个业务系统崩溃。为了保障整体系统的可用性,减少因服务不稳定因素出现故障的风险,可以使用熔断机制来解决这类问题。断路器模式通过快速响应失败的操作请求,缩短故障处理周期,而不是一直等到操作超时,使服务能够在正常服务时间内完成请求处理,避免因单点故障而引发系统整体的连锁故障反应。
Hystrix是Netflix开源的服务容错框架,该框架用于控制访问远程服务、第三方系统的服务节点,防止服务调用产生的级联故障导致系统雪崩,提供强大的容错和自我保护能力。Hystrix具备拥有熔断机制、线程和信号量隔离机制及回退机制,服务降级,请求缓存和请求合并,实时监控、报警及动态配置等服务保护功能。Spring Cloud集成了Hystrix组件,Hystrix通过超时容限和失败容错逻辑,来控制分布式系统中服务之间的交互;通过使用“舱壁模式”实现对依赖服务的线程池隔离,降低被依赖服务失效的风险,使服务本身得到完全保护,避免受到对依赖服务不可控的影响,从而提高系统的容错性和稳定性。
3.5 服务调用框架Feign
Feign是Netflix提供的开源的Rest客户端工具。Spring Cloud Feign基于Netflix Feign实现,它提供了声明式、模板化的远程调用客户端的实现,并封装整合了客户端负载均衡Spring Cloud Ribbon与服务保护容错Spring Cloud Hystrix两个基础工具框架的功能,其目标在于简化Web服务客户端的开发,让Web调用更加简单。Spring Cloud Feign具备可插拔的注解支持,还支持插件式的编码器和解码器,这种可插拔的方式,可根据实际的需求进行定制化扩展和替换。
3.6 网关服务Zuul
Zuul是Netflix开源的网关服务组件,是一个提供了微服务路由、负载均衡和过滤器解决方案的边缘服务框架。Zuul提供了一套过滤器机制,即将HTTP请求划分为不同的阶段,每个阶段由不同的过滤器处理,实现对微服务接口的拦截和校验。Zuul的工作原理如图3-3所示。Zuul的主要功能如下:
(1)验证与安全:对访问资源和来访者身份进行验证,拦截不符合要求的请求。
(2)追踪与监控:追踪后端服务运行数据,展示准确的请求状况。
(3)动态路由:动态的将请求转发到后端的服务实例。
(4)负载分配:根据负载类型设置相应的处理策略,放弃超出负载限制的请求。
(5)静态响应处理:提供静态类型的过滤器,直接响应部分请求,而不再将请求转发到服务内部返回响应。
(6)压力测试:逐渐增加访问集群的请求流量,从而测试集群的性能水平。
图3-3 Zuul工作原理图
Spring Cloud Zuul基于Netflix Zuul进行了进一步的封装整合,用于实现API服务网关,提供了认证鉴权、动态路由、请求转发、熔断保护、安全过滤等功能。
Spring Cloud Zuul与Spring Cloud Eureka进行了整合,其自身也作为一个应用注册到了Eureka服务中,并通过Eureka获取其它服务实例的信息,依此来实现动态路由的功能。Spring Cloud Zuul提供了诸多默认的核心过滤器,这些过滤器在网关服务启动时被自动加载和启用,也可以根据业务需要自定义实现过滤器。