banner
Hi my new friend!

山河浪漫,
人间温暖。

Scroll down

sentinel整合控制台和动态规则

控制台的下载和启动

首先可以到这个地址去下载控制台:

https://github.com/alibaba/Sentinel/releases/tag/v1.8.0

下载下来得到的是一个jar包,jar包启动命令:

java -Dserver.port=18080 -Dcsp.sentinel.dashboard.server=localhost:18080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar

参数解析:

| 配置项                              | 类型      | 默认值      | 最小值 | 描述                        |
| -------------------------------- | ------- | -------- | --- | ------------------------- |
| auth.enabled                     | boolean | true     | -   | 是否开启登录鉴权,仅用于日常测试,生产上不建议关闭 |
| sentinel.dashboard.auth.username | String  | sentinel | -   | 登录控制台的用户名,默认为 `sentinel`  |
| sentinel.dashboard.auth.password | String  | sentinel | -   | 登录控制台的密码,默认为 `sentinel`   |
| csp.sentinel.dashboard.server    | String  |          |     | 把信息上传到控制台上面。              |

**注意:**如果加了csp.sentinel.dashboard.server的话,才会有左面的sentine-dashboard选项的。sentine-dashboard其实就是我们指定的project-name,不过基本上控制台还是别加了这个,因为没什么意义。

image-20210202111606083

sentinel整合控制台:

spring-boot层面的整合

pom.xml添加依赖:

<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>${sentinel.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-web-servlet</artifactId> <version>${sentinel.version}</version> </dependency>

启动类:

@SpringBootApplication public class DemoApplication implements ApplicationContextAware { static { System.setProperty("csp.sentinel.dashboard.server","localhost:18080"); //指定控制台的地址 System.setProperty("project.name","sentinel-boot"); //指定sentinel的名字 } public static ApplicationContext applicationContext; public static void main(String[] args) { SpringApplication.run(DemoApplication.class,args); } }

​ 注意:启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口(默认是 8719)。如果没有设置api端口而且8719端口被占用的话,他会往8719端口开始递增。直到找到没有占用的端口为止

配置类,需要加上这个过滤器来做监控:

@Configuration public class FilterConfig { @Bean public FilterRegistrationBean sentinelFilterRegistration() { FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>(); registration.setFilter(new CommonFilter()); registration.addUrlPatterns("/*"); registration.setName("sentinelFilter"); registration.setOrder(1); return registration; } }

contorller端:

@RestController @RequestMapping("/web") public class WebController { @GetMapping("/sayhello") public String sayhello(){ return "sayhello"; } }

效果如下:

image-20210202114733894

注意:

  • 需要发送一个请求到http://127.0.0.1:8888/web/sayhello才能显示出来
  • 有人就会问了,规则是包含了:资源名字和一些规则的参数的。比如我定义了一个hello的资源名,规则是qps=2,失败策略是快速失败,但是我代码中都没有引用这个hello资源名啊。如果是web服务的话,比如我们上面路径是/web/sayHello,我们可以直接定义/web/sayhello为资源名。然后配置规则,他也能对/web/sayhello这个路径起到流控控制的作用
  • 如果在sentinel内置的规则也能显示在控制台的页面上。

效果如下:

1627984437260.jpg

​ 我们可以通过去页面上配置规则就可以达到动态的修改规则了。**但是很遗憾的是:**修改完的规则只能保存到sentinel(不是控制台)的内存中。当sentinel重新启动后,这些规则就会丢失掉。如果我们需要存起来的话,请看跟nacos的结合

spring-cloud层面的整合

跟spring-cloud结合就简单很多了。

引入依赖:

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>

application.yml文件配置:

spring: cloud: sentinel: transport: port: 8719 #指定客户端监控 API 的端口 dashboard: localhost:18080 #控制台的地址 application: name: sentinel-cloud server: port: 8701

只需要这么一配置就可以实现和控制台整合了。如果项目是spirng-cloud的话,建议直接使用这个整合就性了。

sentinel整合nacos

​ nacos有配置中心的功能,只要我们sentinel这边监听nacos的配置信息的变化(配置信息就是规则信息)。就可以实现了动态调整sentinel的规则了。并且再次启动的时候,我们是直接读取nacos上的配置信息。所以能起到一个持久化的作用。

需要的依赖如下:

<dependencies> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-extension</artifactId> </dependency> </dependencies>

动态规则的配置

private static String serverAddr = "localhost:8848"; private static String groupId = "Sentinel:Demo"; private static String dataId = "flowRule:nacos-demo"; //读取nacos里面的规则并且使用这规则 public static void loadRule(){ ReadableDataSource dataSource = new NacosDataSource(serverAddr, groupId, dataId, new Converter<String, List<FlowRule>>() { //把nacos读到的信息,转成List<FlowRule> @Override public List<FlowRule> convert(String source) { // List<FlowRule> flowRules = JSONObject.parseObject(s, new TypeReference<List<FlowRule>>() {}); return JSONObject.parseArray(s, FlowRule.class); } }); FlowRuleManager.register2Property(dataSource.getProperty()); }

​ 原理其实就是:监听groupId是Sentinel:Demo,dataId是flowRule:nacos-demo的配置信息,如果nacos上该配置信息改变的时候就会触发convert方法入参的字符串其实就是nacos上的配置信息,只要我们把配置信息转换成相应的规则返回就能达到效果了

效果如下:

image-20210203115143461

image-20210203114946771

当我们启动项目或者修改nacos的配置文件,就会触发convert方法。上面就是触发传入的s是什么的效果图。

这是我发送到nacos的配置的测试类:

public class NacosConfigSender { //设置配置的规则到nacos上。 groupId: Sentinel:Demo dataId: com.alibaba.csp.sentinel.demo.flow.rule public static void main(String[] args) throws Exception { final String remoteAddress = "localhost"; final String groupId = "Sentinel:Demo"; final String dataId = "flowRule:nacos-demo"; final String rule = "[\n" + " {\n" + " \"resource\": \"TestResource\",\n" + " \"controlBehavior\": 0,\n" + " \"count\": 5.0,\n" + " \"grade\": 1,\n" + " \"limitApp\": \"default\",\n" + " \"strategy\": 0\n" + " }\n" + "]"; ConfigService configService = NacosFactory.createConfigService(remoteAddress); System.out.println(configService.publishConfig(dataId, groupId, rule)); } }

sentinel整合控制台和nacos

image-20210203164544580

整体的架构就像上面的图片一样。首先:

  1. sentinel控制台在页面上修改了规则后,然后把该规则发送到nacos的配置中心上
  2. 因为sentinel客户端监听了nacos上面的配置中心,所以就能等到修改后的规则,从而得到动态修改规则。

但是官方提供的sentinel的jar包不支持这个功能。需要我们去修改一下它的源吗,不过也是很简单的。不需要担心,如果不想自己写的话,可以直接要我的修改完的sentinel控制台。地址:https://gitee.com/gzgyc/sentinel-dashboard.git

下面我就说一下怎么改造把。官方提供了流量控制的例子:

1.rule目录下提供了nacos,apollo,zookeeper这些官方例子,我们先把nacos这个官方例子目录移到上面去先

image-20210203174759645

2.然后在pom.xml文件里,去掉这个 test ,不然依赖不上包

image-20210203175056887

3.修改FlowControllerV2文件。把publisher和provider修改成nacos的

image-20210203175553008

image-20210203175620656

image-20210203175707689

4.sidebar.html 流控规则路由从 dashboard.flowV1 改成 dashboard.flow 即可

img

控制台改造完成,启动即可(这个只是修改了流量控制的规则而已,其他的规则可以看我的github)。

注意点:

  • 上面控制台的改造的点有:

    • 添加了FlowControllerV2,这个类地址是/v2/flow。

    • 前端那里把dashboard.flowV1 改成 dashboard.flow,即是让前端请求FlowControllerV2,下面是源码的截图

      image-20210205095232761

  • 要留意页面是否发送请求的是/v2/flow前缀。可以看到下图为啥有个单机页面,单机页面其实就是没有结合nacos的时候功能。所以千万要注意这个位置。注意:基于上面的这个改造,单机页面是没有回到单机页面这个按钮的。

    image-20210205095427675

问题:规则会保存到nacos的哪个groupId,dataId中:

答:由下图可以知道是groupId: “SENTINEL_GROUP” , dataId: appName + “-flow-rules”。

image-20210203180958423

image-20210203181022759

只要我们sentinel的客户端监听这个groupId和dataId就可以了。所以代码如下:

@Configuration public class NacosConfig { //读取nacos里面的规则并且使用这规则 @PostConstruct public static void loadRule(){ String serverAddr = "localhost:8848"; String groupId = "SENTINEL_GROUP"; String dataId = "sentinel-nacos-dashboard-flow-rules"; ReadableDataSource dataSource = new NacosDataSource(serverAddr, groupId, dataId, new Converter<String, List<FlowRule>>() { //把nacos读到的信息,转成List<FlowRule> @Override public List<FlowRule> convert(String s) { // List<FlowRule> flowRules = JSONObject.parseObject(s, new TypeReference<List<FlowRule>>() {}); return JSONObject.parseArray(s, FlowRule.class); } }); FlowRuleManager.register2Property(dataSource.getProperty()); } }

注意:这里只是改造了流量控制而已,其他的规则还没有规则。想要改造其他的规则,可以看我改造的控制台代码。

简单谈谈改造降级策略的控制台应该怎么搞

查询操作:

image-20210205100104758

这个类我是参考flowRuleNacosProvider类写的。

image-20210205100746785

改造前的逻辑:

  • sentinelApiClient.fetchDegradeRuleOfMachine(app, ip, port): 跟sentinel客户端通讯拿到客户端上面的规则
  • repository.saveAll(rules): 把拿到的规则保存到自己的内存中

改造后的逻辑:

  • ​ ruleProvider.getRules(app): 直接去nacos上面拿取。然后返回

增删改操作:

image-20210205101429027

image-20210205101458844

image-20210205102200951

改造前:

  • 对内存中的规则进行增删改操作
  • 增删改操作成功后,获取该appName的所有的降级熔断规则,然后跟sentinel客户端通讯,推送最新的规则给sentinel客户端。

改造后:

  • 对内存中的规则进行增删改操作
  • 增删改操作成功后,获取该appName的所有的降级熔断规则,推送到nacos上。

具体的看我的gitee:

控制台的地址:https://gitee.com/gzgyc/sentinel-dashboard.git

sentinel代码地址:https://gitee.com/gzgyc/dubbo-demo.git

原文链接:https://www.cnblogs.com/dabenxiang/p/14376990.html

我很可爱,请给我钱

昵称
邮箱
0/200
  • 😂
  • 😀
  • 😅
  • 😊
  • 🙂
  • 🙃
  • 😌
  • 😍
  • 😘
  • 😜
  • 😝
  • 😏
  • 😒
  • 🙄
  • 😳
  • 😡
  • 😔
  • 😫
  • 😱
  • 😭
  • 💩
  • 👻
  • 🙌
  • 🖕
  • 👍
  • 👫
  • 👬
  • 👭
  • 🌚
  • 🌝
  • 🙈
  • 💊
  • 😶
  • 🙏
  • 🍦
  • 🍉
  • 😣
  • OωO
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ°ο°)ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ"(´っω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • Emoji
  • 颜文字
0 条评论