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 spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第1张图片

  • 可以使用下载后的jar包构建Docker镜像,以Docker容器的方式启动,这里可以参考该篇文章。

    *注意:启动 sentinel-dashboard控制台的JDK 版本最好为 1.8 或以上版本

    启动之后,访问sentinel-dashboard控制台地址(ip+端口,默认启动就是http://localhost:8080/)(默认账号密码都是sentinel):
    spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第2张图片
    假如没有带上环境参数-Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard,在第一次访问出现空白是正常现象,我们需要客户端资源接入后,访问资源再刷新控制台页面才会显示相应的信息。

(二)客户端资源接入Sentinel以及控制台

有两种方式接入:其一是在代码里使用 Sentinel API,这里不介绍,可参考文档;其二是使用@SentinelResource注解,以下讲解的是基于注解的方式,可参考文档。

下面以admin-user服务为例:
首先添加配置文件,配置Sentinel控制台地址等:
spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第3张图片
假如需要feign调取其他服务的资源,则需加上配置支持Sentinel:
在这里插入图片描述

之后在代码中加上注解:
spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第4张图片

最后启动admin-user服务,请求/role接口,然后再刷新sentinel-dashboard控制台,会发现实时监控信息:
spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第5张图片
紧接着我们可以尝试新增流控规则:
spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第6张图片

这里的资源名必须对应@SentinelResource注解中的value属性值,阈值类型定义为当每秒请求超过两次时,触发熔断。

新增完之后,我们对这个接口测试,当每秒请求超过两次时可看到Sentinel返回限流异常信息!

(三)Sentinel结合Nacos读取流控规则等规则配置

假如我们直接在sentinel-dashboard控制台配置流控规则或者降级规则,Sentinel会加载到内存中,但再次重启Sentinel后就会出现数据丢失,所以实际中我们需要进行一个配置信息的持久化。
这里介绍的是以Nacos为数据源,加载规则配置信息到Sentinel(实际中我们不仅只能够在Nacos控制台修改规则配置信息进行持久化,也需要在sentinel-dashboard控制台修改或新增规则配置信息时,能够同步到Nacos进行持久化,但后者的实现目前需要修改Sentinel源码去实现,因此只介绍前者)!

引入支持Nacos数据源依赖:
spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第7张图片

修改配置文件:
spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第8张图片

在Nacos配置中心添加相关的配置文件:
spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第9张图片

说明

  • resource:资源名;
  • limitApp:调用来源,default为不区分调用来源;
  • grade:限流阈值类型(QPS或并发线程数);0根据并发数量来限流,1根据QPS来进行流量控制;
  • count:限流阈值;
  • strategy:调用关系限流策略(直接、关联、链路);
  • controlBehavior流量控制效果(快速失败、Warm Up、匀速排队);
  • clusterMode:是否为集群模式

最后先重启sentinel-dashboard控制台,再启动admin-user服务,可在控制台看到输出类似如下日志信息:
在这里插入图片描述刷新sentinel-dashboard控制台,可看到从Nacos加载了规则配置信息:
spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第10张图片

最后说下在这过程中可能遇到的问题:

  • 假如使用公网Docker部署sentinel-dashboard控制台,然后本地接入资源时,实时监控信息空白,sentinel-dashboard日志信息显示Failed to fetch metric from 类似内容,说明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:
    spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵_第11张图片

你可能感兴趣的:(spring-cloud-alibaba(三):Sentinel分布式系统的流量防卫兵)