Spring Cloud Alibaba基礎教程:Sentinel使用Apollo存儲規則

2021-02-13 程序猿DD

點擊藍色「程序猿DD」關注我喲

加個「星標」,不忘籤到哦

上一篇我們介紹了如何通過Nacos的配置功能來存儲限流規則。Apollo是國內用戶非常多的配置中心,所以,今天我們繼續說說Spring Cloud Alibaba Sentinel中如何將流控規則存儲在Apollo中。

使用Apollo存儲限流規則

Sentinel自身就支持了多種不同的數據源來持久化規則配置,目前包括以下幾種方式:

本文我們就來一起動手嘗試一下,如何使用Apollo來存儲限流規則。

準備工作

下面我們將同時使用到 Apollo和 SentinelDashboard,所以可以先把 Apollo和 SentinelDashboard啟動起來。

如果還沒入門 SentinelDashboard可以通過文末的系列目錄先學習之前的內容。Apollo的話相對複雜一些,這裡不做詳細介紹了,如果還沒有接觸過Apollo的讀者可以查看其官方文檔進一步學習。

應用配置

第一步:在Spring Cloud應用的 pom.xml中引入Spring Cloud Alibaba的Sentinel模塊和Apollo存儲擴展:

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>

</dependency>

<dependency>

<groupId>com.alibaba.csp</groupId>

<artifactId>sentinel-datasource-apollo</artifactId>

<version>1.4.0</version>

</dependency>

</dependencies>

第二步:在Spring Cloud應用中配置的服務信息,在 resource目錄下,創建 apollo-env.properties文件,內容樣例:

local.meta=http://192.168.0.201:8080

dev.meta=http://192.168.0.202:8080

這裡需要了解Apollo對多環境的配置,這裡設置的是每個環境不同的配置服務地址,讀者需要根據自己的實際情況修改。

第三步:在Spring Cloud應用中添加配置信息:

spring.application.name=sentinel-datasource-apollo

server.port=8002

# apollo config

app.id=${spring.application.name}

# sentinel dashboard

spring.cloud.sentinel.transport.dashboard=localhost:8080

# sentinel datasource apollo

spring.cloud.sentinel.datasource.ds.apollo.namespaceName=application

spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey=sentinel.flowRules

app.id:Apollo中的創建的項目名稱,這裡採用 spring.application.name參數的引用,從而達到服務名與配置項目名一致的效果

spring.cloud.sentinel.transport.dashboard:sentinel dashboard的訪問地址,根據上面準備工作中啟動的實例配置

spring.cloud.sentinel.datasource.ds.apollo.namespaceName:Apollo的空間名

spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey:配置規則的key名稱

關於Apollo相關配置的對應關係可見下圖所示:

第四步:創建應用主類,並提供一個rest接口,比如:

@EnableApolloConfig

@SpringBootApplication

public class TestApplication {

public static void main(String[] args) {

SpringApplication.run(TestApplication.class, args);

}

@Slf4j

@RestController

static class TestController {

@GetMapping("/hello")

public String hello() {

return "didispace.com";

}

}

}

其中 @EnableApolloConfig註解是開啟Apollo的配置加載功能。

第五步:Apollo中配置限流規則,具體可見第三步的截圖中的樣子。其中,key值的內容是下面的json

[

{

"resource": "/hello",

"limitApp": "default",

"grade": 1,

"count": 5,

"strategy": 0,

"controlBehavior": 0,

"clusterMode": false

}

]

可以看到上面配置規則是一個數組類型,數組中的每個對象是針對每一個保護資源的配置對象,每個對象中的屬性解釋如下:

resource:資源名,即限流規則的作用對象

limitApp:流控針對的調用來源,若為 default 則不區分調用來源

grade:限流閾值類型(QPS 或並發線程數);0代表根據並發數量來限流, 1代表根據QPS來進行流量控制

count:限流閾值

strategy:調用關係限流策略

controlBehavior:流量控制效果(直接拒絕、Warm Up、勻速排隊)

clusterMode:是否為集群模式

這裡我們只做簡單的配置解釋,以便於理解這裡的配置作用。實際上這裡還有非常多可配置選項和規則,更複雜的配置後面我們單獨開一篇來深入學習。

第六步:啟動應用。如果一些順利,可以看到類似下面的日誌,代表已經成功從Nacos加載了一條限流規則:

2019-04-18 23:56:11.278 INFO 29149 --- [ main] o.s.c.a.s.c.SentinelDataSourceHandler : [Sentinel Starter] DataSource ds-sentinel-apollo-datasource start to loadConfig

2019-04-18 23:56:11.279 INFO 29149 --- [ main] o.s.c.a.s.c.SentinelDataSourceHandler : [Sentinel Starter] DataSource ds-sentinel-apollo-datasource load 1 FlowRule

通過postman或者curl訪問幾下 localhost:8002/hello接口:

$ curl localhost:8002/hello

didispace.com

此時,在Sentinel Dashboard中就可以看到當前我們啟動的 sentinel-datasource-apollo服務。點擊左側菜單中的流控規則,可以看到已經存在一條記錄了,這條記錄就是上面我們在Apollo中配置的限流規則。

深入思考

在使用Apollo存儲規則配置的時候與Nacos存儲一樣,對於Sentinel控制臺這些數據是只讀的,也就是說:

代碼示例

本文介紹內容的客戶端代碼,示例讀者可以通過查看下面倉庫中的 alibaba-sentinel-datasource-apollo項目:

如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支持!

參考資料

下面是Sentinel的倉庫地址與官方文檔,讀者也可以自己查閱文檔學習:

系列回顧

推薦閱讀

號外:最近整理了之前編寫的一系列內容做成了PDF,關注我並回復相應口令獲取:

001領取《Spring Boot基礎教程》

002領取《Spring Cloud基礎教程》

自律到極致 - 人生才精緻:第4期」正在籌備中

關注我,加個星標,不忘籤到哦~

2019

與大家聊聊技術人的斜槓生活

相關焦點

  • Spring Cloud Alibaba基礎教程:Sentinel Dashboard同步Apollo存儲規則
    同時,在文末的思考中,我都指出了這兩套整合方案都存在一個不足之處:不論採用什麼配置中心,限流規則都只能通過Nacos界面或Apollo界面來完成修改才能得到持久化存儲,而在Sentinel Dashboard中修改限流規則雖然可以生效,但是不會被持久化到配置中心。而在這兩個配置中心裡存儲的數據是一個Json格式,當存儲的規則越來越多,對該Json配置的可讀性與可維護性會變的越來越差。
  • Spring Cloud微服務Sentinel+Apollo限流、熔斷實戰
    --Sentinel熔斷限流組件依賴--><dependency>    <groupId>com.alibaba.cloud</groupId>    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>    <version
  • Sentinel規則基於Apollo(阿波羅)持久化
    step2通過docker運行一下命令即可安裝支持apollo持久化的sentinel-dashboard,該鏡像是我基於最新的sentinel面板修改的,支持apollo持久化</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version></dependency><dependency> <groupId>
  • Sentinel Dashboard中修改規則優雅同步到Apollo
    同時,在文末的思考中,我都指出了這兩套整合方案都存在一個不足之處:不論採用什麼配置中心,限流規則都只能通過Nacos界面或Apollo界面來完成修改才能得到持久化存儲,而在Sentinel Dashboard中修改限流規則雖然可以生效,但是不會被持久化到配置中心。而在這兩個配置中心裡存儲的數據是一個Json格式,當存儲的規則越來越多,對該Json配置的可讀性與可維護性會變的越來越差。
  • Spring Cloud Alibaba組件:Sentinel實現接口限流示例
    sentinel-dashboard(控制臺):類似與hystrix-dashboard,除了與hystrix-dashboard一樣提供實時監控之外,還提供了流控規則、熔斷規則的在線維護等功能,它比hystrix-dashboard更為強大一些。
  • SpringCloudAlibaba之Sentinel流控熔斷
    引入 Sentinel 依賴<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  • SpringCloud Alibaba怎麼用?
    7.3sentinel 實時監控服務創建一個新的項目  com.alibaba.cloud  spring-cloud-starter-alibaba-nacos-discovery    com.alibaba.cloud    spring-cloud-starter-alibaba-sentinel完整的pom.xml"1.0" encoding="UTF-8"?
  • SpringCloudAlibaba的學習筆記
    --spring cloud alibaba 2.1.0.RELEASE-->            <dependency>                <groupId>com.alibaba.cloud</groupId>                <artifactId>spring-cloud-alibaba-dependencies
  • Alibaba Sentinel規則持久化-推模式-手把手教程(基於Nacos)
    引用自 https://github.com/alibaba/Sentinel/wiki/在生產環境中使用-Sentinel二、原理簡述控制臺推送規則:•將規則推送到Nacos或其他遠程配置中心•Sentinel客戶端連結Nacos,獲取規則配置;並監聽Nacos配置變化,如發生變化,就更新本地緩存(從而讓本地緩存總是和Nacos一致)控制臺監聽
  • Sentinel Dashboard 中修改規則同步到 Nacos
    下面通過這篇,詳細介紹當使用Nacos作為配置中心之後,如何實現Sentinel Dashboard中修改規則同步到Nacos。關於下面改造的原理和分析可以見上一篇《Sentinel Dashboard中修改規則同步到Apollo》的頭兩節內容,本篇就不重複介紹了。
  • SpringBoot 2.0 + Nacos + Sentinel 流控規則集中存儲
    不過官方也提供了一種 Push模式,擴展讀數據源 ReadableDataSource,規則中心統一推送,客戶端通過註冊監聽器的方式時刻監聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實時性和一致性保證。這裡我們通過配置 Nacos 來實現流控規則的統一存儲配置。架構
  • 你知道如何使用阿里Sentinel實現接口限流嗎?
    本文就先從限流入手,說說如何把Sentinel整合到Spring Cloud應用中,以及如何使用Sentinel Dashboard來配置限流規則。通過這個簡單的例子,先將這一套基礎配置搭建起來。使用Sentinel實現接口限流Sentinel的使用分為兩部分:下面我們就分兩部分來看看,如何使用Sentienl來實現接口限流。
  • Spring Cloud Alibaba到底坑不坑?
    點擊藍色「程序猿DD」關注我喲加個「星標」,不忘籤到哦之前我發過一篇《說說我為什麼看好Spring Cloud Alibaba》,然後這兩天有網友給我轉了這篇文章《坑爹項目spring-cloud-alibaba
  • SpringCloud——Gateway(萬字圖文)
    gateway-nacos-consumer提供網關路由,基於Nacos服務註冊中心。8.8.2> gateway-nacos-provider<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web
  • Sentinel實現限流,竟是如此的簡單!
    在日常開發中,限流功能時常被使用,用於對某些接口進行限流熔斷,譬如限制單位時間內接口訪問次數;或者按照某種規則進行限流,如限制ip的單位時間訪問次數等。之前我們已經講過接口限流的工具類ratelimter可以實現令牌桶的限流,很明顯sentinel的功能更為全面和完善。
  • sentinel dashboard集成nacos
    >com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <!
  • Springboot/Cloud集成Sentinel進階實戰
    自定義處理類package com.gblfy.distributedlimiter.handle;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;import com.alibaba.csp.sentinel.slots.block.BlockException
  • 阿里開源的限流神器 Sentinel,輕鬆搞定接口限流!
    在日常開發中,限流功能時常被使用,用於對某些接口進行限流熔斷,譬如限制單位時間內接口訪問次數;或者按照某種規則進行限流,如限制ip的單位時間訪問次數等。之前我們已經講過接口限流的工具類ratelimter可以實現令牌桶的限流,很明顯sentinel的功能更為全面和完善。
  • 無需寫代碼,引入Sentinel只需一行配置即可搞定限流!
    在日常開發中,限流功能時常被使用,用於對某些接口進行限流熔斷,譬如限制單位時間內接口訪問次數;或者按照某種規則進行限流,如限制ip的單位時間訪問次數等。之前我們已經講過接口限流的工具類ratelimter可以實現令牌桶的限流,很明顯sentinel的功能更為全面和完善。
  • 【Spring Cloud Alibaba】Nacos 服務註冊與發現
    1、服務註冊首先創建一個名為:spring-cloud-alibaba-nacos-discovery 的引用,相關依賴為以下內容,核心依賴 spring-cloud-starter-alibaba-nacos-discovery<dependencies>