IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> sentinel+Gateway+nacos双向推拉(修改sentinel源码) -> 正文阅读

[Java知识库]sentinel+Gateway+nacos双向推拉(修改sentinel源码)

springboot集成sentinel和nacos

  1. 导入依赖
<!--        nacos注册中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--        nacos配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!--需要加入此依赖才会读取bootstrap配置文件-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>3.0.3</version>
</dependency>

<!--        集成sentinel 版本是1.8.0,根据自己的版本而定,不一样可能会有bug-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
  1. 添加配置
spring:
  application:
    name: gateway
    sentinel:
      transport:
        dashboard: localhost:9000
        port: 8719 #应用与Sentinel控制台交互的端口
        # 应用与Sentinel控制台的心跳间隔时间
        heartbeat-interval-ms: 10000 #默认是10s
        # 此配置的客户端IP将被注册到 Sentinel Server 端
        client-ip: localhost
      #是否提前触发 Sentinel 初始化
      eager: true
      filter:
        enabled: false
      scg:
        fallback:
          mode: response # 响应模式 response、redirect
          response-status: 444 # 响应状态码
          response-body: 服务器炸了!让它先缓缓哈 # 响应信息
          content-type: application/json
          order: -100
          redirect: /errorPage.html # 响应模式为 'redirect' 模式对应的重定向 URL
  1. 修改sentinel控制台源码
    下载地址
    https://github.com/alibaba/Sentinel

修改sentinel-dashboard的源码

将此路径下的文件全部复制到下下面的路径下
在这里插入图片描述

在这里插入图片描述
修改NacosConfig,换成自己的要拉取的nacos缓存
在这里插入图片描述

修改NacosConfigUtil
默认配置文件的分组在SENTINEL_GROUP,根据自己的修改就行
在这里插入图片描述

剩下四个文件就是我们要自己创建的,用来从nacos推拉配置

  • GatewayApiNacosProvider
/**
 * @author xiaohong
 * @version 1.0
 * @date 2021/11/17 0017 11:22
 * @description 从nacos拉取网关api分组配置规则
 */
@Component
public class GatewayApiNacosProvider {

    @Autowired
    private ConfigService configService;

    /**
     * 从nacos拉取配置
     * @param appName
     * @return
     * @throws Exception
     */
    public List<ApiDefinitionEntity> fetchApis(String appName) throws Exception {
    // 随便取得名字,用来保存对应配置,记得先在nacos里创建好,初始值为[]
        String rules = configService.getConfig("sentinel-gateway-gw-api-group-rules.json",
                NacosConfigUtil.GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }

        List<ApiDefinitionEntity> list = new ArrayList<>();

        List result = JSON.parseObject(rules, List.class);

        if (result != null && result.size() > 0){
            for (Object o : result) {
                ApiDefinitionEntity apiDefinitionEntity = JSON.toJavaObject((JSON) o, ApiDefinitionEntity.class);
                list.add(apiDefinitionEntity);
            }
        }

        return list;
    }

}
  • GatewayApiNacosPublisher
/**
 * @author xiaohong
 * @version 1.0
 * @date 2021/11/17 0017 11:29
 * @description 网关api分组规则推送到nacos
 */
@Component
public class GatewayApiNacosPublisher {

    @Autowired
    private ConfigService configService;


    public Boolean modifyApis(String app, List<ApiDefinitionEntity> rules) {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return false;
        }
        try {
         // 随便取得名字,用来保存对应配置,记得先在nacos里创建好,初始值为[]
            configService.publishConfig("sentinel-gateway-gw-api-group-rules.json",
                    NacosConfigUtil.GROUP_ID, JSON.toJSONString(rules));
            return true;
        } catch (NacosException e) {
            e.printStackTrace();
            return false;
        }
    }

}
  • GatewayFlowRuleNacosProvider
/**
 * @author xiaohong
 * @version 1.0
 * @date 2021/11/17 0017 11:37
 * @description 使用nacos拉取网关流控规则
 */
@Component
public class GatewayFlowRuleNacosProvider {

    @Autowired
    private ConfigService configService;

    /**
     * 从nacos拉取配置
     * @param appName
     * @return
     * @throws Exception
     */
    public List<GatewayFlowRuleEntity> fetchGatewayFlowRules(String appName) throws Exception {
    // 随便取得名字,用来保存对应配置,记得先在nacos里创建好,初始值为[]
        String rules = configService.getConfig("sentinel-gateway-gw-flow-rules.json",
                NacosConfigUtil.GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }

        List<GatewayFlowRuleEntity> list = new ArrayList<>();

        List result = JSON.parseObject(rules, List.class);

        if (result != null && result.size() > 0){
            for (Object o : result) {
                GatewayFlowRuleEntity gatewayFlowRuleEntity = JSON.toJavaObject((JSON) o, GatewayFlowRuleEntity.class);
                list.add(gatewayFlowRuleEntity);
            }
        }

        return list;
    }

}
  • GatewayFlowRuleNacosPublisher
/**
 * @author xiaohong
 * @version 1.0
 * @date 2021/11/17 0017 11:38
 * @description 使用nacos推送网关流控规则
 */
@Component
public class GatewayFlowRuleNacosPublisher {

    @Autowired
    private ConfigService configService;


    public Boolean modifyGatewayFlowRules(String app, List<GatewayFlowRuleEntity> rules) {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return false;
        }
        try {
        // 随便取得名字,用来保存对应配置,记得先在nacos里创建好,初始值为[]
            configService.publishConfig("sentinel-gateway-gw-flow-rules.json",
                    NacosConfigUtil.GROUP_ID, JSON.toJSONString(rules));
            return true;
        } catch (NacosException e) {
            e.printStackTrace();
            return false;
        }
    }

}

然后用我们自己写的方法替换掉原来的方法在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
nacos创建配置文件
在这里插入图片描述
这里的配置记得要和自己在NacosConfig和NacosConfigUtil配的一样,名字也要和那四个文件里取的匹配,初始值都是空数组[]

测试

运行sentinel-dashboard
启动前在配置文件里加段配置,配置sentinel启动的端口号,与gateway里的配置对应上

server.port=9000

在这里插入图片描述

启动gateway
在启动参数里加入-Dcsp.sentinel.app.type=1
在这里插入图片描述
告诉sentinel表明是gateway模式

登录sentinel,默认用户名密码是sentinel-sentinel
也可以自己在配置文件处修改
在这里插入图片描述

登录进去可以看到监听到的网关服务
在这里插入图片描述
当前配置都为空
在这里插入图片描述

创建一个试试
在这里插入图片描述
在这里插入图片描述
去nacos看看
在这里插入图片描述
在这里插入图片描述
可以看到配置已经写进来了
修改试试
在这里插入图片描述
在这里插入图片描述
nacos也同步修改了

此刻也就可以将修改好的sentinel-dashboard打包了
在这里插入图片描述

当然
为避免每次切换环境都需要修改源码,可以将sentinel也注册到nacos管理,把nacos作为配置中心,把一些动态修改的配置放到nacos中
这里就不演示了
掉头发了
睡觉了

原创不易,求个赞不过分吧~

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:30:07  更:2021-11-19 17:31:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:38:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码