成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Sentinel Client: 整合Apollo規(guī)則持久化

plus2047 / 406人閱讀

摘要:這樣做的方式是簡(jiǎn)單,缺點(diǎn)是無(wú)法及時(shí)獲取變更推模式規(guī)則中心統(tǒng)一推送,客戶端通過(guò)注冊(cè)監(jiān)聽器的方式時(shí)刻監(jiān)聽變化,比如使用等配置中心。

在前面的學(xué)習(xí)過(guò)程中,Sentinel 的規(guī)則,也就是我們之前定義的限流規(guī)則,是通過(guò)代碼的方式定義好的。這是初始化時(shí)需要做的事情,Sentinel 提供了基于API的方式修改規(guī)則:

FlowRuleManager.loadRules(List rules); // 修改流控規(guī)則
DegradeRuleManager.loadRules(List rules); // 修改降級(jí)規(guī)則
SystemRuleManager.loadRules(List rules); // 修改系統(tǒng)規(guī)則
AuthorityRuleManager.loadRules(List rules); // 修改授權(quán)規(guī)則

當(dāng)我們接入了控制臺(tái)后,可以通過(guò)控制臺(tái)進(jìn)行規(guī)則的動(dòng)態(tài)修改,問(wèn)題是當(dāng)應(yīng)用程序重啟后規(guī)則信息就會(huì)恢復(fù)到初始化的階段,也就是說(shuō)后面修改的值會(huì)丟失,因?yàn)橐?guī)則信息都是存儲(chǔ)在應(yīng)用的內(nèi)存中。

為了解決這個(gè)問(wèn)題Sentinel 提供了DataSource 擴(kuò)展的功能,官方推薦通過(guò)控制臺(tái)設(shè)置規(guī)則后將規(guī)則推送到統(tǒng)一的規(guī)則中心,客戶端實(shí)現(xiàn) ReadableDataSource 接口端監(jiān)聽規(guī)則中心實(shí)時(shí)獲取變更,流程如下:

擴(kuò)展的常見方式有推和拉兩種模式:

拉模式:客戶端主動(dòng)向某個(gè)規(guī)則管理中心定期輪詢拉取規(guī)則,這個(gè)規(guī)則中心可以是 RDBMS、文件,甚至是 VCS 等。這樣做的方式是簡(jiǎn)單,缺點(diǎn)是無(wú)法及時(shí)獲取變更;

推模式:規(guī)則中心統(tǒng)一推送,客戶端通過(guò)注冊(cè)監(jiān)聽器的方式時(shí)刻監(jiān)聽變化,比如使用?Nacos、Apollo、Zookeeper 等配置中心。這種方式有更好的實(shí)時(shí)性和一致性保證。

今天我們主要是講如何使用 Apollo 來(lái)配置規(guī)則進(jìn)行持久化,Apollo是攜程開源的配置中心,非常好用

Github地址:https://github.com/ctripcorp/...

在我的書中也有對(duì)Apollo使用的詳細(xì)介紹,等出版了再通知大家。

首先集成需要的依賴:


    com.alibaba.csp
    sentinel-datasource-apollo
    1.4.1

然后創(chuàng)建 ApolloDataSource 并將其注冊(cè)至對(duì)應(yīng)的 RuleManager 上即可。比如:

private static void loadRules() {
        // Apollo 中的應(yīng)用名稱,自己定義的
        String appId = "SampleApp";
        // Apollo 的地址
        String apolloMetaServerAddress = "http://localhost:8080";
        System.setProperty("app.id", appId);
        System.setProperty("apollo.meta", apolloMetaServerAddress);
        // 指定環(huán)境
        System.setProperty("env", "DEV");
        // Apollo 的命名空間
        String namespaceName = "application";
        // 限流規(guī)則的Key, 在Apollo中用此Key
        String flowRuleKey = "flowRules";
        // 限流規(guī)則的默認(rèn)值
        String defaultFlowRules = "[]";
        // 注冊(cè)數(shù)據(jù)源
        ReadableDataSource> flowRuleDataSource = new ApolloDataSource<>(namespaceName,
            flowRuleKey, defaultFlowRules, source -> JSON.parseObject(source, new TypeReference>() {
        }));
        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}

到此為止配置就結(jié)束了,詳細(xì)的解釋我都寫了注釋哈。官方文檔也是這么寫的,問(wèn)題是如果你剛接觸會(huì)一頭霧水的,為什么?

你不知道在Apollo中怎么配置啊,我們講的就是說(shuō)可以用Apollo來(lái)作為存儲(chǔ),持久化規(guī)則,那么規(guī)則怎么配置就需要我們自己去想。

我也是通過(guò)看源碼才知道怎么去配置的,帶著大家一起來(lái)看源碼吧!

主要就是new ApolloDataSource這里,參數(shù)都是通過(guò)這里傳進(jìn)去的

public ApolloDataSource(String namespaceName, String flowRulesKey, String defaultFlowRuleValue,
                            Converter parser) {
        super(parser);

        Preconditions.checkArgument(!Strings.isNullOrEmpty(namespaceName), "Namespace name could not be null or empty");
        Preconditions.checkArgument(!Strings.isNullOrEmpty(flowRulesKey), "FlowRuleKey could not be null or empty!");

        this.flowRulesKey = flowRulesKey;
        this.defaultFlowRuleValue = defaultFlowRuleValue;

        this.config = ConfigService.getConfig(namespaceName);

        initialize();

        RecordLog.info(String.format("Initialized rule for namespace: %s, flow rules key: %s",
            namespaceName, flowRulesKey));
    }

這邊就是對(duì)傳入的參數(shù)賦值,然后看下面這行:

this.config = ConfigService.getConfig(namespaceName);

這就是通過(guò)命名空間去Apollo中獲取配置,獲取完后就執(zhí)行初始化

private void initialize() {
     initializeConfigChangeListener();
     loadAndUpdateRules();
}

initializeConfigChangeListener是初始化配置的監(jiān)聽器,當(dāng)配置發(fā)生修改時(shí)會(huì)進(jìn)入該監(jiān)聽器,也就是說(shuō)在這個(gè)監(jiān)聽器里需要監(jiān)聽配置的修改,然后更新規(guī)則

 private void initializeConfigChangeListener() {
        config.addChangeListener(new ConfigChangeListener() {
            @Override
            public void onChange(ConfigChangeEvent changeEvent) {
                ConfigChange change = changeEvent.getChange(flowRulesKey);
                //change is never null because the listener will only notify for this key
                if (change != null) {
                    RecordLog.info("[ApolloDataSource] Received config changes: " + change.toString());
                }
                loadAndUpdateRules();
            }
        }, Sets.newHashSet(flowRulesKey));
 }

loadAndUpdateRules就是更新規(guī)則的邏輯了

private void loadAndUpdateRules() {
        try {
            T newValue = loadConfig();
            if (newValue == null) {
                RecordLog.warn("[ApolloDataSource] WARN: rule config is null, you may have to check your data source");
            }
            getProperty().updateValue(newValue);
        } catch (Throwable ex) {
            RecordLog.warn("[ApolloDataSource] Error when loading rule config", ex);
        }
 }

那么配置是怎么來(lái)的呢,請(qǐng)看loadConfig

 @Override
 public T loadConfig() throws Exception {
     return loadConfig(readSource());
 }

 public T loadConfig(S conf) throws Exception {
     T value = parser.convert(conf);
     return value;
 }

readSource就是獲取我們配置的flowRulesKey的值,那么配置其實(shí)就是一個(gè)字符串,然后下面通過(guò)Json轉(zhuǎn)換

 public String readSource() throws Exception {
     return config.getProperty(flowRulesKey, defaultFlowRuleValue);
 }

我們?cè)俜颠^(guò)來(lái)看看注冊(cè)的代碼:

 // 注冊(cè)數(shù)據(jù)源
 ReadableDataSource> flowRuleDataSource = new ApolloDataSource<>(namespaceName,
            flowRuleKey, defaultFlowRules, source -> JSON.parseObject(source, new TypeReference>() {
 }));

重點(diǎn)是ource -> JSON.parseObject(source, new TypeReference>()這行,這不就是轉(zhuǎn)換成List嗎,真相呼之欲出了,也就是在Apollo中配置的就是List的json格式就行。

我們配置一個(gè)試試看:

flowRules = [{"grade":1,"count":11,"resource":"HelloWorld"}]

點(diǎn)擊保存并且發(fā)布,可以在initializeConfigChangeListener里面設(shè)置一個(gè)斷點(diǎn),你會(huì)發(fā)現(xiàn),當(dāng)發(fā)布配置之后,這邊馬上就會(huì)進(jìn)來(lái),然后執(zhí)行其他的邏輯,到此為止整個(gè)流程結(jié)束。

歡迎加入我的知識(shí)星球,一起交流技術(shù),免費(fèi)學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領(lǐng)下組隊(duì)學(xué)習(xí)Sentinel,等你哦!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74014.html

相關(guān)文章

  • Sentinel Dashboard中修改規(guī)則同步到Apollo存儲(chǔ)

    摘要:在之前的兩篇教程中我們分別介紹了如何將的限流規(guī)則存儲(chǔ)到和中。本文以存儲(chǔ)為例,下一篇介紹的改在示例。但是由于考慮到與的結(jié)合使用,略作修改。 在之前的兩篇教程中我們分別介紹了如何將Sentinel的限流規(guī)則存儲(chǔ)到Nacos和Apollo中。同時(shí),在文末的思考中,我都指出了這兩套整合方案都存在一個(gè)不足之處:不論采用什么配置中心,限流規(guī)則都只能通過(guò)Nacos界面或Apollo界面來(lái)完成修改才能...

    psychola 評(píng)論0 收藏0
  • Spring Cloud Alibaba整合Sentinel流控

    摘要:前面我們都是直接通過(guò)集成的依賴,通過(guò)編碼的方式配置規(guī)則等。對(duì)于集成到中阿里已經(jīng)有了一套開源框架,就是用于將一系列的框架成功的整合到中。但這也是在學(xué)習(xí)過(guò)程中遇到的一個(gè)問(wèn)題,還是得通過(guò)調(diào)試源碼的方式去發(fā)現(xiàn)問(wèn)題的原因。 前面我們都是直接通過(guò)集成sentinel的依賴,通過(guò)編碼的方式配置規(guī)則等。對(duì)于集成到Spring Cloud中阿里已經(jīng)有了一套開源框架spring-cloud-alibaba...

    ytwman 評(píng)論0 收藏0
  • 阿里Sentinel控制臺(tái)源碼修改-對(duì)接Apollo規(guī)則久化

    摘要:改造背景前面我們講解了如何對(duì)接來(lái)持久化限流的規(guī)則,對(duì)接后可以直接通過(guò)的后臺(tái)進(jìn)行規(guī)則的修改,推送到各個(gè)客戶端實(shí)時(shí)生效。因此推送規(guī)則正確做法應(yīng)該是配置中心控制臺(tái)控制臺(tái)配置中心數(shù)據(jù)源,而不是經(jīng)數(shù)據(jù)源推送至配置中心。 改造背景 前面我們講解了如何對(duì)接Apollo來(lái)持久化限流的規(guī)則,對(duì)接后可以直接通過(guò)Apollo的后臺(tái)進(jìn)行規(guī)則的修改,推送到各個(gè)客戶端實(shí)時(shí)生效。 但還有一個(gè)問(wèn)題就是Sentinel...

    zhoutao 評(píng)論0 收藏0
  • Spring Cloud Alibaba基礎(chǔ)教程:Sentinel使用Apollo存儲(chǔ)規(guī)則

    摘要:上一篇我們介紹了如何通過(guò)的配置功能來(lái)存儲(chǔ)限流規(guī)則。第六步啟動(dòng)應(yīng)用。深入思考在使用存儲(chǔ)規(guī)則配置的時(shí)候與存儲(chǔ)一樣,對(duì)于控制臺(tái)這些數(shù)據(jù)是只讀的,也就是說(shuō)控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來(lái)的值。 上一篇我們介紹了如何通過(guò)Nacos的配置功能來(lái)存儲(chǔ)限流規(guī)則。Apollo是國(guó)內(nèi)用戶非常多的配置中心,所以,今天我們繼續(xù)說(shuō)說(shuō)Spring Cloud Alibaba...

    Airmusic 評(píng)論0 收藏0
  • Spring Cloud Alibaba基礎(chǔ)教程:Sentinel使用Nacos存儲(chǔ)規(guī)則

    摘要:所以,在整合了做規(guī)則存儲(chǔ)之后,需要知道在下面兩個(gè)地方修改存在不同的效果控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來(lái)的值??刂婆_(tái)中修改規(guī)則服務(wù)的內(nèi)存中規(guī)則會(huì)更新,中持久化規(guī)則也會(huì)更新,重啟后依然保持。 通過(guò)上一篇《使用Sentinel實(shí)現(xiàn)接口限流》的介紹,相信大家對(duì)Sentinel已經(jīng)有了初步的認(rèn)識(shí)。在Spring Cloud Alibaba的整合封裝之下,接...

    xingqiba 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<