Sentinel介紹與使用

Sentinel 開篇

分布式系統(tǒng)的流量防衛(wèi)兵: 隨著微服務(wù)的普及,服務(wù)調(diào)用的穩(wěn)定性也變的越來(lái)越重要,Sentinel以“流量”為切入點(diǎn),在流量控制、斷路、負(fù)載保護(hù)等多個(gè)方面進(jìn)行續(xù)航,保證服務(wù)的可靠性。

Sentinel具有以下特征:

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

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

  • 廣泛的開源生態(tài):Sentinel 提供開箱即用的與其它開源框架/庫(kù)的整合模塊,例如與 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相應(yīng)的依賴并進(jìn)行簡(jiǎn)單的配置即可快速地接入 Sentinel。同時(shí) Sentinel 提供 Java/Go/C++ 等多語(yǔ)言的原生實(shí)現(xiàn)。

  • 完善的 SPI 擴(kuò)展機(jī)制:Sentinel 提供簡(jiǎn)單易用、完善的 SPI 擴(kuò)展接口。您可以通過(guò)實(shí)現(xiàn)擴(kuò)展接口來(lái)快速地定制邏輯。例如定制規(guī)則管理、適配動(dòng)態(tài)數(shù)據(jù)源等。

Sentinel 的主要特性:

Sentinel的妙用

當(dāng)我們的分布式系統(tǒng),面臨復(fù)雜的體系結(jié)構(gòu)中應(yīng)用程序可能有數(shù)十個(gè)依賴關(guān)系,每個(gè)依賴關(guān)系在某些時(shí)候?qū)⒉豢杀苊獾氖?,比如我們調(diào)用 D\F\K 這幾個(gè)服務(wù),如果這些服務(wù)中某一個(gè)出現(xiàn)問(wèn)題了,那么有可能會(huì)出現(xiàn)整體系統(tǒng)效率的下降,嚴(yán)重的甚至出現(xiàn)服務(wù)雪崩。

多個(gè)微服務(wù)之間互相調(diào)用的時(shí)候,如果D調(diào)用K和F,而K和F又調(diào)用其他的微服務(wù),那么就會(huì)形成扇出
,如果扇出某個(gè)鏈路上的微服務(wù)調(diào)用超時(shí)或者響應(yīng)很慢,那么微服務(wù)D就會(huì)占用越來(lái)越多的系統(tǒng)資源,從而導(dǎo)致系統(tǒng)崩潰,也就是服務(wù)雪崩。

對(duì)于高流量的應(yīng)用來(lái)說(shuō),單一的后端依賴可能會(huì)導(dǎo)致服務(wù)器上的資源在極短的時(shí)間內(nèi)被耗光,同時(shí)還有可能導(dǎo)致這些應(yīng)用程序服務(wù)之間的響應(yīng)時(shí)間增加,隊(duì)列、線程和其他系統(tǒng)資源變的緊缺,導(dǎo)致整個(gè)系統(tǒng)之間發(fā)生更多的次生故障,如果我們單個(gè)應(yīng)用服務(wù)故障處理和延遲進(jìn)行隔離管控,當(dāng)單個(gè)依賴關(guān)系失敗時(shí),不能對(duì)這個(gè)系統(tǒng)和資源產(chǎn)生影響,當(dāng)某個(gè)模塊實(shí)例失敗以后,如果這個(gè)時(shí)候服務(wù)還能接收請(qǐng)求和流量訪問(wèn),同時(shí)這個(gè)服務(wù)還去調(diào)用其他模塊時(shí),這樣的級(jí)聯(lián)故障,就會(huì)導(dǎo)致雪崩的發(fā)生

對(duì)比與其他的斷流產(chǎn)品(Hystrix)而言,他不需要我們自己手動(dòng)搭建監(jiān)控平臺(tái),而且它有一套屬于自己的Web界面,可對(duì)多種指標(biāo)進(jìn)行流控、熔斷,且提供了實(shí)時(shí)監(jiān)控和控制面板,功能更為強(qiáng)大

Sentinel 使用

下載地址:https://github.com/alibaba/Sentinel/releases

Sentinel分為兩個(gè)部分:

  • 核心庫(kù):不依賴任何框架/庫(kù),只需要Java運(yùn)行時(shí)環(huán)境,同時(shí)對(duì)Dubbo\SpringCloud等框架也有很好的支持
  • 控制臺(tái):基于SpringBoot開發(fā),打包后可以直接運(yùn)行,不需要額外的應(yīng)用容器

注意:
jdk1.8環(huán)境/8080端口不能被占用

啟動(dòng)命令:java -jar sentinel-dashboard-1.8.4.jar

訪問(wèn)地址:http://localhost:8080/

賬號(hào)密碼:sentinel/sentinel

到這里呢,我們的Sentinel就安裝成功了,可能有點(diǎn)同學(xué)在界面上沒有看到任何東西,并沒有發(fā)現(xiàn)監(jiān)控的服務(wù),這是因?yàn)槲覀冞€沒有啟動(dòng)項(xiàng)目,而Sentinel本身采用的是懶加載模式,所以我們需要先去訪問(wèn)服務(wù)對(duì)應(yīng)的接口,Sentinel才會(huì)進(jìn)行工作,接下來(lái)我們就來(lái)搭建我們的測(cè)試項(xiàng)目

搭建項(xiàng)目

Sentinel官方參考文檔:https://sentinelguard.io/zh-cn/docs/quick-start.html

注意: 這里我們使用到了Nacos,不會(huì)Nacos的小伙伴,可以看我之前的文章,里面有詳細(xì)的介紹,其實(shí)只需要你啟動(dòng)一個(gè)端口為8848的Nacos就行

導(dǎo)入依賴:

<!-- Nacos客戶端依賴 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- sentinel依賴 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置屬性:

server:
  port: 8006

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        #配置Sentinel地址,就是我們的WEB界面
        dashboard: localhost:8080
        #Sentinel配置默認(rèn)8719端口,被占用端口會(huì)自動(dòng)從+1,直到找到未被占用的端口
        port: 8719

management:
  endpoints:
    web:
      exposure:
        include: '*'

測(cè)試類:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;

@RestController
public class TestController {

    @GetMapping("/playA")
    public String playA() {
        return "hello my name is playA ,wo shi boy";
    }

    @GetMapping("/playB")
    public String playB(){
        return "hi my name is playB, me girl";
    }
}

最后在我們的啟動(dòng)類上加上 :@EnableDiscoveryClient,點(diǎn)擊啟動(dòng),然后我們來(lái)訪問(wèn)我們的測(cè)試地址:

http://localhost:8006/playA

http://localhost:8006/playB

訪問(wèn)之后,我們就能在Sentinel上看到我們的監(jiān)控信息了,如下所示:

好了,你們以為到這里Sentinel就講解完了嗎?哎~怎么可能,我還要繼續(xù)卷,寧愿累死自己,也要卷死你們!雖然基本操作已經(jīng)完成,但是不講一下他的 流控規(guī)則 ,我們?cè)趺茨苡∠笊羁棠兀渴前?,各位大漂亮和大聰明?/p>

Sentinel 流控規(guī)則

首先我們先來(lái)看一張圖:

上面這張圖,就包含了,我們要講解的全部?jī)?nèi)容,主要分為以下幾點(diǎn):

  • 資源名:流控規(guī)則中唯一的名稱,默認(rèn)為我們的請(qǐng)求路徑

  • 針對(duì)來(lái)源:Sentinel 對(duì)調(diào)用者進(jìn)行限流,填寫我們的微服務(wù)名,默認(rèn)為default,對(duì)來(lái)源不進(jìn)行區(qū)分

  • 閾值類型/單機(jī)閾值

    • QPS(每秒請(qǐng)求數(shù)量),使用該類型時(shí),QPS達(dá)到我們?cè)O(shè)置的單機(jī)閾值,進(jìn)行限流
    • 線程數(shù):當(dāng)使用該類型時(shí),線程數(shù)量達(dá)到我們?cè)O(shè)置的單機(jī)閾值,進(jìn)行限流
  • 是否集群:默認(rèn)否,如果是集群勾選

  • 流控模式

    • 直接:API達(dá)到限流條件時(shí),直接限流,如果我們?cè)O(shè)置QPS為1,如果大于這個(gè)數(shù)量,直接返回錯(cuò)誤
    • 關(guān)聯(lián):當(dāng)關(guān)聯(lián)的資源達(dá)到閾值時(shí),限流自己,比如A調(diào)用B,B達(dá)到了閾值,A進(jìn)行限流
    • 鏈路:只記錄鏈路上的流量,指定對(duì)應(yīng)的鏈路路徑,從入口開始,如果達(dá)到閾值,則進(jìn)行限流
  • 流控效果

    • 快速失?。褐苯訏伄惓?/li>
    • Warm Up:根據(jù)冷加載因子codeFactor經(jīng)過(guò)預(yù)熱時(shí)長(zhǎng),才達(dá)到設(shè)置的QPS閾值
    • 排隊(duì)等待:勻速排隊(duì),讓請(qǐng)求以勻速速度進(jìn)行請(qǐng)求,閾值類型,需要設(shè)置為QPS,否則無(wú)效

    我們先來(lái)新增一個(gè)流控規(guī)則看一下,操作方式有兩種

    1. 在流控規(guī)則中添加
    2. 在簇點(diǎn)鏈路中添加

    因?yàn)榉奖悖覀円话銜?huì)選擇在簇點(diǎn)鏈路中添加,我們先來(lái)試一下QPS的操作:

這里我們?cè)O(shè)置單機(jī)閾值為1,所以playA這個(gè)接口一秒中只能被訪問(wèn)一次,如果超過(guò),則進(jìn)行限流操作進(jìn)行一個(gè)阻塞操作,這個(gè)效果我們是可以直接看到的,當(dāng)我們不停的刷新playA時(shí),就會(huì)現(xiàn)在如下信息,而沒有設(shè)置的playB,則不會(huì)

在這里我們?nèi)绻O(shè)置為線程數(shù)會(huì)怎么樣呢?我們來(lái)看一下。

在這里我們要注意:如果項(xiàng)目重新啟動(dòng),需要將修改后的playA,重新訪問(wèn)后重新,添加流控規(guī)則

同時(shí)我們需要在代碼中設(shè)置延時(shí)執(zhí)行,如果處理太快,我們是看不到實(shí)際效果的,如果有興趣的小伙伴可以自己?jiǎn)?dòng)線程去跑,在這里我們?cè)O(shè)置playA,進(jìn)行一秒鐘的延時(shí)操作,

       @GetMapping("/playA")
    public String playA() {
        try {
            //阻塞1 秒
            TimeUnit.MILLISECONDS.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "hello my name is playA ,wo shi boy";
    }

這里要使用兩個(gè)不同瀏覽器去跑,同一個(gè)瀏覽器使用的是同一線程,先請(qǐng)求的某歌后請(qǐng)求的某火效果如下所示:


QPS和并發(fā)線程數(shù)的規(guī)則如下所示:

總結(jié)

雖然最終效果是一樣的,但是規(guī)則是不同的,每種應(yīng)對(duì)不用的業(yè)務(wù)場(chǎng)景,大家可以合理化的去使用,到這里我們的Sentinel就講完了,后面還有更多有關(guān)于Sentinel的原理和介紹,如果覺得文中對(duì)你有幫助的,記得點(diǎn)贊關(guān)注,你的支持就是我創(chuàng)作的最大動(dòng)力!


文章轉(zhuǎn)載自: https://muxiaonong.blog.csdn.net/

公眾號(hào)名稱:牧小農(nóng) 微信掃碼關(guān)注或搜索公眾號(hào)名稱