Spring Cloud+Nginx架构的主要组件
以crazy-springcloud开发脚手架为例,一个Spring Cloud+Nginx应用的架构如图1-1所示。
图1-1 基于Spring Cloud+Nginx的应用架构
Nginx作为反向代理服务器,代理内部Zuul网关服务,通过Nginx自带的负载均衡算法实现客户端请求的代理转发、负载均衡等功能。
Zuul网关主要实现了微服务集群内部的请求路由、负载均衡、统一校验等功能。虽然在路由服务和负载均衡方面,Zuul和Nginx的功能比较类似,但是Zuul是自身注册到Eureka/Nacos,通过微服务的serviceID实现微服务提供者之间的路由和转发。
Eureka、Nacos都是Spring Cloud技术体系中提供服务注册与发现的中间件。Eureka是Netflix开源的一款产品,提供了完整的服务注册和发现,是Spring Cloud“全家桶”中的核心组件之一。
Nacos是阿里巴巴推出来的一个开源项目,也是一个服务注册与发现中间件,它用于完成服务的动态注册、动态发现、服务管理,还兼具了配置管理的功能。Nacos提供了一组简单易用的特性集,用于实现动态服务发现、服务配置、服务元数据及流量管理。
由于新版本的Eureka已经闭源,而阿里巴巴的Nacos除了具备Eureka注册中心功能外,还具备Spring Cloud Config配置中心的功能,因此大大地降低了使用和维护的成本。另外,Nacos还具有分组隔离功能,一套Nacos集群可以支撑多项目、多环境。综合上述多个原因,在实际的开发场景中,推荐大家使用Nacos。但是,本文出于学习目的,注册中心和配置中心的内容还是介绍Eureka+Config组合,其实在原理上,Nacos和Eureka+Config组合是差不多的。
除了一系列基础设施中间件技术组件之外,微服务架构中大部分独立业务模型都是以服务提供者的角色出现的。一般来说,系统可以按照各类业务模块进行细粒度的微服务拆分,例如秒杀系统中的用户、商品等,每个业务模块拆分成一个微服务提供者Provider组件,作为独立应用程序进行启动和执行。
在Spring Cloud生态中,微服务提供者Provider之间的远程调用是通过Feign+Ribbon+Hystrix组合来完成的:Feign用于完成RPC远程调用的代理封装;Ribbon用于在客户端完成各远程目标服务实例之间的负载均衡;Hystrix用于完成自动熔断降级等多个维度的RPC保护。在Nginx+Spring Cloud架构中还存在一系列辅助中间件,包括日志记录、链路跟踪、应用监控、JVM性能指标、物理资源监控等等。本文并没有对上述辅助中间件做专门的介绍。
Spring Cloud和Spring Boot的版本选择
Spring Cloud是基于Spring Boot构建的,它们之间的版本有配套的对应关系。在构建项目时,要注意版本之间的这种对应关系,版本若对应不上则会出现问题。
Spring Cloud和Spring Boot的版本配套关系如表1-1所示。
表1-1 Spring Cloud与Spring Boot的版本配套关系
表1-1 Spring Cloud与Spring Boot的版本配套关系
Spring Cloud包含一系列子组件,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Openfeign等,为了防止与这些子组件的版本号混淆,Spring Cloud的版本号全部使用英文单词形式命名。具体来说,Spring Cloud的版本号使用了英国伦敦地铁站的名称来命名,并按字母A~Z的次序发布版本,它的第一个版本叫作Angel,第二个版本叫作Brixton,以此类推。另外,每个大版本在解决了一个严重的Bug后,Spring Cloud会发布一个Service Release版本(小版本),简称SRX版本,其中X是顺序的编号,比如Finchley.SR4是Finchley大版本的第4个小版本。
大家做技术选型时非常喜欢用最高版本,但是对于Spring全家桶的选择来说,高版本不一定是最佳选择。比如,目前最高的Spring CloudHoxton版本是基于Spring Boot 2.2构建的,Spring Boot 2.2又是基于Spring Framework 5.2构建的,也就是说,这是一次整体的、全方位的大版本升级。大家在项目上会用到非常多的第三方组件,总会有一些组件没有来得及进行配套升级而不能兼容Spring Boot 2.2或SpringFramework 5.2,如果贸然地进行基础框架的整体升级,就会给项目开发带来各种各样的疑难杂症,甚至带来潜在的线上Bug。
除此之外,Spring Cloud高版本推荐了不少自家的新组件,但是这些新组件没有经过大规模实践应用的考