分布式系統(tǒng)流控、熔斷:Sentinel的使用

前言

隨著微服務(wù)的流行贰镣,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要呜象。Sentinel 以流量為切入點,從流量控制碑隆、熔斷降級恭陡、系統(tǒng)負載保護等多個維度保護服務(wù)的穩(wěn)定性。

Sentinel 具有以下特征:

  • 豐富的應(yīng)用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景干跛,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷祟绊、集群流量控制楼入、實時熔斷下游不可用應(yīng)用等。

  • 完備的實時監(jiān)控:Sentinel 同時提供實時的監(jiān)控功能牧抽。您可以在控制臺中看到接入應(yīng)用的單臺機器秒級數(shù)據(jù)嘉熊,甚至 500 臺以下規(guī)模的集群的匯總運行情況。

  • 廣泛的開源生態(tài):Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊扬舒,例如與 Spring Cloud阐肤、Dubbo、gRPC 的整合讲坎。您只需要引入相應(yīng)的依賴并進行簡單的配置即可快速地接入 Sentinel孕惜。

  • 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口晨炕。您可以通過實現(xiàn)擴展接口來快速地定制邏輯衫画。例如定制規(guī)則管理、適配動態(tài)數(shù)據(jù)源等瓮栗。

以上內(nèi)容引自 Sentinel 官方介紹削罩。在本文中,筆者將從實際應(yīng)用的角度费奸,來學(xué)習Sentinel的使用弥激。

一、初識Sentinel

首先愿阐,我們需要引入Sentinel的依賴微服。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.7.2</version>
</dependency>

Sentinel 支持以下幾種規(guī)則:流量控制規(guī)則、熔斷降級規(guī)則缨历、系統(tǒng)保護規(guī)則职辨、來源訪問控制規(guī)則 和 熱點參數(shù)規(guī)則盗蟆。

在這里,我們來展示一個流量控制和熔斷降級的示例舒裤。

1喳资、流量控制

流量控制,其原理是監(jiān)控應(yīng)用流量的 QPS 或并發(fā)線程數(shù)等指標腾供,當達到指定的閾值時對流量進行控制仆邓,以避免被瞬時的流量高峰沖垮,從而保障應(yīng)用的高可用性伴鳖。

我們以 QPS 為例节值,先來定義它的規(guī)則,相關(guān)屬性含義見注釋榜聂。

/**
 * 加載限流規(guī)則
 * @param resource
 */
public static void loadFlowRules(String resource){
    FlowRule rule = new FlowRule();
    //資源名稱,可以是任意字符串
    rule.setResource(resource);
    //限流閾值
    rule.setCount(5);
    //限流閾值類型,設(shè)置為QPS搞疗。即每秒QPS大于5時,觸發(fā)限流
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    //針對的調(diào)用來源
    rule.setLimitApp("default");
    //調(diào)用關(guān)系限流策略,默認按照資源本身
    rule.setStrategy(RuleConstant.STRATEGY_DIRECT);
    //限流效果须肆,默認直接拒絕
    rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
    //是否集群限流
    rule.setClusterMode(false);
    FlowRuleManager.loadRules(Collections.singletonList(rule));
}

如上代碼匿乃,當每秒的請求數(shù)達到 5 之后,就會直接拒絕當前時間窗口的后續(xù)請求豌汇。

接下來幢炸,我們把需要控制流量的代碼用 Sentinel API SphU.entry("resource") 和 entry.exit() 包圍起來即可。

public static void main(String[] args) throws InterruptedException {
    loadFlowRules("orderService");
    while (!stop){
        count.incrementAndGet();
        Entry entry = null;
        try {
            entry = SphU.entry(resource);
            logger.info("業(yè)務(wù)操作...{}",count.get());
        } catch (BlockException e) {
            logger.error("請求被限流...{}",count.get());
            Thread.sleep(1000);
        } finally {
            if (entry != null) {
                entry.exit();
            }
            if (count.get()>=20){
                stop = true;
            }
        }
    }
}

如上代碼拒贱,我們先通過loadFlowRules()方法加載限流規(guī)則宛徊。然后將業(yè)務(wù)操作用Sentinel API包圍起來。

我們定義的限流閾值是5逻澳,這里一共有20個請求闸天。觸發(fā)限流之后,我們的線程停頓1秒斜做,以便度過當前的時間窗口号枕,所以會有3個請求被限流。

運行代碼陨享,我們可以得到以下結(jié)果:

14:38:00.463  - 業(yè)務(wù)操作...1
14:38:00.465  - 業(yè)務(wù)操作...2
14:38:00.465  - 業(yè)務(wù)操作...3
14:38:00.465  - 業(yè)務(wù)操作...4
14:38:00.465  - 業(yè)務(wù)操作...5
14:38:00.494  - 請求被限流...6
14:38:01.494  - 業(yè)務(wù)操作...7
14:38:01.494  - 業(yè)務(wù)操作...8
14:38:01.495  - 業(yè)務(wù)操作...9
14:38:01.495  - 業(yè)務(wù)操作...10
14:38:01.495  - 業(yè)務(wù)操作...11
14:38:01.496  - 請求被限流...12
14:38:02.497  - 業(yè)務(wù)操作...13
14:38:02.497  - 業(yè)務(wù)操作...14
14:38:02.497  - 業(yè)務(wù)操作...15
14:38:02.497  - 業(yè)務(wù)操作...16
14:38:02.497  - 業(yè)務(wù)操作...17
14:38:02.497  - 請求被限流...18
14:38:03.498  - 業(yè)務(wù)操作...19
14:38:03.498  - 業(yè)務(wù)操作...20

2葱淳、熔斷

除了流量控制以外,對調(diào)用鏈路中不穩(wěn)定的資源進行熔斷降級也是保障高可用的重要措施之一抛姑。

Sentinel 熔斷降級會在調(diào)用鏈路中某個資源出現(xiàn)不穩(wěn)定狀態(tài)時(例如調(diào)用超時或異常比例升高)赞厕,對這個資源的調(diào)用進行限制,讓請求快速失敗定硝,避免影響到其它的資源而導(dǎo)致級聯(lián)錯誤皿桑。

那怎么來衡量資源是否穩(wěn)定呢?

Sentinel提供了三種方式,平均響應(yīng)時間诲侮、異常比例和異常數(shù)镀虐。

我們拿平均響應(yīng)時間為例,先來定義它的規(guī)則沟绪。

/**
 * 1秒內(nèi)的5個請求刮便,平均響應(yīng)時間大于10ms,接下來的3秒內(nèi)都會自動熔斷绽慈。
 * @param resourceName
 */
public static void loadDegradeRule(String resourceName){
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    //資源名稱
    rule.setResource(resourceName);
    //閾值 - 10ms
    rule.setCount(10);
    //熔斷策略 - RT模式
    rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
    //時間窗口 - 3s
    rule.setTimeWindow(3);
    //RT模式下,1秒內(nèi)連續(xù)多少個請求的平均RT超出閾值恨旱,才可以觸發(fā)熔斷
    rule.setRtSlowRequestAmount(5);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

如上代碼,我們定義了熔斷的規(guī)則坝疼,屬性的含義見注釋內(nèi)容搜贤,然后來看測試用例。

public static void main(String[] args)throws InterruptedException {
    loadDegradeRule(resource);
    while (!stop){
        count.incrementAndGet();
        Entry entry = null;
        try {
            entry = SphU.entry(resource);
            logger.info("業(yè)務(wù)操作...{}",count.get());
            Thread.sleep(15);
        } catch (BlockException e) {
            if (e instanceof DegradeException){
                logger.error("觸發(fā)熔斷機制...{}",count.get());
                Thread.sleep(500);
            }
        } finally {
            if (entry != null) {
                entry.exit();
            }
            if (count.get()>=20){
                stop = true;
            }
        }
    }
    logger.info("----------------------------");
}

在上面的代碼中钝凶,我們一共有20個請求仪芒。我們讓線程停頓15ms使平均RT超過閾值,也就是超過10ms耕陷。

我們定義的規(guī)則里面是1秒內(nèi)連續(xù)5個請求的平均RT超出閾值掂名,就可以觸發(fā)熔斷,所以當?shù)?個請求到達時啃炸,就會觸發(fā)熔斷铆隘。

熔斷多久呢卓舵?就在3秒的時間窗口南用。

上面的測試代碼中,在觸發(fā)熔斷之后掏湾,我們又手動讓線程停頓了 1000ms 裹虫,所以每次熔斷的請求會有3個。

是不是這樣融击,我們運行代碼筑公,看下結(jié)果:

10:56:20.022 [main] INFO orderService - 業(yè)務(wù)操作...1
10:56:20.040 [main] INFO orderService - 業(yè)務(wù)操作...2
10:56:20.056 [main] INFO orderService - 業(yè)務(wù)操作...3
10:56:20.072 [main] INFO orderService - 業(yè)務(wù)操作...4
10:56:20.088 [main] INFO orderService - 業(yè)務(wù)操作...5
10:56:20.127 [main] ERROR orderService - 觸發(fā)熔斷機制...6
10:56:21.128 [main] ERROR orderService - 觸發(fā)熔斷機制...7
10:56:22.128 [main] ERROR orderService - 觸發(fā)熔斷機制...8
10:56:23.129 [main] INFO orderService - 業(yè)務(wù)操作...9
10:56:23.145 [main] INFO orderService - 業(yè)務(wù)操作...10
10:56:23.160 [main] INFO orderService - 業(yè)務(wù)操作...11
10:56:23.176 [main] INFO orderService - 業(yè)務(wù)操作...12
10:56:23.192 [main] INFO orderService - 業(yè)務(wù)操作...13
10:56:23.207 [main] ERROR orderService - 觸發(fā)熔斷機制...14
10:56:24.208 [main] ERROR orderService - 觸發(fā)熔斷機制...15
10:56:25.208 [main] ERROR orderService - 觸發(fā)熔斷機制...16
10:56:26.209 [main] INFO orderService - 業(yè)務(wù)操作...17
10:56:26.224 [main] INFO orderService - 業(yè)務(wù)操作...18
10:56:26.240 [main] INFO orderService - 業(yè)務(wù)操作...19
10:56:26.255 [main] INFO orderService - 業(yè)務(wù)操作...20
10:56:26.271 [main] INFO orderService - ----------------------------

至此,我們就可以說尊浪,Sentinel 能夠正常工作了匣屡。

二、系統(tǒng)集成

上面只是一個很簡單的Demo示例拇涤,如果我們希望在我們的SpringBoot項目中使用Sentinel捣作,還需要一些工作。

1鹅士、Sentinel 控制臺

Sentinel 提供一個輕量級的開源控制臺券躁,它是使用SpringBoot開發(fā)的。

它提供機器發(fā)現(xiàn)以及健康情況管理、監(jiān)控(單機和集群)也拜,規(guī)則管理和推送的功能以舒。

所以,我們先把這個控制臺運行起來慢哈。

第一步蔓钟,需要在https://github.com/alibaba/Sentinel/releases這個地址,下載最新版本的控制臺 jar 包岸军。

第二步奋刽,使用命令啟動控制臺程序,其中 -Dserver.port=9080 用于指定 Sentinel 控制臺端口艰赞。

java -Dserver.port=9080 -Dcsp.sentinel.dashboard.server=localhost:9080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

第三步佣谐,我們的業(yè)務(wù)系統(tǒng)引入 Transport 模塊來與 Sentinel 控制臺進行通信。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.7.2</version>
</dependency>

第四步方妖,在我們的業(yè)務(wù)系統(tǒng)中狭魂,設(shè)置JVM啟動參數(shù),用來指明Sentinel控制臺的地址党觅。

-Dcsp.sentinel.dashboard.server=127.0.0.1:9080

最后雌澄,啟動我們的業(yè)務(wù)系統(tǒng),然后打開Sentinel控制臺杯瞻,如果可以看到機器列表就可以了镐牺。


image

2、定義規(guī)則

在定義規(guī)則之前魁莉,我們需要規(guī)劃好資源范圍睬涧。

什么意思呢?比如我們拿一個訂單業(yè)務(wù)來說旗唁,是不是所有的訂單操作都算一個資源畦浓?還是拆分開來看,創(chuàng)建訂單算一個資源检疫,訂單查詢算另外一個資源讶请。

所以,我們可以先把希望流控的資源名稱定義出來屎媳。

public final class ResourceConstants {
    public static final String ORDER_SERVICE = OrderService.class.getName();
    public static final String ORDER_SERVICE_ORDERS = ORDER_SERVICE+".orders";
    public static final String ORDER_SERVICE_CREATE = ORDER_SERVICE+".create";
}

由于是一個SpringBoot項目夺溢,我們可以在系統(tǒng)啟動的時候,來加載流控規(guī)則烛谊。

@Component
public class ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        initFlowRule(ResourceConstants.ORDER_SERVICE,5);
        initFlowRule(ResourceConstants.ORDER_SERVICE_ORDERS,5);
    }
    public void initFlowRule(String resourceName,int count) {
        FlowRule flowRule = new FlowRule(resourceName)
                .setCount(count)
                .setGrade(RuleConstant.FLOW_GRADE_QPS);
        List<FlowRule> list = new ArrayList<>();
        list.add(flowRule);
        FlowRuleManager.loadRules(list);
    }
}

然后风响,我們在Controller加入Sentinel的代碼,來達到流控的效果晒来。

@RequestMapping("/getOrders")
public ResponseEntity getOrders(){
    Entry entry = null;
    try {
        entry = SphU.entry(ResourceConstants.ORDER_SERVICE_ORDERS);
        return ResponseEntity.ok(orderService.orders());
    } catch (BlockException e) {
        logger.error("請求被限流...{}",e.getRule().getResource());
        return ResponseEntity.badRequest().body(e.getRule());
    } finally {
        if (entry != null) {
            entry.exit();
        }
    }
}

現(xiàn)在钞诡,我們拿JMeter來測試一下,啟動10個線程來請求這個接口。只會通過5個請求荧降,拒絕5個請求接箫。

image

至此,我們已經(jīng)可以在SpringBoot項目中簡單使用Sentinel了朵诫,不過此時還有兩個很明顯的問題辛友。

  • 在每個需要流控的地方,通過API硬編碼剪返,侵入性太強而且也不方便废累;
  • 流控規(guī)則只保留在內(nèi)存中,系統(tǒng)重啟就沒了脱盲,沒有持久化規(guī)則數(shù)據(jù)邑滨。

接下來,我們來解決上述的兩個問題钱反。

三掖看、框架適配

得益于廣泛的開源生態(tài),Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊面哥。我們只需要引入相應(yīng)的依賴并進行簡單的配置即可快速地接入 Sentinel哎壳。

我們希望可以對 Web 請求進行流量控制,那么需要引入Sentinel 提供與 Servlet 的整合尚卫。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-web-servlet</artifactId>
    <version>1.7.2</version>
</dependency>

1归榕、Filter配置

因為是SpringBoot應(yīng)用,我們通過Configuration進行配置吱涉。

@Configuration
public class SentinelFilterConfig {
    @Bean
    public FilterRegistrationBean sentinelFilterRegistration() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new CommonFilter());
        registration.addUrlPatterns("/*");
        registration.setName("sentinelFilter");
        registration.setOrder(1);
        return registration;
    }
}

在我們自己的業(yè)務(wù)代碼中刹泄,就可以免去Sentinel API部分了。

@RequestMapping("/getOrders")
public ResponseEntity getOrders(){
    return ResponseEntity.ok(orderService.orders());
}

在流控規(guī)則不變的情況下邑飒,我們拿JMeter啟動10個線程來請求這個接口循签。同樣的只會通過5個請求级乐,拒絕5個請求疙咸。

2、UrlBlockHandler

默認情況下风科,當請求被限流時會返回默認的提示頁面撒轮。

我們可以在代碼中調(diào)用WebServletConfig.setBlockPage(blockPage) 方法設(shè)定自定義的跳轉(zhuǎn) URL,當請求被限流時會自動跳轉(zhuǎn)至設(shè)定好的 URL贼穆。

如果不打算讓它跳轉(zhuǎn)頁面题山,我們也可以實現(xiàn) UrlBlockHandler 接口并編寫定制化的限流處理邏輯。

比如像下面這樣故痊,限流或熔斷之后顶瞳,會向客戶端返回一個異常的HTTP狀態(tài)碼和提示信息。

public class SentinelUrlBlockHandler implements UrlBlockHandler {

    public static final String flowMsg = "觸發(fā)流控機制~";
    public static final String degradeMsg = "觸發(fā)熔斷機制~";
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex){
        logger.error("熔斷限流...{}",ex.getRule());
        response.setCharacterEncoding("UTF-8");
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        PrintWriter out = response.getWriter();
        if (ex instanceof FlowException){
            out.print(flowMsg);
        }else if (ex instanceof DegradeException){
            out.print(degradeMsg);
        }
        out.flush();
        out.close();
    }
}

然后將其注冊至 WebCallbackManager 中。

WebCallbackManager.setUrlBlockHandler(new SentinelUrlBlockHandler());

3慨菱、UrlCleaner

Sentinel Web Filter 會將每個到來的不同的 URL 都作為不同的資源處理焰络。

比如訂單業(yè)務(wù)中的,創(chuàng)建訂單符喝、訂單查詢闪彼、訂單刪除等等,因為URL的不同协饲,都會被當作不同的資源畏腕。

如果我們希望將這些操作都歸到訂單資源下/order/*,就需要實現(xiàn) UrlCleaner 接口清洗一下資源茉稠。

比如像下面這樣描馅,將資源歸類。比如/order/getOrders和/order/createOrder而线,都會變成/order/*流昏。

public class SentinelUrlClean implements UrlCleaner {
    @Override
    public String clean(String originUrl) {
        if (originUrl == null || originUrl.isEmpty()) {
            return originUrl;
        }
        int lastSlashIndex = originUrl.lastIndexOf("/");
        if (lastSlashIndex >= 0) {
            originUrl = originUrl.substring(0, lastSlashIndex) + "/*";
        }
        return originUrl;
    }
}

然后將其注冊至 WebCallbackManager 中。

WebCallbackManager.setUrlCleaner(new SentinelUrlClean());

當時吞获,更絕對一些况凉,如果整個系統(tǒng)都采用一個資源,那么這里只返回一個固定的url也可以各拷。

四刁绒、最佳實踐

上面我們說到,現(xiàn)在的Sentinel規(guī)則數(shù)據(jù)都只保留在內(nèi)存中烤黍,沒辦法做到集中管理和推送規(guī)則知市,不具備生產(chǎn)環(huán)境可用性话侧。

規(guī)則管理及推送贷祈,一般有三種方式。

  • 原始模式

將規(guī)則推送至客戶端并直接更新到內(nèi)存中憾儒。重啟即消失规哲,不建議在生產(chǎn)環(huán)境中使用跟啤。

  • Pull 模式

客戶端主動向某個規(guī)則管理中心定期輪詢拉取規(guī)則,這個規(guī)則中心可以是 RDBMS唉锌、文件 等隅肥。不保證實時性,拉取過于頻繁可能會導(dǎo)致性能問題袄简。

  • Push 模式

規(guī)則中心統(tǒng)一推送腥放,客戶端通過注冊監(jiān)聽器的方式時刻監(jiān)聽變化,比如使用 Nacos绿语、Zookeeper 等配置中心秃症,有更好的實時性和一致性候址。生產(chǎn)環(huán)境下一般采用 push 模式的數(shù)據(jù)源。

生產(chǎn)環(huán)境下一般更常用的是 push 模式的數(shù)據(jù)源种柑。對于 push 模式的數(shù)據(jù)源,如遠程配置中心(ZooKeeper, Nacos, Apollo等等)宗雇,推送的操作不應(yīng)由 Sentinel 客戶端進行,而應(yīng)該經(jīng)控制臺統(tǒng)一進行管理莹规,直接進行推送赔蒲,數(shù)據(jù)源僅負責獲取配置中心推送的配置并更新到本地。因此推送規(guī)則正確做法應(yīng)該是 ** 配置中心控制臺/Sentinel 控制臺 → 配置中心 → Sentinel 數(shù)據(jù)源 → Sentinel **良漱,而不是經(jīng) Sentinel 數(shù)據(jù)源推送至配置中心舞虱。

接下來我們來實現(xiàn)由Nacos配置中心統(tǒng)一管理數(shù)據(jù)。

1母市、啟動Nacos

關(guān)于Nacos本文不再多說矾兜,下載一個啟動就好了。

2患久、引入依賴

NacosDataSource椅寺,官方已經(jīng)提供了,我們引入相關(guān)依賴即可蒋失。

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

3返帕、從數(shù)據(jù)源中讀取規(guī)則數(shù)據(jù)

在初始化NacosDataSource的時候,我們要指定Nacos的服務(wù)地址篙挽,groupId和dataId荆萤。

然后根據(jù)這些信息連接Nacos,去讀取里面的數(shù)據(jù)铣卡。并且注冊監(jiān)聽器链韭,在Nacos配置中心的規(guī)則數(shù)據(jù)發(fā)生變化后,通知到客戶端煮落。

說起來可能比較復(fù)雜敞峭,但是作為客戶端使用的話,其實比較簡單蝉仇。我們搞一個類旋讹,去連接它就可以了。

@Component
public class DataSourceRuleManager {

    private static final String remoteAddress = "localhost:8848";
    private static final String groupId = "sentinel.group";
    private static final String flowDataId = "flow.rule";

    @PostConstruct
    public void loadFlowRules() {
        FlowConverter converter = new FlowConverter();
        //連接Nacos量淌,讀取配置信息并通過converter將內(nèi)容轉(zhuǎn)換為對象
        ReadableDataSource<String, List<FlowRule>> flowRuleDataSource =
                new NacosDataSource<>(remoteAddress,groupId,flowDataId,converter);
        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
    }
    //轉(zhuǎn)換器 從Nacos配置中心讀取到的數(shù)據(jù)轉(zhuǎn)換為對象
    public class FlowConverter implements Converter {
        @Override
        public Object convert(Object source) {
            return JSON.parseArray(source.toString(),FlowRule.class);
        }
    }
}

配置完之后骗村,我們就可以啟動業(yè)務(wù)系統(tǒng)了嫌褪。

4呀枢、從Nacos配置中心添加規(guī)則數(shù)據(jù)

現(xiàn)在就可以通過Nacos控制臺,向配置中心添加規(guī)則數(shù)據(jù)了笼痛。

有一點需要注意的是裙秋,由于我們的轉(zhuǎn)換器是通過JSON解析FlowRule類型的數(shù)組對象琅拌,所以配置內(nèi)容里面的格式和屬性名稱要對應(yīng)起來,否則解析會失敗摘刑。


image

通過擴展讀數(shù)據(jù)源的方式进宝,當我們在Nacos配置中心發(fā)布新的內(nèi)容后,相應(yīng)的我們業(yè)務(wù)系統(tǒng)里面的規(guī)則也會更新枷恕,Sentinel控制臺里面的規(guī)則也一樣會同步更新党晋,就實現(xiàn)了規(guī)則中心統(tǒng)一推送和持久化。

還有一種方式是直接通過 Sentinel 控制臺 → 配置中心徐块,這樣的話需要修改dashboard的實現(xiàn)未玻,過程雖然不難但比較復(fù)雜,由于篇幅有限胡控,本文就不再贅述扳剿。感興趣的朋友可以留言交流~

總結(jié)

本文簡單介紹了分布式系統(tǒng)熔斷、限流組件Sentinel的使用昼激。為了達到生產(chǎn)環(huán)境的基本可用庇绽,包含了 Sentinel 與 Servlet 的整合和規(guī)則中心統(tǒng)一推送和持久化。

本文只是Sentinel生態(tài)中的一小部分橙困,更多內(nèi)容如多種策略的流控和熔斷機制瞧掺、黑白名單控制、框架適配凡傅、實現(xiàn)原理等內(nèi)容夸盟,有時間后續(xù)分享~

原創(chuàng)不易,客官們點個贊再走嘛像捶,這將是筆者持續(xù)寫作的動力~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末上陕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拓春,更是在濱河造成了極大的恐慌释簿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硼莽,死亡現(xiàn)場離奇詭異庶溶,居然都是意外死亡,警方通過查閱死者的電腦和手機懂鸵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門偏螺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匆光,你說我怎么就攤上這事套像。” “怎么了终息?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵夺巩,是天一觀的道長贞让。 經(jīng)常有香客問我,道長柳譬,這世上最難降的妖魔是什么喳张? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮美澳,結(jié)果婚禮上销部,老公的妹妹穿的比我還像新娘。我一直安慰自己制跟,他們只是感情好柴墩,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凫岖,像睡著了一般江咳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哥放,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天歼指,我揣著相機與錄音,去河邊找鬼甥雕。 笑死踩身,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的社露。 我是一名探鬼主播挟阻,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峭弟!你這毒婦竟也來了附鸽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤瞒瘸,失蹤者是張志新(化名)和其女友劉穎坷备,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情臭,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡省撑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俯在。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竟秫。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跷乐,靈堂內(nèi)的尸體忽然破棺而出肥败,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布拙吉,位于F島的核電站潮孽,受9級特大地震影響揪荣,放射性物質(zhì)發(fā)生泄漏筷黔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一仗颈、第九天 我趴在偏房一處隱蔽的房頂上張望佛舱。 院中可真熱鬧,春花似錦挨决、人聲如沸请祖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肆捕。三九已至,卻和暖如春盖高,著一層夾襖步出監(jiān)牢的瞬間慎陵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工喻奥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留席纽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓撞蚕,卻偏偏與公主長得像润梯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甥厦,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353