Измененные правила в Sentinel Dashboard синхронизируются с Nacos.

Java Spring Cloud

В прошлой статье мы рассказали, как автоматически синхронизироваться с Apollo после изменения правил путем преобразования Sentinel Dashboard. В этой статье подробно рассказывается, как синхронизировать измененные правила в Sentinel Dashboard с Nacos после использования Nacos в качестве центра конфигурации. Принцип и анализ следующего преобразования можно найти в предыдущей статье«Измененные правила Sentinel Dashboard синхронизированы с Apollo»Содержание первых двух разделов здесь повторяться не будет.

Код

Давайте посмотрим непосредственно на конкретные шаги преобразования того, как достичь, вот ссылкаSentinel DashboardТестовые случаи для реализации Nacos в исходном коде. Однако в связи с рассмотрением возможности комбинации со Spring Cloud Alibaba он был немного изменен.

первый шаг:Исправлять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>

третий шаг:существуетcom.alibaba.csp.sentinel.dashboard.ruleСоздайте новый пакет nacos внутри пакета, чтобы написать расширенные реализации для Nacos.

четвертый шаг: Создайте класс конфигурации Nacos, конкретный код выглядит следующим образом:

@Configuration
public class NacosConfig {

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

    @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, "localhost");
        return ConfigFactory.createConfigService(properties);
    }
}

Если вы используете среду изоляции пространства имен, вы можетеnacosConfigServiceДобавьте конфигурацию в метод, например:properties.put(PropertyKeyConst.NAMESPACE, "130e71fa-97fe-467d-ad77-967456f2c16d");

пятый шаг: реализация конфигурации Nacos.

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

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

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

    @Override
    public List<FlowRuleEntity> getRules(String appName) throws Exception {
        String rules = configService.getConfig(appName + FLOW_DATA_ID_POSTFIX, GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }
        return converter.convert(rules);
    }
}
  • getRulesв методеappNameПараметр — это имя службы в Sentinel.
  • configService.getConfigМетод представляет собой конкретную операцию получения информации о конфигурации от Nacos. Среди них DataId и GroupId соответственно соответствуют соответствующей конфигурации, когда клиент ее использует. Например, пример здесь соответствует предыдущему"Sentinel использует правила хранения Nacos"Конфигурация в этой статье выглядит следующим образом:
spring.cloud.sentinel.datasource.ds.nacos.groupId=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds.nacos.dataId=${spring.application.name}-sentinel

Примечание. DataId и GroupId на обеих сторонах должны совпадать.

Шаг 6: Реализуйте толчок конфигурации Nacos.

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

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

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

    @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 + FLOW_DATA_ID_POSTFIX, GROUP_ID, converter.convert(rules));
    }
}

  • Большая часть содержимого здесь согласуется с реализацией на предыдущем шаге. Главное, чтобы DataId и GroupId конфигурации хранилища в Nacos не ошиблись.

Шаг 7:Исправлятьcom.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2серединаDynamicRuleProviderа такжеDynamicRulePublisherВнедренный Bean заменяется на реализацию Apollo, которую мы написали выше:

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

Наконец, читатели могут использовать модифицированную дозорную панель этой статьи, прежде чем комбинировать"Sentinel использует правила хранения Nacos"Пример этой статьи для проверки содержания этой статьи.

пример кода

Клиентский код контента, представленный в этой статье, читатели примера могут проверить код на следующем складе.alibaba-sentinel-dashboard-nacosпроект:

Если вы заинтересованы в них, добро пожаловать, пометьте, подпишитесь, добавьте в избранное и вперед, чтобы поддержать!

Рекомендуемые темы