Spring Cloud Alibaba 工具集
一、Alibaba 工具集概述
1
| https://spring.io/projects/spring-cloud-alibaba
|
阿里云为分布式应用开发提供了一站式解决方案。它包含了开发分布式应用程序所需的所有组件,使您可以轻松地使用SpringCloud
开发应用程序。
有了阿里云,你只需要添加一些注解和少量的配置,就可以将Spring云应用连接到阿里的分布式解决方案上,用阿里中间件搭建一个分布式应用系统。
Alibaba工具集环境搭建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <properties> <java.version>1.8</java.version> <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
|
二、Nacos
1
| https://nacos.io/zh-cn/index.html
|
Nacos
致力于帮助您发现、配置和管理微服务。Nacos
提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos
就是微服务架构中服务注册中心以及统一配置中心,用来替换原来的(eureka,consul)以及config组件
1、安装

2、服务注册
2.1、添加依赖
1 2 3 4 5
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
|
2.2、配置文件
1 2 3 4 5 6 7 8 9 10
| server.port=9988
spring.application.name=user
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
management.endpoints.web.exposure.include=*
|
2.3、添加注解
1 2 3 4 5 6 7
| @SpringBootApplication @EnableDiscoveryClient public class User9988Application { public static void main(String[] args) { SpringApplication.run(User9988Application.class, args); } }
|
2.4、查看web页面

3、配置中心
3.1、配置中心概念

配置中心中一个具体的配置文件有三个概念组成。
1 2 3
| namespace 命名空间 Group 组 Data ID 名称
|
通过这个概念找到一个具体的配置文件。
3.2、引入依赖
1 2 3 4 5
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
|
3.3、配置文件
1 2 3 4 5 6 7 8 9
| spring.application.name=config
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.config.group=DEFAULT_GROUP
spring.cloud.nacos.config.file-extension=properties
spring.profiles.active=prod
|
3.4、在Nacos中新建配置文件

1 2 3 4
| server.port=9988 spring.cloud.nacos.discovey.server-addr=${spring.cloud.server.addr} spring.cloud.nacos.server-addr=localhost:8848 user.name=jiang
|
3.5、读取配置文件
启动并查看日志:

3.5、编写控制器测试读取结果
1 2 3 4 5 6 7 8 9 10 11
| @RestController public class UserController {
@Value("${user.name}") private String name;
@RequestMapping("/user/test") public String Test(){ return "name = " + name; } }
|

3.6、实现自动刷新
默认情况下nacos已经实现了自动配置刷新功能。
如果需要刷新配置直接在控制器中加入@RefreshScope注解即可
1 2 3 4 5 6 7 8 9 10 11 12
| @RestController @RefreshScope public class UserController {
@Value("${user.name}") private String name;
@RequestMapping("/user/test") public String Test(){ return "name = " + name; } }
|
三、sentinel
1、概述
1
| https://github.com/alibaba/Sentinel/wiki
|
Sentinel以”流量”为突破口,在流量控制、断路、负载保护等多个领域进行工作,保障服务可靠性。
1 2 3 4 5
| - 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
|
sentinel提供了两个服务组件:
- sentinel 用来实现微服务系统中服务熔断、降级等功能。
- sentinel dashboard 用来监控微服务系统中流量调用等情况。
2、sentinel dashboard的安装
2.1、下载jar包
1
| https://github.com/alibaba/Sentinel/releases
|
2.2、启动
1
| java -Dserver.port=9898 -jar sentinel-dashboard-1.7.2.jar
|
2.3、web管理界面

用户/密码:sentinel
3、快速开始
3.1、引入依赖
1 2 3 4 5
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
|
3.2、配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| spring.application.name=user
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.config.group=DEFAULT_GROUP
spring.cloud.nacos.config.file-extension=properties
spring.profiles.active=prod
spring.cloud.sentinel.enabled=true
spring.cloud.sentinel.transport.dashboard=localhost:9989
spring.cloud.sentinel.transport.port=8719
|
3.3、启动
访问页面:http://localhost:9989/#/dashboard
但是界面并没有出现变化。
原因:
默认情况下sentiel为延迟加载,不会在启动之后立即创建服务监控,需要对服务进行调用时才会初始化
调用:http://localhost:9988/user/test
访问页面:http://localhost:9989/#/dashboard

4、实时监控
实时监控界面
1 2 3
| 什么是QPS: QPS意思是每秒查询率,是计算机中服务器每秒能够相应的查询次数 QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
|

5、流量控制
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| - 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
- 同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
- 一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果: resource:资源名,即限流规则的作用对象 count: 限流阈值 grade: 限流阈值类型(QPS 或并发线程数) limitApp: 流控针对的调用来源,若为 default 则不区分调用来源 strategy: 调用关系限流策略 controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
- 流量控制主要有两种统计类型,一种是统计并发线程数,另外一种则是统计 QPS - 更多细节参见官网:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
|
5.1、QPS限流

1 2 3
| 资源名:访问的资源路径 阈值类型:QPS 单机阈值:每秒最大请求为1
|
测试:反复刷新出现错误

5.2、线程数限流

测试:

5.3、流控模式
1 2 3 4 5
| # 1.说明 - 直接:标识流量控制规则到达阈值直接触发流量控制 - 关联: 当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。
- 链路限流: https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
|

5.4、流控效果
1 2 3 4 5 6
| - 直接拒绝:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。
- Warm Up:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。 - 匀速排队:(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。 只能对请求进行排队等待
|
6、熔断降级
1 2 3 4 5 6 7
| 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。 由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高) 对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。 当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断 (默认行为是抛出 `DegradeException`)。
|
降级策略
- 平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。
/Spring Cloud Alibaba.assets/image-20200802142932522.png)
- 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
/Spring Cloud Alibaba.assets/image-20200802143052470.png)
- 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。
/Spring Cloud Alibaba.assets/image-20200802143314524.png)
7、SentinelResource注解
5.SentinelResource注解
https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
/Spring Cloud Alibaba.assets/image-20200802150527319.png)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @GetMapping("/sentinel/test1") @SentinelResource(value = "aa",blockHandler = "fallBack",fallback = "fall") public String test1(int id){ log.info("sentinel test1"); if(id<0) throw new RuntimeException("非法参数!!!"); } return "sentinel test1 :"+id; } public String fallBack(int id,BlockException e){ if(e instanceof FlowException){ return "当前服务已被流控! "+e.getClass().getCanonicalName(); } return "当前服务已被降级处理! "+e.getClass().getCanonicalName(); } public String fall(int id){ return "当前服务已不可用!"; }
|