前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Nacos存储Sentinel的限流规则

使用Nacos存储Sentinel的限流规则

作者头像
BUG弄潮儿
发布2020-07-21 14:52:08
3.4K0
发布2020-07-21 14:52:08
举报
文章被收录于专栏:JAVA乐园JAVA乐园

阅读文本大概需要3分钟。

要通过 Sentinel 控制台配置集群流控规则,需要对控制台进行改造。主要改造规则可以参考:

代码语言:javascript
复制
https://github.com/alibaba/Sentinel/wiki/Sentinel-控制台(集群流控管理)#规则配置

其控制台推送规则:

  • 将规则推送到Nacos或其他远程配置中心
  • Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存。

控制台监听Nacos配置变化,如发生变化就更新本地缓存。从而让控制台本地缓存总是和Nacos一致。

0x01:改造Sentinel

下载Sentinel 源代码,然后对sentinel-dashboard模块进行改造

代码语言:javascript
复制
https://github.com/alibaba/Sentinel/archive/1.7.2.zip
  • 对pom.xml进行修改
代码语言:javascript
复制
  <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <scope>test</scope>
  </dependency>

<scope>test</scope>注释掉

代码语言:javascript
复制
  <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
  </dependency>
  • 修改java代码

找到如下目录(位于test目录)

代码语言:javascript
复制
sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos

将整个目录拷贝到

代码语言:javascript
复制
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包

执行命令

代码语言:javascript
复制
mvn clean package -DskipTests

编译成功后,在项目的 target 目录可以找到sentinel-dashboard.jar ,执行以下命令可以启动控制台:

代码语言:javascript
复制
java -jar sentinel-dashboard.jar

0x03:改造微服务

  • 新建项目olive-nacos-sentinel-datasource

对应的pom.xml文件引入

代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sentinel</groupId>
    <artifactId>olive-nacos-sentinel-datasource</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <name>olive-nacos-sentinel-datasource</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

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

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE </version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>
  • 新建SpringBoot启动类
代码语言:javascript
复制
package com.olive;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Hello world!
 *
 */
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
  • 创建控制器
代码语言:javascript
复制
package com.olive.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/getUser")
    public Map<String, Object> getUser() {
        Map<String, Object> result = new HashMap<>();
        result.put("code", "000000");
        result.put("message", "ok");
        return result;
    }
}
  • 修改配置文件application.yml
代码语言:javascript
复制
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

代码语言:javascript
复制
[
    {
        "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控制台

代码语言:javascript
复制
参考:
 https://www.imooc.com/article/details/id/289464
 https://blog.csdn.net/guzhangyu12345/article/details/107432029
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档