【Sentinel】sentinel 集成 apollo 最佳實踐

【Sentinel】sentinel 集成 apollo 最佳實踐

sentinel

前言

??在 sentinel 的控制臺設(shè)置的規(guī)則信息默認(rèn)都是存在內(nèi)存當(dāng)中的檐什。所以無論你是重啟了 sentinel 的客戶端還是 sentinel 的控制臺淑际。你所設(shè)置的規(guī)則都會丟失航夺。如果想要 sentinel 在線上環(huán)境使用,要么花錢用阿里云上的付費版本坝茎,要么自己去實現(xiàn)規(guī)則的持久化拯欧,如果你或你所在的公司不差錢,那么關(guān)掉這篇文章暴拄,直接用付費版吧,省掉了一大堆坑要踩编饺」耘瘢或者你是一個特立獨行的人,那么我們接著往下說透且。
??首先說一下寫這篇文章的原因撕蔼,因為真得在與 apllo 集成時,踩坑踩到懷疑人生秽誊。另一點是鲸沮,找了一大堆關(guān)于集成的 apollo 的文章,都清一色的都是仿照官方給的限流規(guī)則的 DEMO 做的锅论。 但是 sentinel 規(guī)則還有熔斷規(guī)則讼溺、參數(shù)限流、系統(tǒng)限流最易、黑白名單等很多規(guī)則怒坯,每個規(guī)則還有細(xì)節(jié)上的不一致,這些都沒有提耘纱,還有一些客戶端的坑就更沒有了敬肚。踩了這么多坑,有了一點心得與體會束析,梳理與此艳馒,希望能幫助到讀者。

拉取 sentinel 控制臺源碼進(jìn)行修改

??因為修改內(nèi)容過多员寇,本文不會詳述弄慰,下面的截圖是所有修改內(nèi)容,并且因為寫這篇文章時蝶锋,1.7版本在 master 開發(fā)陆爽,有大量快照版本。所以是切到當(dāng)前穩(wěn)定的 1.6 分支進(jìn)行修改的扳缕。我已經(jīng) fork sentinel 到我的 github慌闭,下面是修改的內(nèi)容 地址

修改點1:實現(xiàn)所有規(guī)則的拉取與推送接口

??添加與實現(xiàn)了所有的規(guī)則的 Provider 與 Publisher 的配置拉取的與推送。

修改點2:修改控制臺使用的規(guī)則操作 api

規(guī)則在控制臺的操作 controller 進(jìn)行大量改造躯舔。

修改點3:修改 xxEntity

??最后一點也是最坑的修改了大量的 xxEntity 類驴剔,這些類是規(guī)則的實體類,本身沒什么粥庄,源碼是直接 json 化保存的丧失,但是用于客戶端集成的 spring-cloud-alibaba 使用了 json 校驗,如果 apollo 保存的 json 與客戶端的實體類有一丁點不一樣就報 convert 0 rules but there are 1 rules from datasource . RuleCLass: FlowRule 惜互。 是不是覺得很摸不著頭腦布讹,這報錯跟 json 格式轉(zhuǎn)換錯誤有什么琳拭,下面是 spring-cloud-alibaba json 轉(zhuǎn)換的代碼。

??寫這段代碼的老哥描验,把這個異常吃了白嘁,并補(bǔ)上了一個 // won't be happen 的注釋,你能理解我當(dāng)時被這個報錯坑的死去活來挠乳,后來發(fā)現(xiàn)是這里的問題嗎权薯?后來在 github 上找到兩個同樣的問題問題1問題2睡扬,按照方法把 xxEntity 中用不到的字段全部加上 @JSONField(serialize = false) 解決盟蚣。

修改點4:抽離配置使得可以在啟動的時傳入

??添加的配置在下面

使用修改的控制臺版本

  1. 你可以fork sentinel 官方代碼按上述的自行修改,然后打包
  2. 你可以拉取我 fork 的 sentinel 代碼下來直接打包
  3. 你可以使用我已經(jīng)打好的包 地址

自定義配置

配置名稱 是否必填 默認(rèn)值 作用
env DEV 指定 apollo 使用的環(huán)境
app.id sentinel-apollo 指定保存 sentinel 規(guī)則的 apollo 應(yīng)用 ID
cluster.name default 指定保存 sentinel 使用的 apollo 集群
namespace.name application 指定保存 sentinel 使用的 apollo 命名空間
modify.user apollo 控制臺顯示的修改人賬號卖怜,此賬號務(wù)必要有此應(yīng)用的權(quán)限
modify.comment modify by sentinel-dashboard apollo 控制臺顯示的修改備注
release.user apollo 控制臺顯示的發(fā)布人賬號屎开,此賬號務(wù)必要有此應(yīng)用的權(quán)限
release.comment release by sentinel-dashboard apollo 控制臺顯示的發(fā)布備注
apollo.portal.url apollo 控制臺的地址
apollo.application.token 指定保存 sentinel 規(guī)則的 apollo 應(yīng)用 openapi 的 token
authority.key.suffix authority 認(rèn)證規(guī)則保存在 apollo 中的 key 的后綴
degrade.key.suffix degrade 熔斷規(guī)則保存在 apollo 中的 key 的后綴
flow.key.suffix flow 限流規(guī)則保存在 apollo 中的 key 的后綴
param.key.suffix param_flow 參數(shù)限流規(guī)則保存在 apollo 中的 key 的后綴
system.key.suffix system 系統(tǒng)限流規(guī)則保存在 apollo 中的 key 的后綴
auth.username sentinel sentinel 控制臺的登錄用戶名
auth.password sentinel sentinel 控制臺的登錄密碼
server.port 8080 sentinel 控制臺的啟動端口

Apollo 配置

創(chuàng)建用于保存 sentinel 的項目

  1. 點擊創(chuàng)建項目按鈕


  2. 輸入項目信息


    1. 應(yīng)用 ID 對應(yīng) 上面表格中的 app.id
    2. 應(yīng)用負(fù)責(zé)人 對應(yīng) 上面表格中的 modify.userrelease.user
  3. 創(chuàng)建一個公共命名空間
    1. 點擊右下角添加 Namespace 按鈕


    2. 創(chuàng)建 Namespace


      1. 名稱對應(yīng)上面表格中的 namespace.name,注意名稱是要包含部門名的马靠,這里脫敏了
      2. 類型一定要選擇 public 奄抽,原因后面會說
  4. 發(fā)布 Namespace


    1. 私有的空間是不能被繼承的,application 沒有用甩鳄,可以刪除
      1. 這里的用意是我們獨立出一個單獨的用于保存規(guī)則的 apollo 應(yīng)用逞度,因為是公共的,所以其它apollo 應(yīng)用可以繼承妙啃,這樣對于已經(jīng)集成 apollo 的項目來說档泽,改動最小
      2. 注意紅色的提示,我們建的公共空間要首先發(fā)布一次揖赴,否則 api 無法訪問到
  5. 創(chuàng)建此項目的開放平臺授權(quán)
    1. 點擊右上角的開放平臺授權(quán)管理
    2. 創(chuàng)建應(yīng)用


      1. 第三方應(yīng)用 ID 就是你上面創(chuàng)建的項目的 appId
      2. 第三方應(yīng)用名稱 隨便寫
    3. 賦權(quán)


      1. token 你點擊創(chuàng)建應(yīng)用后自動生成的
      2. 被管理的 Appid 就是你上面創(chuàng)建的項目的 appId
      3. 授權(quán)類型 一定要選 App

spring boot 集成 sentinel

源碼地址

引入依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>0.9.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-apollo</artifactId>
            <version>1.5.2</version>
        </dependency>

測試 controller

package cn.coder4j.study.example.sentinel;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author buhao
 * @version TestController.java, v 0.1 2019-09-19 20:53 buhao
 */
@RequestMapping("/test")
@Controller
public class TestController {

    /**
     * 沒有注解通過自適應(yīng)的限流
     * @return
     */
    @GetMapping("/flowRule")
    @ResponseBody
    public String flowRule(){
        return "success";
    }

    /**
     * 通過手動注解的限流
     * @return
     */
    @GetMapping("/flowRuleWithAnno")
    @ResponseBody
    @SentinelResource("flowRuleWithAnno")
    public String flowRuleWithAnno(){
        return "success";
    }

    /**
     * 參數(shù)限流規(guī)則測試
     * @param param
     * @return
     */
    @GetMapping("/paramFlowRule")
    @ResponseBody
    @SentinelResource("paramFlowRule")
    public String paramFlowRule(String param){
        return "success";
    }

    /**
     * 熔斷規(guī)則測試
     * @return
     */
    @GetMapping("/degradeRule")
    @ResponseBody
    @SentinelResource("degradeRule")
    public String degradeRule(){
        throw new RuntimeException("服務(wù)器異常");
    }
}

配置 application.yml

apollo:
  bootstrap:
    enabled: true # 開啟 apollo
  meta: xxx       # 指定 apollo 注冊地址
app:
  id: sentinel-apollo  # 指定規(guī)則項目在 apollo 的app.id代赁,要與 sentinel 控制臺啟動參數(shù)一致
spring:
  application:
    name: study-sentinel-example  # 應(yīng)用名稱职恳,不同項目要唯一,會把他做為規(guī)則 Key 的前綴
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8989  # sentinel 控制臺的地址
      datasource:
        ds1:
          apollo:
            namespace-name: {部門名}.sentinel-rule  # 保存規(guī)則的 apollo 應(yīng)用的公共 namespace危虱, 要與 sentinel 控制臺啟動參數(shù)一致
            rule-type: flow   # 指定該數(shù)據(jù)源是限流規(guī)則
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds1.apollo.rule-type} # 指定該規(guī)則在 apollo 應(yīng)用中 key 名稱
        ds2:
          apollo:
            namespace-name: {部門名}.sentinel-rule
            rule-type: degrade # 指定該數(shù)據(jù)源是熔斷規(guī)則
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds2.apollo.rule-type} # 指定該規(guī)則在 apollo 應(yīng)用中 key 名稱
        ds3:
          apollo:
            namespace-name: {部門名}.sentinel-rule
            rule-type: param_flow # 指定該數(shù)據(jù)源是參數(shù)限流規(guī)則
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds3.apollo.rule-type} # 指定該規(guī)則在 apollo 應(yīng)用中 key 名稱
        ds4:
          apollo:
            namespace-name: {部門名}.sentinel-rule
            rule-type: system  # 指定該數(shù)據(jù)源是系統(tǒng)限流規(guī)則
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds4.apollo.rule-type} # 指定該規(guī)則在 apollo 應(yīng)用中 key 名稱
        ds5:
          apollo:
            namespace-name: {部門名}.sentinel-rule
            rule-type: authority # 指定該數(shù)據(jù)源是認(rèn)證限流(黑白名單)規(guī)則
            flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds5.apollo.rule-type} # 指定該規(guī)則在 apollo 應(yīng)用中 key 名稱


sentinel 控制臺配置

  1. 第一次啟動時 sentinel 是沒有應(yīng)用數(shù)據(jù)鸳吸,只要請求幾次你應(yīng)用的接口就可以了


  2. 請求之后可以看到我們的應(yīng)用在右側(cè)列表了


  3. 首先點擊簇點監(jiān)控林束,如果是空白的話說明惹恃,接口還沒有被請求過庇茫,通過上面提供的 jmeter 腳本,可以快速訪問所有接口搀菩,訪問后如下圖所示


    1. 可以看到除了我們手動通過注解定義的資源名焊虏,還多了一些是通過我們的 controller 路徑的資源名,這些都是我們客戶端集成 spring-cloud-starter-alibaba-sentinel 包后秕磷,自動適配的。這兩種其實在使用上有區(qū)別的
      1. 自動適配的限流后會返回 Blocked by Sentinel (flow limiting)
      2. 通過注解的是會拋出 UndeclaredThrowableException 異常炼团,我們可以通過 文章 說的方法轉(zhuǎn)成我們想的限流異常處理澎嚣。
    2. 右邊的操作就是添加各種規(guī)則疏尿,這里修改后會實時同步到客戶端并同步保存到 apollo

jmeter 配置

??jmeter 是用于測試與驗證規(guī)則使用的,因為可以設(shè)置線程數(shù)易桃,所以可以很好的測試限流情況褥琐。測試腳本下載

  1. 線程組要把線程設(shè)置成 100,方便后面的統(tǒng)計晤郑,另外為了在一秒內(nèi)執(zhí)行完敌呈,Ramp-Up 時間設(shè)為0


  1. 請求默認(rèn)值就是填寫你本地的啟的測試項目的地址


  2. xx 規(guī)則填寫測試接口地址,參數(shù)限流因為要做對照實驗所以寫了兩個


  3. 查看結(jié)果樹可以看到你每次請求的內(nèi)容與結(jié)果


  4. 可以看到上張圖片內(nèi)有紅色的有綠色的造寝,紅色說明斷言失敗磕洪,綠色說明斷言成功,斷言的內(nèi)容就是包含 success


  5. 聚合統(tǒng)計诫龙,這個可以統(tǒng)計出100個線程請求后的總體結(jié)果析显,我們只要看 Error% 的失敗率就可以了。圖中可以看到除了熔斷限流签赃,其它限流失敗率是 0


測試步驟

  1. 在簇點鏈路中找到 /test/flowRule谷异,并點擊流控按鈕
  2. 單機(jī)閾值填入 10,點擊新增


  3. 新增后會跳轉(zhuǎn)到流程規(guī)則頁面


  4. 運行jemter锦聊,可以看到失敗率為90%歹嘹,這代表你的限流成功了


    1. 上面說了失敗是因為斷言沒有成功,也就是說沒有返回 success孔庭,那他現(xiàn)在返回的是什么呢尺上?
    2. 察看結(jié)果樹,隨便找一條紅包的記錄史飞,看響應(yīng)數(shù)量


    3. 可以看到返回的是 "Blocked by Sentinel (flow limiting)"尖昏,這個就是集成后配置的限流頁面的返回值,可以通過 spring.cloud.sentinel.servlet.block-page 指定成你自己的頁面
  5. 另外打開 apollo 可以看到构资,多了一個規(guī)則抽诉,這就是你剛剛添加的限流規(guī)則


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吐绵,隨后出現(xiàn)的幾起案子迹淌,更是在濱河造成了極大的恐慌,老刑警劉巖己单,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唉窃,死亡現(xiàn)場離奇詭異,居然都是意外死亡纹笼,警方通過查閱死者的電腦和手機(jī)纹份,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔓涧,你說我怎么就攤上這事件已。” “怎么了元暴?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵篷扩,是天一觀的道長。 經(jīng)常有香客問我茉盏,道長鉴未,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任鸠姨,我火速辦了婚禮铜秆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘享怀。我一直安慰自己羽峰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布添瓷。 她就那樣靜靜地躺著梅屉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳞贷。 梳的紋絲不亂的頭發(fā)上坯汤,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音搀愧,去河邊找鬼惰聂。 笑死,一個胖子當(dāng)著我的面吹牛咱筛,可吹牛的內(nèi)容都是我干的搓幌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼迅箩,長吁一口氣:“原來是場噩夢啊……” “哼溉愁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饲趋,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拐揭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奕塑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堂污,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年龄砰,在試婚紗的時候發(fā)現(xiàn)自己被綠了盟猖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讨衣。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扒披,靈堂內(nèi)的尸體忽然破棺而出值依,到底是詐尸還是另有隱情,我是刑警寧澤碟案,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站颇蜡,受9級特大地震影響价说,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜风秤,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一鳖目、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缤弦,春花似錦领迈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至累提,卻和暖如春尘喝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斋陪。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工朽褪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人无虚。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓缔赠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親友题。 傳聞我的和親對象是個殘疾皇子嗤堰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容