В прошлой статье мы рассказали, как автоматически синхронизироваться с 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> 流控规则
</a>
</li>
изменить на:
<li ui-sref-active="active">
<a ui-sref="dashboard.flow({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i> 流控规则
</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
проект:
- Гитхаб:GitHub.com/first87112/sp…
- Гостиница:git ee.com/brother space/S…
Если вы заинтересованы в них, добро пожаловать, пометьте, подпишитесь, добавьте в избранное и вперед, чтобы поддержать!