结合nacos实现sentinel网关流控规则持久化

前期已实现结合nacos持久化sentinel流控与熔断规则功能,本次网关流控规则持久化依葫芦画瓢。
1、gateway网关sentinel控制台
在这里插入图片描述

2、sentinel服务 sidebar.html部分代码
网关流控规则与普通服务流控规则有区别。

          <li ui-sref-active="active" ng-if="entry.isGateway">
            <a ui-sref="dashboard.gatewayFlow({app: entry.app})">
              <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则</a>
          </li>

          <li ui-sref-active="active" ng-if="!entry.isGateway">
            <a ui-sref="dashboard.flow({app: entry.app})">
              <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则</a>
          </li>

3、定位到网关服务的controller类GatewayFlowRuleController.java
在这里插入图片描述
4、修改 NacosConfigUtil.java 添加网关流控dataId后缀常量

public static final String GATEWAY_FLOW_DATA_ID_POSTFIX = "-gateway-flow-rules";

5、修改nacosConfig.java 添加GatewayFlowRuleEntity的Converter转换

    @Bean
    public Converter<List<GatewayFlowRuleEntity>, String> gatewayFlowRuleEntityEncoder() {
        return JSON::toJSONString;
    }

    @Bean
    public Converter<String, List<GatewayFlowRuleEntity>> gatewayFlowRuleEntityDecoder() {
        return s -> JSON.parseArray(s, GatewayFlowRuleEntity.class);
    }

6、新增网关流控规则发布类GatewayFlowRuleNacosPublisher.java

@Component("gatewayFlowRuleNacosPublisher")
public class GatewayFlowRuleNacosPublisher implements DynamicRulePublisher<List<GatewayFlowRuleEntity>> {

    @Autowired
    private ConfigService configService;
    @Autowired
    private Converter<List<GatewayFlowRuleEntity>, String> converter;

    @Override
    public void publish(String app, List<GatewayFlowRuleEntity> rules) throws Exception {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return;
        }
        configService.publishConfig(app + NacosConfigUtil.GATEWAY_FLOW_DATA_ID_POSTFIX,
            NacosConfigUtil.GROUP_ID, converter.convert(rules));
    }
}

7、新增网关流控规则提供类GatewayFlowRuleNacosProvider.java

@Component("gatewayFlowRuleNacosProvider")
public class GatewayFlowRuleNacosProvider implements DynamicRuleProvider<List<GatewayFlowRuleEntity>> {

    @Autowired
    private ConfigService configService;
    @Autowired
    private Converter<String, List<GatewayFlowRuleEntity>> converter;

    @Override
    public List<GatewayFlowRuleEntity> getRules(String appName) throws Exception {
        String rules = configService.getConfig(appName + NacosConfigUtil.GATEWAY_FLOW_DATA_ID_POSTFIX,
            NacosConfigUtil.GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }
        return converter.convert(rules);
    }
}

8、修改GatewayFlowRuleController.java
8.1
在这里插入图片描述

//    @Autowired
//    private SentinelApiClient sentinelApiClient;
    @Autowired
    @Qualifier("gatewayFlowRuleNacosProvider")
    private DynamicRuleProvider<List<GatewayFlowRuleEntity>> ruleProvider;
    @Autowired
    @Qualifier("gatewayFlowRuleNacosPublisher")
    private DynamicRulePublisher<List<GatewayFlowRuleEntity>> rulePublisher;

8.2 修改 @GetMapping(“/list.json”)
在这里插入图片描述

//            List<GatewayFlowRuleEntity> rules = sentinelApiClient.fetchGatewayFlowRules(app, ip, port).get();
            List<GatewayFlowRuleEntity> rules = ruleProvider.getRules(app);
            if (rules != null && !rules.isEmpty()) {
                for (GatewayFlowRuleEntity entity : rules) {
                    entity.setApp(app);
                }
            }

8.3 修改方法@PostMapping(“/new.json”)
在这里插入图片描述

            entity = repository.save(entity);
            publishRules(app);

8.4 修改方法@PostMapping(“/save.json”)
在这里插入图片描述

            entity = repository.save(entity);
            publishRules(app);

8.5 修改方法@PostMapping(“/delete.json”)
在这里插入图片描述

            repository.delete(id);
            publishRules(oldEntity.getApp());

8.6 新增方法publishRules(String app)

    private void publishRules(/*@NonNull*/ String app) throws Exception {
        List<GatewayFlowRuleEntity> rules = repository.findAllByApp(app);
        rulePublisher.publish(app, rules);
    }

9、验证已实现sentinel网关流控规则持久化,sentinel nacos修改规则可相互同步。
9.1 sentinel控制台新增一条网关流控规则,查看nacos新增了一条dataId为gateway-service-gateway-flow-rules的配置
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
9.2 修改nacos配置将阈值调整为2,sentinel控制台刷新规则阈值已更新为2。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值