Sentinel | 配置持久化

2020-07-23  本文已影响0人  乌鲁木齐001号程序员

Sentinel 的工作模式

sentinel 工作模式.png

Sentinel 引入配置中心

Sentinel 引入配置中心.png
启动 zookeeper

修改 sentinel-dashboard 的源码

打开项目 sentinel-dashboard
修改 pom 文件
<!--for Zookeeper rule publisher sample-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>${curator.version}</version>
<!--            <scope>test</scope>-->
</dependency>
把已经写好的整合 zookeeper 的代码发到合适的位置
改代码

原来的:

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

改成:

@Autowired
@Qualifier("flowRuleZookeeperProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleZookeeperPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
改配置文件
server.port=8082
改页面

原来的:

<li ui-sref-active="active" ng-if="!entry.isGateway">
  <a ui-sref="dashboard.flowV1({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>
直接运行启动类

重新配置 Sentinel 客户端(微服务:order)

用代码配置的规则都不要了
sentinel-dashboard 的地址改一下
spring:
  application:
    # sentinel-bashboard 中会显示这个名字
    name: orderApi
  cloud:
    sentinel:
      transport:
        # 在 9080 启动 orderApi 的时候,sentinel 还会在 8719 这个端口起一个服务和 sentinel-dashboard 通信(发心跳)
        port: 8719
        # sentinel-dashboard 的地址
        dashboard: localhost:8082

配置规则

配置流控规则 createOrder (sentinel-dashboard 中)

让 Sentinel 知道规则配置在 zookeeper 中

依赖
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-zookeeper</artifactId>
    <version>1.5.2</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>
application.yml
# 让 Sentinel 客户端(orderApi)知道去 zookeeper 中拿配置规则 
sentinel:
  zookeeper:
    address: 127.0.0.1:2181
    path: /sentinel_rule_config
配置类
package com.lixinlei.security.order.config;

import java.util.List;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.zookeeper.ZookeeperDataSource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;

/**
 * 这里配置,让 Sentinel 客户端到 zookeeper 中读配置规则
 */
@Component
public class SentinelConfigZookeeper {

    @Value("${sentinel.zookeeper.address}")
    private String zkServer;

    @Value("${sentinel.zookeeper.path}")
    private String zkPath;

    @Value("${spring.application.name}")
    private String appName;

    /**
     * 这个 Bean 构造好了之后,马上就取 zookeeper 中读配置规则
     */
    @PostConstruct
    public void loadRules() {

        // 第一个泛型 String,就是应用的名字,orderApi,
        // 第二个泛型,就是这个应用对应的一组流量规则;
        ReadableDataSource<String, List<FlowRule>> flowRuleDataSource
                = new ZookeeperDataSource<>(zkServer,
                zkPath + "/" + appName,
                // source 就是从 zookeeper 中读出来的字符串
                source -> JSON.parseArray(source, FlowRule.class));

        // 把从 zookeeper 中读到的配置规则,写入内存
        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
    }

}

重启之后,在 sentinel-dashboard 配置的规则就可以在 orderApi 中生效了,此时 sentinel-dashboard 和 orderApi 之间就没有直接通信了,两者通过 zookeeper 完成交互。

上一篇下一篇

猜你喜欢

热点阅读