spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵
Sentinel是什么?在之前Spring Cloud低版本中,处理服务降级与熔断时,我们会用到Hystrix断路器,但与Eureka服务注册中心一样,由于社区停止了维护,所以开发者在寻求替代品,除了Spring官方推荐的Resilience4J外,Sentinel就是我们的又一选择。
需要了解更多介绍,可以看github项目文档
下面快速讲解怎么使用!
maven依赖版本:
依赖 | 版本号 |
---|---|
JDK | 1.8 |
spring-boot-starter-parent | 2.3.0.RELEASE |
spring-cloud-dependencies | Hoxton.SR4 |
spring-cloud-alibaba-dependencies | 2.2.1.RELEASE |
spring-cloud-starter-alibaba-sentinel | 2.2.1.RELEASE |
sentinel-datasource-nacos | 1.7.1 |
Sentinel 分为两个部分:
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud
等框架也有较好的支持。 - 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
(一)部署sentinel-dashboard控制台
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。
部署主要有以下方式(不具体介绍步骤,可看官方部署文档地址):
-
直接从github的release页面下载jar包,以jar包的方式启动;
参考的启动命令为java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
-
可以使用下载后的jar包构建Docker镜像,以Docker容器的方式启动,这里可以参考该篇文章。
*注意:启动 sentinel-dashboard控制台的JDK 版本最好为 1.8 或以上版本
启动之后,访问sentinel-dashboard控制台地址(ip+端口,默认启动就是http://localhost:8080/)(默认账号密码都是sentinel):
假如没有带上环境参数-Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard
,在第一次访问出现空白是正常现象,我们需要客户端资源接入后,访问资源再刷新控制台页面才会显示相应的信息。
(二)客户端资源接入Sentinel以及控制台
有两种方式接入:其一是在代码里使用 Sentinel API,这里不介绍,可参考文档;其二是使用@SentinelResource注解,以下讲解的是基于注解的方式,可参考文档。
下面以admin-user服务为例:
首先添加配置文件,配置Sentinel控制台地址等:
假如需要feign调取其他服务的资源,则需加上配置支持Sentinel:
之后在代码中加上注解:
最后启动admin-user服务,请求/role接口,然后再刷新sentinel-dashboard控制台,会发现实时监控信息:
紧接着我们可以尝试新增流控规则:
这里的资源名必须对应@SentinelResource注解中的value属性值,阈值类型定义为当每秒请求超过两次时,触发熔断。
新增完之后,我们对这个接口测试,当每秒请求超过两次时可看到Sentinel返回限流异常信息!
(三)Sentinel结合Nacos读取流控规则等规则配置
假如我们直接在sentinel-dashboard控制台配置流控规则或者降级规则,Sentinel会加载到内存中,但再次重启Sentinel后就会出现数据丢失,所以实际中我们需要进行一个配置信息的持久化。
这里介绍的是以Nacos为数据源,加载规则配置信息到Sentinel(实际中我们不仅只能够在Nacos控制台修改规则配置信息进行持久化,也需要在sentinel-dashboard控制台修改或新增规则配置信息时,能够同步到Nacos进行持久化,但后者的实现目前需要修改Sentinel源码去实现,因此只介绍前者)!
引入支持Nacos数据源依赖:
修改配置文件:
在Nacos配置中心添加相关的配置文件:
说明:
- resource:资源名;
- limitApp:调用来源,default为不区分调用来源;
- grade:限流阈值类型(QPS或并发线程数);0根据并发数量来限流,1根据QPS来进行流量控制;
- count:限流阈值;
- strategy:调用关系限流策略(直接、关联、链路);
- controlBehavior流量控制效果(快速失败、Warm Up、匀速排队);
- clusterMode:是否为集群模式
最后先重启sentinel-dashboard控制台,再启动admin-user服务,可在控制台看到输出类似如下日志信息:刷新sentinel-dashboard控制台,可看到从Nacos加载了规则配置信息:
最后说下在这过程中可能遇到的问题:
- 假如使用公网Docker部署sentinel-dashboard控制台,然后本地接入资源时,实时监控信息空白,sentinel-dashboard日志信息显示
Failed to fetch metric from <http://192.168.8.134:8719/metric?startTime=1594830194000&endTime=159483
类似内容,说明sentinel-dashboard接收到的ip地址是虚拟ip,所以部署时,客户端与sentinel-dashboard控制台最好同属一台机子。 - 在参考一些博客整合Nacos时,发现sentinel-dashboard控制台加载不到Nacos中的规则配置信息,日志输出
message:converter can not convert rules because source is empty
,解决办法是需要配置Nacos的namespace命名空间,加载配置需要满足data-id+group-id+namespace: