要通过 Sentinel 控制台配置集群流控规则,需要对控制台进行改造。主要改造规则可以参考:
https://github.com/alibaba/Sentinel/wiki/Sentinel-控制台(集群流控管理)#规则配置
其控制台推送规则:
将规则推送到Nacos或其他远程配置中心
Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存。
控制台监听Nacos配置变化,如发生变化就更新本地缓存。从而让控制台本地缓存总是和Nacos一致。
0x01:改造Sentinel
下载Sentinel 源代码,然后对sentinel-dashboard模块进行改造
https://github.com/alibaba/Sentinel/archive/1.7.2.zip
对pom.xml进行修改
com.alibaba.csp
sentinel-datasource-nacos
test
将
com.alibaba.csp
sentinel-datasource-nacos
修改java代码
找到如下目录(位于test目录)
sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos
将整个目录拷贝到
sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos
修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2.java
修改成
修改HTML页面
找到sidebar.html页面
sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar.html并找到如下代码段后,并把注释放开
修改后
经过以上步骤就已经把流控规则改造成推模式持久化了。
0x02:编译生成jar包
执行命令
mvn cleanpackage-DskipTests
编译成功后,在项目的 target 目录可以找到sentinel-dashboard.jar ,执行以下命令可以启动控制台:
java-jarsentinel-dashboard.jar
0x03:改造微服务
新建项目olive-nacos-sentinel-datasource
对应的pom.xml文件引入
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.sentinel
olive-nacos-sentinel-datasource
0.0.1-SNAPSHOT
jar
org.springframework.boot
spring-boot-starter-parent
2.1.3.RELEASE
olive-nacos-sentinel-datasource
http://maven.apache.org
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
com.alibaba.csp
sentinel-datasource-nacos
org.springframework.cloud
spring-cloud-dependencies
Greenwich.SR3
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import
新建SpringBoot启动类
packagecom.olive;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Hello world!
*
*/
@SpringBootApplication
publicclassApplication{
publicstaticvoidmain(String[] args){
SpringApplication.run(Application.class, args);
}
}
创建控制器
package com.olive.controller;
importjava.util.HashMap;
importjava.util.Map;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RestController;
@RestController
publicclassUserController{
@GetMapping("/getUser")
publicMap getUser() {
Map result =newHashMap<>();
result.put("code","000000");
result.put("message","ok");
returnresult;
}
}
修改配置文件application.yml
spring:
application:
name: olive-nacos-sentinel-datasource
cloud:
sentinel:
transport:
dashboard: localhost:8080
datasource:
# 名称随意
flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-flow-rules
groupId: SENTINEL_GROUP
# 规则类型,取值见:
# org.springframework.cloud.alibaba.sentinel.datasource.RuleType
rule-type: flow
server:
port: 8866
0x04:验证
主要验证场景
场景1:用Sentinel控制台【菜单栏的 流控规则 V1 】推送流控规则,规则会存储到Nacos;
场景2:直接在Nacos上修改流控规则,然后刷新Sentinel控制台,控制台上的显示也会被修改;
场景3:重启Sentinel控制台,并重启微服务;刷新控制台,可以发现规则依然存在。
启动服务
Sentinel控制台
Nacos
olive-nacos-sentinel-datasource
Nacos中创建限流规则的配置
http://127.0.0.1:8848/nacos/#/login
[
{
"resource":"/getUser",
"limitApp":"default",
"grade":1,
"count":5,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
如下图
访问接口(olive-nacos-sentinel-datasource服务提供的接口)
http://localhost:8866/getUser
访问Sentinel控制台
http://127.0.0.1:8080/#/login
以上这条记录就是在Nacos中配置的限流规则。可以测试在Sentinel控制台修改规则是否同步到Nacos,或者在Nacos上修改规则是否同步到Sentinel控制台。