文章目录
- 4.1.1 方式一:主流框架的默认适配定义资源
- 4.1.2 方式二:抛出异常的方式定义资源
- 4.1.3 方式三:返回布尔类型的定义资源
- 4.1.4 方式四:注解方式定义资源:fire::fire::fire:
- :one:添加Sentinel的Nacos支持
- :two:在Nacos中定义策略
- :three:声明一个资源,用于流控
- :four: 配置Nacos和Sentinel
- :five:启动应用,查看是否配置成功
Sentinel-dashboard搭建
一、官方地址
Sentinel-dashboard官方下载地址:https://github.com/alibaba/Sentinel/releases 下载jar包
SpringCloud Alibaba 官方版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
Spring Cloud Alibaba Sentinel官网文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
二、Sentinel-dashboard后台启动
2.1 windows环境
注意:
Sentinel-dashboard需要在JDK1.8及以上的版本登录
由于Sentinel-dashboard使用Springboot写的一个项目,所以默认是集成了Tomcat,但是Sentinel-dashboard的端口号默认是8080与Tomcat冲突,
所以启动的时候需要修改端口号。
2.1.1 Sentinel-dashboard启动命令
这里使用
8090
端口作为访问Snetinel-dashboard的管理页面的端口号
【不指定输出日志的命令示例】
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar 【jar包的名称】
【指定输出日志的命令】
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.log.dir=C:logssentinel-dashboard -jar 【jar包的名称】
访问地址http://localhost:8070/
Sentinel-dashboard的登录密码和账户:
账户: sentinel
密码: sentinel
2.1.2 Sentinel dashboard控制台启动配置项
- Dserver.port=8080:用于指定 Sentinel 控制台端口为 8080,如若8080端口冲突,可使用 -Dserver.port=新端口 进行设置。。
- Dcsp.sentinel.dashboard.server=localhost:8080:指定控制台地址和端口,会自动向该地址发送心跳包。地址格式为:hostIp:port,l配置成ocalhost:8080即监控自己
- Dproject.name=sentinel-dashboard:指定Sentinel控制台程序显示的名称
-Dcsp.sentinel.log.dir:指定Sentinel 日志文件目录,默认是:${user.home}/logs/csp/ - Dcsp.sentinel.api.port=xxxx:本地的 Sentinel 客户端端口(可选,默认是 8719,有冲突会尝试向后探测)。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口(默认是 8719)。
- Dcsp.sentinel.app.type=1:从 1.6.3 版本开始,控制台支持网关流控规则管理。启动参数以将您的服务标记为 API Gateway,在接入控制台时您的服务会自动注册为网关类型,然后您即可在控制台配置网关规则和 API 分组。
用户可以通过如下参数进行鉴权配置:
- Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;
- Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel;
- Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;
同样也可以直接在 Spring properties 文件中进行配置。
注意:部署多台控制台时,session 默认不会在各实例之间共享,这一块需要自行改造。
这里说明一下:我们如果想要自定义一个Sentinel-dashboard的项目,则可以通过启动时配置一定的启动参数来完成,具体如下:
java -Dserver.port=8070 -Dcsp.sentinel.dashboard.server=localhost:8070 -Dproject.name=sentinel-helloworld -jar 【jar包的名称】
这里是指定一个名称为sentinel-helloworld的项目,
然后在eclispe里面通过配置JVM启动参数来实现将服务的流量监控数据同步到sentinel-dashboard的控制面板上
-Dcsp.sentinel.dashboard.server=localhost:8070
-Dproject.name=sentinel-helloworld
启动完成后,多刷新几次,保证数据同步过来,也可以测试几次失效流量控制的情况
出现问题: 但是这样子有的情况下我也不清楚具体原因是什么,就是出不来,然后我就重新引入了 另外的Sentinel的依赖
解决问题:
<!--服务容错-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
通过配置文件的方式来完成dashBoard的搭建
spring:
cloud:
sentinel:
transport:
port: 8071 #跟控制台交流的端口,随意指定一个未使用的端口即可
dashboard: localhost:8070 # 指定控制台服务的地址
这时候我们再次重启Sentinel-dashboard和HelloWorld的这个项目
访问localhost:8080
登录,多次刷新应用程序
然后后来我有用Idea去使用我第一次的写法尝试后,是没有问题的,可能是我的Eclispe配置的问题,总之,是成功搭建完成了Sentinel-dashboard的环境
三、使用管理页面进行流控管理
上一篇的末尾写了一个使用代码的方式编程完成流量控制的方式。
但是在日常的开发中,我们也需要使用到管理端完成流控规则的设置。
这里我们把编程式的流量控制规则代码注释掉以后,再次访问http://localhost:8090/hello,去到Sentinel-dashboard,我们发现此时无论我们怎么刷新,此时都不会出现流量控制的现象。
首先在管理页面新建一个流控规则
注意:
这里的资源名是我们通过SphU.entry("Hello World")
来设置的资源名,必须哟啊保证一致,否则无法生效
这是我们保存后,再次刷新,可以发现就有了流量控制的监控。
四、Sentinel的基本使用
4.1 定义资源
资源是Sentinel的关键概念。它可以是Java引用程序中的任何内容,例如:有应用程序提供的服务,或者是引用程序调用的其他应用程序,甚至可以是一段代码,在接下来的文档中,我们都会使用资源来描述迭代代码。
只要通过Sentinel API定义的代码,就是资源。能够被Sentinel保护起来,大部分情况下,可以使用方法签名,URL,甚至是服务名作为资源的标识来唯一的定位某一个资源。
使用Sentinel来进行资源保护,主要分为以下几个步骤:
- 定义资源
- 定义规则
- 检验规则是否生效
只要有了资源,就可以在任何时候灵活的定义各种流量控制的规则。
4.1.1 方式一:主流框架的默认适配定义资源
为了减少开发过称中的复杂度,Sentinel对大多数的主流框架都有默认的适配,例如:Dubbo,SpringCloud,Web Servlet等等。,我们只需要引入对应的依赖即可方便的整合Sentinel。
4.1.2 方式二:抛出异常的方式定义资源
SphU
就是包含了try-catch风格的API,用这种方式,当资源发生了限流以后会抛出BlockException,这时候,我们就可以进行限流之后的逻辑操作
try (Entry hai = SphU.entry(资源名称)) {
// 被保护的代码逻辑
} catch (BlockException e) {
e.printStackTrace();
// 降级处理的代码逻辑
}
4.1.3 方式三:返回布尔类型的定义资源
SphO
提供if-else风格的API,这种方式,当资源发生了限流之后会返回false,这个时候可以通过返回值,进行限流之后的逻辑操作,示例代码:
// 资源名可以使用任意类型的业务语义的字符串
if (SphO.entry("自定义的资源名")) {
// 务必保证finally会被执行 也就是catch代码块可以没有,但是finally代码快必须有
try {
/*
被保护的业务逻辑
*/
}finally {
SphO.exit();
}
}
注意:SphO.entry(xxx) 需要与SphO.exit()方法成对出现,匹配调用,位置正确。
否则会导致调用链记录异常。抛出ErrorEntryFreeExecption异常