Sentinel | 配置持久化

Sentinel 的工作模式

sentinel 工作模式.png
  • 在 Sentinel 客户端(微服务)中用代码写的配置,在启动后,当有第一次流量进来的时候,会推送给 Sentinel-Dashboard;
  • 在 Sentinel-Dashboard 中的配置,会被推送到 Sentinal 客户端(微服务);
  • 默认情况下,不论 Sentinel-Dashboard 中的配置还是 Sentinal 客户端中的配置,都是在内存中的,一点重启,这些变化过的规则就都消失了;

Sentinel 引入配置中心

Sentinel 引入配置中心.png
  • Sentinel-Dashboard 需要知道,当配置发生变化的时候,要把配置推送到配置中心,持久话保存起来;
  • 客户端要知道,配置全在配置中心里存的呢,一旦配置发生变化,配置中心要把配置推给我;
  • 这样的话,不论是 Sentinel-Dashboard 还是 Sentinel 客户端重启后,都不会丢失配置;
启动 zookeeper
  • bin/zkServer.sh start

修改 sentinel-dashboard 的源码

打开项目 sentinel-dashboard
  • 作为一个 Module 引入项目 ms-security;
修改 pom 文件
  • 把 scope 的 test 注释掉,这样打包的时候,就可以把和 zookeeper 整合相关的依赖打进去了;
<!--for Zookeeper rule publisher sample-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>${curator.version}</version>
<!--            <scope>test</scope>-->
</dependency>
把已经写好的整合 zookeeper 的代码发到合适的位置
  • 其实和 zookeeper 整合的代码是有的,只不过在 test 目录下,把这写代码移到 main 的相同目录下就行了;
  • com.alibaba.csp.sentinel.dashboard.rule.zookeeper从 test 目录下拷贝到 main 下,一共 4 个类;
改代码
  • com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2

原来的:

@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;
改配置文件
  • 位置:sentinel-dashboard/src/main/resources/application.properties
  • 启动的端口改一下,因为 zookeeper 启动的时候,会占用 8080 端口号;
server.port=8082
改页面
  • 位置:src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html

原来的:

<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>
直接运行启动类
  • 位置:com.alibaba.csp.sentinel.dashboard.DashboardApplication

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

用代码配置的规则都不要了
  • com.lixinlei.security.order.config.SentinelConfig 这个类可以直接删了;
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 中)
  • 配置完了 zookeeper 的根目录中就会有一个 sentinel_rule_config 节点,sentinel 所有的规则配置都是放在这个节点下面的;
  • sentinel_rule_config 下面有一个 /orderApi 节点,这个是 order 这个微服务的 spring.application.name
  • 重启 sentinel-dashboard 和 orderApi,sentinel-dashboard 依然还有上次的配置;
  • 此时,虽然限流规则已经通过 sentinel-dashboard 写到 zookeeper 中了,但是 Sentinel 客户端(orderApi)还不知到;

让 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 完成交互。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266