Spring Cloud gateway 六 Sentinel nacos存儲動態(tài)刷新

微服務(wù)當前這么火爆的程度,如果不能學(xué)會一種微服務(wù)框架技術(shù)。怎么能升職加薪,增加簡歷的籌碼?spring cloud 和 Dubbo 需要單獨學(xué)習(xí)。說沒有時間?沒有精力?要學(xué)倆個框架?而Spring Cloud alibaba只需要你學(xué)會一個就會擁有倆種微服務(wù)治理框架技術(shù)。何樂而不為呢?加油吧!騷猿年

Sentinel規(guī)則


Sentinel 的理念是開發(fā)者只需要關(guān)注資源的定義,當資源定義成功后可以動態(tài)增加各種流控降級規(guī)則。Sentinel 提供兩種方式修改規(guī)則:

通過 API 直接修改 (loadRules)
通過 DataSource 適配不同數(shù)據(jù)源修改
手動通過 API 修改比較直觀,可以通過以下幾個 API 修改不同的規(guī)則:

FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控規(guī)則
DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降級規(guī)則

特別注意一下這倆個方法。后面會拿一個做案例說明

手動修改規(guī)則(硬編碼方式)一般僅用于測試和演示,生產(chǎn)上一般通過動態(tài)規(guī)則源的方式來動態(tài)管理規(guī)則。

DataSource 擴展


上述 loadRules() 方法只接受內(nèi)存態(tài)的規(guī)則對象,但更多時候規(guī)則存儲在文件、數(shù)據(jù)庫或者配置中心當中。DataSource 接口給我們提供了對接任意配置源的能力。相比直接通過 API 修改規(guī)則,實現(xiàn) DataSource 接口是更加可靠的做法。

***推薦通過控制臺設(shè)置規(guī)則后將規(guī)則推送到統(tǒng)一的規(guī)則中心,客戶端實現(xiàn) ReadableDataSource 接口端監(jiān)聽規(guī)則中心實時獲取變更,流程如下: ***

file

DataSource 擴展常見的實現(xiàn)方式有:

  • 拉模式:客戶端主動向某個規(guī)則管理中心定期輪詢拉取規(guī)則,這個規(guī)則中心可以是 RDBMS、文件,甚至是 VCS 等。這樣做的方式是簡單,缺點是無法及時獲取變更;
  • 推模式:規(guī)則中心統(tǒng)一推送,客戶端通過注冊監(jiān)聽器的方式時刻監(jiān)聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實時性和一致性保證。

Sentinel 目前支持以下數(shù)據(jù)源擴展:

  • Pull-based: 文件、Consul (since 1.7.0)
  • Push-based: ZooKeeper, Redis, Nacos, Apollo

因為是注冊中心和配置中心 都使用的nacos。這里也只介紹nacos 的使用方式。

整合代碼修改pom 引入jar

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

修改yml 配置文件。添加DataSource支持

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8890
        port: 8719
      eager: true
      datasource:
        na:
          nacos:
            server-addr: 47.99.209.72:8848
            groupId: DEFAULT_GROUP
            dataId: ${spring.application.name}-${spring.profiles.active}-sentinel
            rule-type: flow

nacos配置中心創(chuàng)建文件 cloud-gateway-demo-dev-sentinel


file
[
    {
        "resource": "/api",
        "limitApp": "default",
        "grade": 1,
        "count": 5,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

啟動服務(wù)

查看啟動臺sentinel

file

如果需要動態(tài)修改。直接修改nacos對應(yīng)配置文件。在進行發(fā)布,Sentinel 就會隨著動態(tài)更新
這個就不帶大家去做這個實驗了。

還有一種情況 就是上面提高的 手動api方式修改。官方并不推薦

FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控規(guī)則

這種方案這里也實現(xiàn)一下

很簡單只要增加一個ApplicationRunner 實現(xiàn)類就可以完成

package com.xian.cloud.runner;

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * <Description>
 *
 * @author xianliru@163.com
 * @version 1.0
 * @createDate 2019/11/12 11:18
 */
@Component
@Slf4j
public class FlowRuleRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        try {
            List<FlowRule> rules = FlowRuleManager.getRules();
            if(rules == null ){
                rules = new ArrayList<>();
            }
            FlowRule flowRule = new FlowRule("/refreshRoutes");
            flowRule.setCount(5).setClusterMode(false).setControlBehavior(0);
            flowRule.setLimitApp("default");
            rules.add(flowRule);
            log.info("FlowRuleRunner loadRules reules:{}  ",rules);
            FlowRuleManager.loadRules(rules);
        }catch (Exception e){
            log.error("FlowRuleRunner 加載異常 :{}",e.getMessage());
        }
    }
}

這里需要要注意下ApplicationRunner 是在項目啟動完成之后做的一些事情。如果在run方法里面拋出異常。不進行捕獲,會導(dǎo)致程序直接退出

我們重啟啟動程序??匆幌?/p>

file

思考一下,如果在配置中心修改規(guī)則以后refreshRoutes 這個限流規(guī)則還會存在么?

現(xiàn)在實驗一下,將nacos api修改為test 并發(fā)布。

程序日志

2019-11-13 10:23:07.426  INFO 43912 --- [.99.209.72_8848] c.a.n.client.config.impl.ClientWorker    : [fixed-47.99.209.72_8848] [polling-resp] config changed. dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP
2019-11-13 10:23:07.535  INFO 43912 --- [.99.209.72_8848] c.a.n.client.config.impl.ClientWorker    : [fixed-47.99.209.72_8848] [data-received] dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, tenant=null, md5=b03e221f14293f3274788cbdb24a44b4, content=[
    {
        "resource": "/test",
        "limitApp": "default",
        "grade": 1,
        "cou...
2019-11-13 10:23:07.535  INFO 43912 --- [.99.209.72_8848] c.a.nacos.client.config.impl.CacheData   : [fixed-47.99.209.72_8848] [notify-listener] time cost=0ms in ClientWorker, dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, md5=b03e221f14293f3274788cbdb24a44b4, listener=com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource$1@10b4e985 
2019-11-13 10:23:07.538  INFO 43912 --- [update-thread-1] c.a.nacos.client.config.impl.CacheData   : [fixed-47.99.209.72_8848] [notify-ok] dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, md5=b03e221f14293f3274788cbdb24a44b4, listener=com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource$1@10b4e985 

來看一下 Sentinel控制臺


file

在之前通過ApplicationRunner 注入的規(guī)則消失了。

反思

  • 如果程序上選中DataSource方式存儲動態(tài)的限流規(guī)則等。就不能在使用官方提供各種工具類加載規(guī)則xxx.loadRules。因為動態(tài)刷新一次,存儲在內(nèi)存里面的規(guī)則就會清空。

  • 手動API 方式 不保證一致性;規(guī)則保存在內(nèi)存中,重啟即消失。嚴重不建議用于生產(chǎn)環(huán)境

往期資料、參考資料

Sentinel 官方文檔地址

摘自參考 spring cloud 官方文檔

Spring Cloud alibaba 官網(wǎng)地址

示例代碼地址

服務(wù)器nacos 地址 http://47.99.209.72:8848/nacos

往期地址 spring cloud alibaba 地址

spring cloud alibaba 簡介

Spring Cloud Alibaba (nacos 注冊中心搭建)

Spring Cloud Alibaba 使用nacos 注冊中心

Spring Cloud Alibaba nacos 配置中心使用

spring cloud 網(wǎng)關(guān)服務(wù)

Spring Cloud zuul網(wǎng)關(guān)服務(wù) 一

Spring Cloud 網(wǎng)關(guān)服務(wù) zuul 二

Spring Cloud 網(wǎng)關(guān)服務(wù) zuul 三 動態(tài)路由

Spring Cloud alibaba網(wǎng)關(guān) sentinel zuul 四 限流熔斷

Spring Cloud gateway 網(wǎng)關(guān)服務(wù) 一

Spring Cloud gateway 網(wǎng)關(guān)服務(wù)二 斷言、過濾器

Spring Cloud gateway 三 自定義過濾器GatewayFilter

Spring Cloud gateway 網(wǎng)關(guān)四 動態(tài)路由

Spring Cloud gateway 五 Sentinel整合

如何喜歡可以關(guān)注分享本公眾號。


file

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。轉(zhuǎn)載請附帶公眾號二維碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容