Spring Cloud Alibaba Sentinel控制台和Nacos持久化限流

本文介绍如何使用Spring Cloud Alibaba Sentinel实现流量控制,并利用Nacos作为规则存储,确保限流规则在服务重启后仍能生效。

Sentinel 官方文档

一、Sentinel控制台启动

控制台下载有两种方式,一种是直接下载编译好的release版本程序包,另一种是下载控制台的工程代码,在本地打包后启动。

1、直接下载release程序包
下载自己需要的控制台 jar 包。
我这里下载的是v1.7.0
在这里插入图片描述
启动命令:
java -jar sentinel-dashboard-1.7.0.jar
或者
java -Dserver.port=8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar
将这个命令放在txt,修改后缀为cmd,点击启动即可。
在这里插入图片描述
在这里插入图片描述

启动命令的其他设置:

-Dserver.port=8088:设置端口,默认是8080
-Dproject.name=sentinel-dashboard:设置仪表板名称
-Dsentinel.dashboard.auth.username=username:设置用户名,默认是sentinel
-Dsentinel.dashboard.auth.password=password:设置密码,默认是sentinel
-Dserver.servlet.session.timeout=7200:设置过期时间,用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;

启动成功后,浏览器输入http://localhost:8088/
(默认用户名和密码都是sentinel)
在这里插入图片描述
在这里插入图片描述
注:sentinel是一个懒加载框架,只有定义资源被访问后才会显示在界面中,第一次启动控制台界面为空,可通过eager设置服务启动直接建立心跳连接,sentinel.eager=true。

2、通过代码构建
代码仓库地址 sentinel-dashboard
下载 sentinel-dashboard模块,进入工程目录,通过Maven打包成一个可执行的 fat jar:

mvn clean package

构建和启动
使用如下命令启动控制台:

java -Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

二、客户端接入控制台

(1)在pom.xml中引入依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
	<version>0.9.0.RELEASE</version>
</dependency>

(2)在bootstrap.yml文件中开启sentinel支持
一个是让程序可以连接到sentinel的地址,另一个是开启微服务调用支持,这个是可选项,看自己的情况需要否,单体测试工程可不写。
spring.cloud.sentinel.transport.dashboard = localhost:8080
feign.sentinel.enabled = true

sentinel:
	eager: true
		transport:
			dashboard: localhost:8088
# 开启sentinel支持
feign:
  sentinel:
    enabled: true

(3)定义资源及兜底方法
在controller定义方法,并采用 @SentinelResource 注解定义资源,其中value值是资源名,blockHandlerClass 和 blockHandler分别是阻塞类和阻塞方法,阻塞方法需要和原方法在一个类中,有时候不方便我们管理,就可以用阻塞类。

@SentinelResource(value = "dragon-company", blockHandlerClass = UserBlockHandler.class,blockHandler = "handlerException")
@GetMapping("/sentinel")
public String sentinel(){
	log.info("测试 sentinel");
	//测试Sentinel限流
	return "君不见黄河之水天上来";
}
public class UserBlockHandler {
    /**
     * 异常处理方法
     * (1) blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,
     * (2) 参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。
     * (3) 注意:如果是兜底类,对应的函数必需为 static 函数,如果在同一个类中的兜底方法,则不需要是静态函数
     */
    public static String handlerException(BlockException e) {
        return "Sentinel限流";
    
}

启动项目,访问http://localhost:9528/company/saas/user/sentinel,可以看到控制台会出现你的服务名

三、Sentinel规则持久化

sentinel做限流,每次sentinel dashboard服务重启后,限流的规则丢失,这里就需要对限流规则作持久化处理。
持久化支持方式:

文件配置
Nacos配置
ZooKeeper配置
Apollo配置

这里选用Nacos
(1)在pom.xml中引入依赖

<dependency>
   <groupId>com.alibaba.csp</groupId>
   <artifactId>sentinel-datasource-nacos</artifactId>
   <version>1.6.0</version>
</dependency>

(2)在bootstrap.yml文件配置nacos信息

sentinel:
	datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            namespace: @nacos.config.namespace@
            dataId: ${spring.application.name}-flow-rules
            data-type: json
            rule-type: flow

注意:
因为我的nacos配置了不同的隔离环境 namespace,所以需要指定具体哪一个namespace,否则会加载不到规则配置
在这里插入图片描述

启动时sentinel会报警告:
在这里插入图片描述
正确的启动:
在这里插入图片描述
(3)nacos里配置列表页面新建配置,配置限流规则
在这里插入图片描述

[
  {
    "resource": "dragon-company",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]

上面配置规则是一个数组类型,数组中的每个对象是针对每一个保护资源的配置对象,每个对象中的属性解释如下:

配置好之后,启动项目,访问http://localhost:9528/company/saas/user/sentinel

在这里插入图片描述
刷新Sentinel控制台
在这里插入图片描述
在这里插入图片描述
注意:
Sentinel 会通过SentinelWebAutoConfiguration自动配置类来对 Sentinel 进行配置,来拦截 Web 请求,并且将 url 采集成资源,之后会在 sentinel-dashboard 中的簇点链路中展示。
在这里插入图片描述

拦截的 url 模式串 为/*
启动的时候可以看到
在这里插入图片描述
解决方式:
在配置文件中添加一下配置:

spring:
  cloud:
    sentinel:
      filter:
        url-patterns: /**

在这里插入图片描述

测试控流情况,请求多次
在这里插入图片描述
在这里插入图片描述
也可以通过Jmeter测试
在这里插入图片描述
点击运行

在这里插入图片描述
在这里插入图片描述
看后台日志,也只通过了两个请求
在这里插入图片描述

注意:
整合之后,可以在两个地方修改控流规则:Sentinel控制台、Nacos控制台。
通过Nacos修改该条规则是可以同步到Sentinel的,但是通过Sentinel控制台修改或新增却不可以同步到Nacos。
因为当前版本的Sentinel控制台不具备同步修改Nacos配置的能力,而Nacos由于可以通过在客户端中使用Listener来实现自动更新。所以,在整合了Nacos做规则存储之后,需要知道在下面两个地方修改存在不同的效果:

Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Nacos中的配置值,重启后恢复原来的值。
Nacos控制台中修改规则:服务的内存中规则会更新,Nacos中持久化规则也会更新,重启后依然保持。

Nacos与Sentinel互相同步限流规则可参考大佬文章
Sentinel使用Nacos存储规则及同步

备注:
yaml文件全内容:

spring:
  profiles:
    active: @profiles.active@
  application:
    name: dragon-company
  cloud:
    nacos:
      config:
        namespace: @nacos.config.namespace@
        server-addr: localhost:8848
        shared-dataids: dragon-public.yml,${spring.application.name}.yml
      discovery:
        server-addr: @nacos.server-addr@
        service: ${spring.application.name}
        namespace: @nacos.config.namespace@
    sentinel:
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            # nacos配置了不同的隔离环境 namespace,则需要指定具体哪一个namespace,否则会加载不到规则配置
            namespace: @nacos.config.namespace@
            dataId: ${spring.application.name}-flow-rules
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
      transport:
        dashboard: localhost:8089
        port: 8719
      # 服务启动直接建立心跳连接
      eager: true
      filter:
        url-patterns: /**

#开启sentinel
feign:
  sentinel:
    enabled: true

过程记录:
1、限流失败的情况,跟线程池无关,我最开始将tomcat线程池的线程设置为1,发现也没有限流成功。
2、命名空间需要加上,我是排查了很久才发现sentinel的nacos数据源为空,也就是说没有读取到nacos上的配置,后来将namespace加入yaml才行。
3、网上说的sentinel跟hystrix冲突的问题,我测试了一下,没有发现有冲突地方。
4、Handler dispatch failed; nested exception is java.lang.NoSuchMethodError,这个是依赖包版本冲突问题,去仓库看看是否有多余的版本,删除多余的版本。
5、关于依赖sentinel-annotation-aspectj,我这里也不需要,我用的是SentinelResource注解,不需要做额外的一些配置。
6、启动类run configuration和setting -maven- runner不需要一些VM options的参数配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值