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的参数配置。

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

6828

被折叠的 条评论
为什么被折叠?



