Las reglas de configuración de Sentinel persisten en Nacos

La versión 1.4.2 de nacos y la versión 1.8.3 de sentinel utilizadas en este artículo

pregunta

Cuando la aplicación cliente integrada con Sentinel se reinicia, todas las reglas configuradas en la consola desaparecen. Si necesita usar el entorno de producción, debe conservar la configuración de la regla. Implementemos la persistencia de la configuración de reglas de Sentinel.

Agregar dependencia de Maven

Si necesita persistir en nacos, debe agregar dependencias relevantes de Maven

<!-- Sentinel Datasource 依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId>
</dependency>

<!-- Sentinel Datasource Nacos 依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

configurar

Las convenciones de ID de datos y ID de grupo predeterminadas para la adaptación de Nacos son las siguientes:

  • ID de grupo: SENTINEL_GROUP
  • ID de datos de configuración de regla: {appName}-flow-rules, por ejemplo, si el nombre de la aplicación es appA, el dataId es appA-flow-rules
spring:
	cloud:
		sentinel:
			datasource:
			  # 自定义命名
			  flow-rule:
			    # 支持多种持久化数据源:file、nacos、zk、apollo、redis、consul
			    nacos:
			      # naco服务地址
			      server-addr: localhost:8848
			      # 命名空间,根据环境配置
			      namespace: public
			      # 这里我做了一下细分,不同规则设置不同groupId
			      group-id: SENTINEL_FLOW_GROUP
			      # 仅支持JSON和XML类型
			      data-id: ${spring.application.name}-flow-rules.json
			      # 规则类型:flow、degrade、param-flow、system、authority
			      rule-type: flow
			      # nacos开启了认证需要配置username、password
			      # username: nacos
			      # password: nacos
			      

configuración nacos

inserte la descripción de la imagen aquí

[{
	"clusterMode": false,
	"controlBehavior": 0,
	"count": 5.0,
	"grade": 1,
	"limitApp": "default",
	"resource": "/sentinel/flow",
	"strategy": 0
}]

Documentación oficial detallada para la configuración de reglas: https://sentinelguard.io/zh-cn/docs/basic-api-resource-rule.html

Una vez completada la configuración, reinicie el proyecto para ver que la configuración de la regla todavía existe. Modificando la configuración en Nacos también se puede sincronizar con la consola Sentinel en tiempo real.
inserte la descripción de la imagen aquí

Las reglas agregadas por la consola Sentinel se envían a Nacos

De lo anterior, parece que las reglas configuradas pueden persistir y las reglas modificadas por el centro de configuración de Nacos pueden sincronizarse con la consola Sentinel en tiempo real. Sin embargo, agregar, modificar y eliminar reglas en la consola no se puede sincronizar con el centro de configuración de Nacos. Se agregó una regla a la consola que se perderá si el cliente se reinicia. Implementemos la consola para agregar reglas y enviarlas a Nacos.

De acuerdo con la documentación oficial: la consola Sentinel proporciona interfaces DynamicRulePublisher y DynamicRuleProvider para implementar reglas de inserción y extracción de la dimensión de la aplicación.

Agregar dependencia de Maven

<!-- 添加Nacos配置中心依赖 -->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.10</version>
</dependency>

Agregar configuración de application.properties

groupId tiene un nombre personalizado de acuerdo con las restricciones de nomenclatura.

# 配置nacos服务地址与命名空间,可根据环境配置命名空间
nacos.config.server-addr=localhost:8848
nacos.config.namespace=8b1673aa-38da-48c6-bc5a-6df956ed0956

# 配置nacos groupId,可以自定义groupId
# 跟上面一样按照不同规则设置不同groupId
sentinel.nacos.flow.group-id=SENTINEL_FLOW_GROUP
sentinel.nacos.degrade.group-id=SENTINEL_DEGRADE_GROUP
sentinel.nacos.auth.group-id=SENTINEL_AUTH_GROUP
sentinel.nacos.param.group-id=SENTINEL_PARAM_GROUP
sentinel.nacos.system.group-id=SENTINEL_SYSTEM_GROUP

Personalice la inserción de FlowRulePublisher e implemente la interfaz DynamicRulePublisher

/**
 * @ClassName FlowRulePublisher
 * @Description 推送流控规则
 * @Author tigerkin
 * @Date 2022/3/9 14:40
 */
@Component
public class FlowRulePublisher implements DynamicRulePublisher<List<FlowRuleEntity>> {

    private static final Logger LOG = LoggerFactory.getLogger(FlowRulePublisher.class);

    @Value("${sentinel.nacos.flow.group-id}")
    private String nacosFlowGroupId;

    @Autowired
    private NacosConfigProperties nacosConfigProperties;

    /**
     * 重要属性:
     * resource	        资源名,资源名是限流规则的作用对象
     * count	        限流阈值
     * grade	        限流阈值类型,QPS 或线程数模式	                                 QPS 模式
     * limitApp	        流控针对的调用来源	                                             default,代表不区分调用来源
     * strategy	        调用关系限流策略:直接、链路、关联	                             根据资源本身(直接)
     * controlBehavior	流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流	 直接拒绝
     * @param app app name
     * @param rules list of rules to push
     * @throws Exception
     */
    @Override
    public void publish(String app, List<FlowRuleEntity> rules) throws Exception {
        if (StringUtil.isBlank(app)) {
            return;
        }
        if (rules == null) {
            return;
        }

        LOG.info("========> 流控规则推送 -> app: {} rules:{}", app, JSON.toJSONString(rules));

        List<FlowRuleEntity> flowFules = rules.stream().map(data -> {
            FlowRuleEntity entity = new FlowRuleEntity();
            entity.setResource(data.getResource());
            entity.setCount(data.getCount());
            entity.setGrade(data.getGrade());
            entity.setLimitApp(data.getLimitApp());
            entity.setStrategy(data.getStrategy());
            entity.setControlBehavior(data.getControlBehavior());
            return entity;
        }).collect(Collectors.toList());

        /**
         * sentinel推送nacos命名约束
         * 流控规则 dataId: {appName}-flow-rules,比如应用名为 appA,则 dataId 为 appA-flow-rules
         */
        String dataId = String.format("%s-flow-rules.json", app);

        HttpHandler.handler(flowFules, nacosConfigProperties, nacosFlowGroupId, dataId);
    }
}

clase HttpHandler

/**
 * @ClassName HttpHandler
 * @Description
 * @Author tigerkin
 * @Date 2022/3/10 11:06
 */
public class HttpHandler {

    private static final Logger LOG = LoggerFactory.getLogger(HttpHandler.class);

    public static void handler(Object rules, NacosConfigProperties nacosConfigProperties, String groupId, String dataId) throws IOException {
        StringJoiner param = new StringJoiner("&");
        param.add(String.format("tenant=%s", nacosConfigProperties.getNamespace())); // Nacos 的命名空间ID字段
        param.add(String.format("dataId=%s", dataId));
        param.add(String.format("group=%s", groupId));
        param.add(String.format("content=%s", URLEncoder.encode(JSON.toJSONString(rules), "UTF-8")));
        param.add(String.format("type=%s", "json"));

        String url = String.format("http://%s/nacos/v1/cs/configs?%s", nacosConfigProperties.getServerAddr(), param.toString());
        HttpPost httpPost = new HttpPost(url);

        CloseableHttpClient httpclient = HttpClients.createDefault();

        CloseableHttpResponse response = httpclient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) {
            HttpEntity entity = response.getEntity();
            String result = EntityUtils.toString(entity);
            LOG.info("========> 发布成功:{}", result);
        } else {
            LOG.error("========> 发布失败:{}", response.toString());
        }
    }
}

Después de implementar la interfaz de inserción, busque el controlador configurado por las reglas de Sentinel y agregue la lógica de inserción. Lo que estoy transformando aquí es FlowControllerV1.

Agregue propiedades de inyección de dependencia:
inserte la descripción de la imagen aquí
finalmente, busque el método publisherRules en el controlador y agregue la llamada al método push.

Sentinel enviará una solicitud al cliente para sincronizar la configuración de la regla después de cambiar la regla.

inserte la descripción de la imagen aquí
Agregue las reglas en la consola a continuación y se enviarán al centro de configuración de Nacos. Hasta ahora, las reglas de configuración de Sentinel se mantienen en Nacos.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Referencia:
Documentación de la API abierta de Nacos: https://nacos.io/zh-cn/docs/open-api.html
Dirección de Github de Sentinel: https://github.com/alibaba/Sentinel/releases
Documentación oficial de Sentinel:
https:/ /github.com/alibaba/Sentinel/wiki/Use in production environment-Sentinel
https://github.com/alibaba/Sentinel/wiki/Sentinel-console (gestión de control de flujo de clúster)#configuración de reglas

Proporcione la ubicación del código fuente de procesamiento de lógica de negocios relevante, los zapatos de los niños interesados ​​​​pueden echar un vistazo.

La ubicación de origen donde el cliente maneja las solicitudes de Sentinel:

jar: sentinel-transport-common-1.8.3.jar
package: com.alibaba.csp.sentinel.command.handler

inserte la descripción de la imagen aquí
ubicación del código fuente de procesamiento del monitor nacos:

jar: sentinel-datasource-nacos-1.8.3.jar
package: com.alibaba.csp.sentinel.datasource.nacos

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_42270645/article/details/123399569
Recomendado
Clasificación