使用Sentinel Dashboard动态推拉数据同步到Nacos

Posted shiraishi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Sentinel Dashboard动态推拉数据同步到Nacos相关的知识,希望对你有一定的参考价值。

准备工作:

下载Sentinel Dashboard的release版本。地址:https://github.com/alibaba/Sentinel/releases

一 :修改pom.xml中的sentinel-datasource-nacos的依赖,将<scope>test</scope>注释掉,这样才能在主程序中使用。

 

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

 

 二:找到resources/app/scripts/directives/sidebar/sidebar.html中的这段代码: 

 

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

修改为:

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

这样修改之后就会跳转到FlowControllerV2的接口。

 

三:再项目com.alibaba.csp.sentinel.dashboard中新建一个nacos包来实现扩展功能。

@Component
@ConfigurationProperties(prefix = "nacos.server")
public class NacosConfigProperties 

    private String ip;

    private String port;

    private String namespace;

    private String groupId;

    public String getIp() 
        return ip;
    
    public void setIp(String ip) 
        this.ip = ip;
    
    public String getPort() 
        return port;
    
    public void setPort(String port) 
        this.port = port;
    
    public String getNamespace() 
        return namespace;
    
    public void setNamespace(String namespace) 
        this.namespace = namespace;
    
    public String getGroupId() 
        return groupId;
    
    public void setGroupId(String groupId) 
        this.groupId = groupId;
    
    public String getServerAddr() 
        return this.getIp()+":"+this.getPort();
    
    @Override
    public String toString() 
        return "NacosConfigProperties [ip=" + ip + ", port=" + port + ", namespace="
                + namespace + ", groupId=" + groupId + "]";
    




public final class NacosConfigConstant
  public static final String FLOW_DATA_ID_POSTFIX = "-sentinel-flow";
  public static final String GROUP_ID = "DEFAULT_GROUP";
 

 

@Configuration
public class NacosConfig 

    @Autowired
    private NacosConfigProperties nacosConfigProperties;

    /**
     * 非常关键 这里将FlowRuleEntity转换成FlowRule才会对客户端生效
     * @return FlowRule
     */
    @Bean
    public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() 
        return rules -> JSON.toJSONString(rules.stream().map(FlowRuleEntity::toRule).collect(Collectors.toList()), true);
    

    @Bean
    public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() 
        return s -> JSON.parseArray(s, FlowRuleEntity.class);
    

    @Bean
    public ConfigService nacosConfigService() throws Exception 
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, nacosConfigProperties.getServerAddr());
        properties.put(PropertyKeyConst.NAMESPACE, nacosConfigProperties.getNamespace());
        return ConfigFactory.createConfigService(properties);
    

 

四:编写动态推拉模式的扩展代码

@Component("flowRuleNacosProvider")
public class FlowRuleNacosProvider implements DynamicRuleProvider<List<FlowRuleEntity>> 

    private static Logger logger = LoggerFactory.getLogger(FlowRuleNacosProvider.class);

    @Autowired
    private NacosConfigProperties nacosConfigProperties;

    @Autowired
    private ConfigService configService;

    @Autowired
    private Converter<String, List<FlowRuleEntity>> converter;

    @Override
    public List<FlowRuleEntity> getRules(String appName) throws Exception 
        String rules = configService.getConfig(appName + NacosConfigConstant.FLOW_DATA_ID_POSTFIX, nacosConfigProperties.getGroupId(), 3000);
        logger.info("从Nacos中拉取到限流规则信息:",rules);
        if (StringUtil.isEmpty(rules)) 
            return new ArrayList<>();
        
        return converter.convert(rules);
    

 

@Component("flowRuleNacosPublisher")
public class FlowRuleNacosPublisher implements DynamicRulePublisher<List<FlowRuleEntity>> 

    @Autowired
    private NacosConfigProperties nacosConfigProperties;

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

    @Override
    public void publish(String app, List<FlowRuleEntity> rules) throws Exception 
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) 
            return;
        
        configService.publishConfig(app + NacosConfigConstant.FLOW_DATA_ID_POSTFIX, nacosConfigProperties.getGroupId(), converter.convert(rules));
    

 

五:然后将FlowControllerV2中的默认DynamicRuleProviderDynamicRulePublisher修改为:

@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
 

private void publishRules(/*@NonNull*/ String app) throws Exception 
    List<FlowRuleEntity> rules = repository.findAllByApp(app);
    rulePublisher.publish(app, rules);
    logger.info("添加限流规则成功", JSON.toJSONString(rules.stream().map(FlowRuleEntity::toRule).collect(Collectors.toList()), true));
 

六:application.properties配置文件

#nacos
nacos.server.ip=localhost
nacos.server.port=8848
nacos.server.namespace=
nacos.server.group-id=DEFAULT_GROUP

 

以上是关于使用Sentinel Dashboard动态推拉数据同步到Nacos的主要内容,如果未能解决你的问题,请参考以下文章

Sentinel动态推拉数据持久化同步到Nacos

SpringCloud Alibaba Sentinel 服务限流熔断降级 - 基于dashboard方式配制

SpringCloud H版 Hystrix dashboard 可视化监控使用

Sentinel扩展

sentinel-dashboard安装运行(docker)

springboot sentinel使用示例(基于sentinel 1.8),流控,降级,sentinel-dashboard使用,blockHandler和fallback