Spring Boot核心特性
内置的Servlet容器已经成为过去式,新版本的Spring Boot将此特性称为WebServer。
早期的Java Web应用都需要构造成WAR包,然后部署到Servlet容器。
如果是Spring MVC应用,需要在web.xml中配置DispatchServlet这个Servlet和对应的url-pattern,url-pattern默认会拦截所有的请求。DispatcherServlet拦截请求后,再通过内部的HandlerMapping根据URL信息去匹配Controller,最终找到匹配到的Controller,然后使用Controller内部的方法对请求进行处理。
有了WebServer后,我们不再需要关心外部的Web服务器、web.xml文件、各种Servlet和Filter的配置等因素,只需要编写代码打包成JAR文件后直接运行即可,这非常适合云原生架构中的可独立部署特性。
Spring Cloud
Spring Cloud早期与Netflix合作,其内部的很多接口借鉴了Netfilx开源软件的实现。不过Spring Cloud的目的是为了做生态,不与Netfilx进行强绑定。
| Spring Cloud特性 | 实现组件 |
|---|---|
| 服务注册/发现 | Alibaba Nacos、Netfilx Eureka、Apache Zookeeper、HashiCorp Consul |
| 分布式配置 | Alibaba Nacos、Spring Cloud Config Server、Apache Zookeeper、HashiCorp Consul |
| API 网关 | Spring Cloud Gateway、Netflix Zuul |
| 熔断器 | Alibaba Seninel、Netfilx Hystrix、Resilience4j |
| 分布式消息 | SCS RocketMQ Binder、SCS Kafka Binder(SCS=Spring Cloud Stream) |
| 消息总线 | SCB RocketMQ、SCB Kafka Binder(SSB = Spring Cloud Bus) |
| 链路追踪 | Spring Cloud Sleuth |
| 服务调用 | RestTemplate、OpenFeign、Dubbo Spring Cloud |
| 负载均衡 | Netflix Ribbon、Spring Cloud LoadBalancer、Dubbo LoadBalancer |
Spring Cloud最新动态
自2015年诞生以来到目前为止,Spring Cloud 生态发生了非常大的变化。Spring Cloud Netfilx大部分组件不再继续更新。Spring Cloud Gateway代替Netflix Zuul,Spring Cloud LoadBalancer代替Netflix Ribbon,Spring Cloud Circuit Breaker Sentinel 代替 Hystrix。
2018年,阿里巴巴开源了Spring Cloud Alibaba,这是一个整合阿里巴巴开源中间件与Spring Cloud生态的开源项目。
| 组件 | 描述 |
|---|---|
| Nacos | 服务注册中心、服务配置中心 |
| Dubbo | 扩展Spring Cloud客户端,可以调用Dubbo服务 |
| Seata | 分布式事务解决方案 |
| Spring Cloud Stream RocketMQ Binder | 基于RocketMQ的Spring Cloud Stream实现,完成消息的处理 |
| Sentinel | Circuit Breaker熔断器,同时还有限流和系统保护的功能 |
| Spring CloudBus RocketMQ | 基于RocketMQ的消息总线实现 |
服务注册与服务发现
微服务架构的优点如下:
- 每个微服务可以独立开发、独立运行、独立部署,可以使用任意一种开发语言
- 每个微服务之间是独立的,如果某个服务宕机,只会影响当前服务,不会对整个业务系统产生影响
- 不同团队维护不同的微服务,职责单一
- 可以针对不同的微服务做不同的扩/缩容策略,不会造成资源浪费
Spring Cloud 服务调用的过程,多个Provider(服务提供者)首先会在注册中心注册自身的实例信息,Consumer(服务注册者)去注册中心发现服务,得到服务实例列表,最终选择其中某个实例发起一次服务调用。
负载均衡与服务调用
在使用过程中,我们发现一个问题:在注册中心返回的实例列表中,我们要选择哪个实例呢?
这就需要使用负载均衡解决这个问题。常见的负载均衡算法如下:
- 随机算法:在实例列表中随机选择某个实例。
- 轮询算法:循环取下一个。比如,一共有3个实例,第一次取第一个,第二次取第二个,以此类推。
- 最少连接数算法:每次取连接数最少的实例。
- 一致性哈希算法:基于一致性哈希算法总是将相同参数的请求落到同一个实例上。
- 权重随机算法:比如有4个实例,a权重为10,b权重为30,c权重为40,d权重为20.每次取100以内的整数,若结果在1-10之间,则选择a,在11-40之间选择b,在41-80之间选择c,81-100之间选择d。
由于Netfilx Ribbon和Spring Cloud Netfilx Ribbon组件都已进入维护模式,目前官方推荐Spring Cloud LoadBalancer(SCL)。目前SCL的功能跟Ribbon相比还比较弱,推荐使用Ribbon。
配置管理
Spring Boot 所有的配置都是跟应用绑定的,配置文件会被打包到JAR中跟随应用一起部署到服务器或容器内。这种方式会存在如下问题:
- 配置数据存在安全泄露问题,只要进去服务器或容器内,就可查看所有的配置。
- 配置在应用启动后,无法动态更新,只能手动更新后再重启应用。、
- 一个应用部署多份实例的时候,需要维护多套配置,容易造成数据不一致的问题。
- 配置没有管理方式。如更新配置,线上发现问题需要回滚,必须手动将新的配置改为老的配置。
要解决上述问题,需要一个配置中心,其方案如下:
- 所有的配置数据都在配置中心内,进入服务器或容器内也无法直到配置信息。
- 配置数据从配置中心获取,并动态修改后,配置中心会推送新的配置数据到各个应用。
- 所有的实例配置都从配置中心获取,不存在数据不一致的问题。
- 配置中心提供版本管理的功能。在配置数据下发的过程中出现问题,可以立即回滚到上一个版本。
目前Alibaba Nacos、Apache Zookeeper、HashiCorp Consul、等中间件都是业界比较知名的配置中心。
熔断器
应用依赖的外部API不可用,该应用一直在超时并重试,从而引发应用整体无法提供服务,如果这时能有一个类似断路器的组件让客户端在发生多次调用失败的情况下不再重试,继续调用,则可以让服务器能够健康地运行。这个组件就是熔断器模式。
Alibaba Sentinel
Sentinel是阿里巴巴在2018年对外开源地面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载等多个维度来帮助用户保护服务的稳定性。
Sentinel提供了3个核心功能:
- 流量控制:任何时候到来的请求往往都是随机不可控的,而系统的处理能力是有限的。Sentinel可以根据资源的配置对流量进行控制。
- 熔断降级:当检测到调用链路中某个资源出现不稳定的表现。例如,请求响应时间长或异常1比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其他资源。进而导致级联故障。
- 系统负载保护:提供系统维度的自适应保护能力。
Sentinel的三个核心概念:
- 资源:限流或熔断针对的是某个资源,这个资源可以是一个HTTP URI、一个方法名或一个接口名。
- 规则:针对资源对应的策略。比如限流QPS,限流并发线程数,根据响应时间熔断。
- 数据源:规则的数据都从数据源中加载,这个数据源可以是本地的一个文件,或者是配置中心里的一个配置。
一个典型的流量控制应用场景就是在网关层进行限流。Sentinel与Spring Cloud 体系内的网关Netflix Zuul、Spring Cloud Gateway 都已经进行了整合。限流支持的维度如下:
- QPS设置
- 统计时间窗口设置,默认为1s
- 来源IP限流
- Host限流
- 任意Header限流
- 任意Cookie限流
- 任意URL Query Parameter限流
若要使用Sentinel限流,只需添加sentinel gateway依赖并配置限流规则,就可以完成限流操作。
Sentinel的高级特性
Sentinel还支持冷启动(让通过的流量缓慢增加,一定时间内达到阈值)、匀速器(让请求匀速通过,使用漏桶算法)限流行为。
Netflix Hystrix
Hystrix是NetFlix在2012年对外开源的一款熔断降级工具,用于解决分布式系统的延迟和容错问题。
官方对Hystrix的功能描述如下:
- 通过第三方客户端库访问依赖项,对延迟和故障提供保护和控制
- 在复杂的分布式系统中停止连锁故障
- 快速失败并迅速恢复
- 尽可能地回退和优雅地降级
- 实现近乎实时的监控、警报和操作控制
网关
网关在微服务体系中属于比较重要的一个模块。有了网关之后,客户端所有的流量全部先经过网关,网关再转发到对应的微服务,然后微服务返回结果给网关,网关最终将结果展示给客户。
目前业界比较有名的网关有:Nginx、Apache、Kong、Netflix Zuul、Alibaba Tengine和Spring Cloud Gateway。
非阻塞式的Spring Cloud Gateway
Spring Cloud Gateway完全采用响应式架构,依赖Reactor和Spring WebFlux项目。Spring WebFlux是Spring Framework5.x新推出的基于Reactive实现的响应式Web服务器端框架。