最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Sentinel網(wǎng)關(guān)限流與SpringCloud Gateway整合過(guò)程

 更新時(shí)間:2024年11月05日 11:24:19   作者:houxian1103  
本文介紹了如何通過(guò)SpringCloudGateway集成阿里的Sentinel進(jìn)行網(wǎng)關(guān)限流,Sentinel作為流量防衛(wèi)兵,提供了豐富的應(yīng)用場(chǎng)景和完備的實(shí)時(shí)監(jiān)控功能,通過(guò)配置路由維度和自定義API維度的限流規(guī)則,實(shí)現(xiàn)了對(duì)微服務(wù)的保護(hù)

網(wǎng)關(guān)如何限流?

Spring Cloud Gateway本身自帶的限流實(shí)現(xiàn),過(guò)濾器是RequestRateLimiterGatewayFilterFactory,不過(guò)這種比較簡(jiǎn)單,有興趣的可以實(shí)現(xiàn)下。

今天的重點(diǎn)是集成阿里的Sentinel實(shí)現(xiàn)網(wǎng)關(guān)限流,sentinel顧名思義:衛(wèi)兵;在Redis中叫做哨兵,用于監(jiān)控主從切換,但是在微服務(wù)中叫做流量防衛(wèi)兵。Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。

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)行情況。
  • 廣泛的開(kāi)源生態(tài):Sentinel 提供開(kāi)箱即用的與其它開(kāi)源框架/庫(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 的主要特性如下圖:

從1.6.0版本開(kāi)始,Sentinel提供了SpringCloud Gateway的適配模塊,可以提供兩種資源維度的限流:

**route維度:**即在配置文件中配置的路由條目,資源名為對(duì)應(yīng)的routeId,這種屬于粗粒度的限流,一般是對(duì)某個(gè)微服務(wù)進(jìn)行限流。

**自定義API維度:**用戶可以利用Sentinel提供的API來(lái)自定義一些API分組,這種屬于細(xì)粒度的限流,針對(duì)某一類的uri進(jìn)行匹配限流,可以跨多個(gè)微服務(wù)。

項(xiàng)目實(shí)踐

新建一個(gè)gateway-service模塊,添加如下依賴:

<!--nacos注冊(cè)中心-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!--spring cloud gateway-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

    <!--    spring cloud gateway整合sentinel的依賴-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
    </dependency>

    <!--    sentinel的依賴-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>

配置文件

配置文件中主要指定以下三種配置:

  • nacos的地址
  • sentinel控制臺(tái)的地址
  • 網(wǎng)關(guān)路由的配置

配置如下

server:
  port: 8100
logging:
  path: d:/
spring:
  application:
    name: gateway-service
  cloud:
    nacos:
      server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
    gateway:
      routes:
        - id: mqtt-service-route
          uri: lb://mqtt-service
          predicates:
            - Path=/mqtt/**
        - id: usermgr-service-route
          uri: lb://usermgr-service
          predicates:
            - Path=/usermgr/**

上述配置中設(shè)置了一個(gè)路由usermgr-service-route,只要請(qǐng)求路徑滿足http://127.0.0.1:8100/usermgr/user/id都會(huì)被路由到usermgr-service這個(gè)服務(wù)中

限流配置

經(jīng)過(guò)上述兩個(gè)步驟其實(shí)已經(jīng)整合好了Sentinel,此時(shí)訪問(wèn)一下接口:http://127.0.0.1:8100/usermgr/user/id

然后在sentinel控制臺(tái)可以看到已經(jīng)被監(jiān)控了,監(jiān)控的路由是usermgr-service,如下圖:

上圖中對(duì)usermgr-service這個(gè)路由做出了限流,QPS閾值為1。

此時(shí)快速訪問(wèn):http://127.0.0.1:8100/usermgr/user/id,看到已經(jīng)被限流了,如下圖:

以上route維度的限流已經(jīng)配置成功,小伙伴可以自己照著上述步驟嘗試一下。

API分組限流

首先需要定義一個(gè)分組,API管理-> 新增API分組,如下圖:

匹配模式選擇了精確匹配(還有前綴匹配,正則匹配),因此只有這個(gè)uri:http://127.0.0.1:8100/usermgr/user/id會(huì)被限流。

第二步需要對(duì)這個(gè)分組添加流控規(guī)則,流控規(guī)則->新增網(wǎng)關(guān)流控,如下圖

API名稱那里選擇對(duì)應(yīng)的分組即可,新增之后,限流規(guī)則就生效了。

如何自定義限流異常信息?

從上面的演示中可以看到默認(rèn)的異常返回信息是:“Block…”,這種肯定是客戶端不能接受的,因此需要定制自己的異常返回信息。

下面介紹兩種不同的方式定制異常返回信息,開(kāi)發(fā)中自己選擇其中一種。

直接配置文件中定制

開(kāi)發(fā)者可以直接在配置文件中直接修改返回信息,配置如下:

spring:
  cloud:
    ## 整合sentinel,配置sentinel控制臺(tái)的地址
    sentinel:
      #配置限流之后,響應(yīng)內(nèi)容
      scg:
        fallback:
          ## 兩種模式,一種是response返回文字提示信息,
          ## 一種是redirect,重定向跳轉(zhuǎn),需要同時(shí)配置redirect(跳轉(zhuǎn)的uri)
          mode: response
          ## 響應(yīng)的狀態(tài)
          response-status: 200
          ## 響應(yīng)體
          response-body: '{"code": 200,"message": "請(qǐng)求失敗,稍后重試!"}'

上述配置中mode配置的是response,一旦被限流了,將會(huì)返回JSON串

{
    "code": 200,
    "message": "請(qǐng)求失敗,稍后重試!"
}

重定向的配置

如下:

spring:
  cloud:
    ## 整合sentinel,配置sentinel控制臺(tái)的地址
    sentinel:
      #配置限流之后,響應(yīng)內(nèi)容
      scg:
        fallback:
          ## 兩種模式,一種是response返回文字提示信息,一種是redirect,重定向跳轉(zhuǎn),需要同時(shí)配置redirect(跳轉(zhuǎn)的uri)
          mode: redirect
          ## 跳轉(zhuǎn)的URL
          redirect: http://www.baidu.com

一旦被限流,將會(huì)直接跳轉(zhuǎn)到:http://www.baidu.com

編碼定制

這種就不太靈活了,通過(guò)硬編碼的方式,完整代碼如下:

package com.spacetime.gateway.config;

import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class GatewayConfig {
    /**
     * 自定義限流處理器
     */
    @PostConstruct
    public void initBlockHandlers() {
        BlockRequestHandler blockHandler = (serverWebExchange, throwable) -> {
            Map map = new HashMap();
            map.put("code",200);
            map.put("message","請(qǐng)求失敗,稍后重試!");
            return ServerResponse.status(HttpStatus.OK)
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .body(BodyInserters.fromObject(map));
        };
        GatewayCallbackManager.setBlockHandler(blockHandler);
    }
}

總結(jié)

文章介紹了Spring Cloud Gateway整合Sentinel對(duì)網(wǎng)關(guān)層進(jìn)行限流,以及關(guān)于限流的一些思考。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring服務(wù)注解有哪些

    Spring服務(wù)注解有哪些

    這篇文章主要介紹了Spring服務(wù)注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2016-11-11
  • java通過(guò)Callable和Future來(lái)接收線程池的執(zhí)行結(jié)果

    java通過(guò)Callable和Future來(lái)接收線程池的執(zhí)行結(jié)果

    這篇文章主要介紹了java通過(guò)Callable和Future來(lái)接收線程池的執(zhí)行結(jié)果,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • springboot多環(huán)境進(jìn)行動(dòng)態(tài)配置的方法

    springboot多環(huán)境進(jìn)行動(dòng)態(tài)配置的方法

    這篇文章主要介紹了springboot多環(huán)境下如何進(jìn)行動(dòng)態(tài)配置,本文主要分享了如何在springboot的項(xiàng)目中使用多環(huán)境配置,重點(diǎn)是”spring.profiles.active“屬性,需要的朋友可以參考下
    2022-06-06
  • Spring在@ConditionalOnProperty注解使用詳解

    Spring在@ConditionalOnProperty注解使用詳解

    這篇文章主要介紹了Spring在@ConditionalOnProperty注解使用詳解,@ConditionalOnProperty注解是Spring Boot的條件注解,主要用法是根據(jù)配置文件中的屬性來(lái)控制某個(gè)配置類是否生效,或者控制某個(gè)Bean是否被創(chuàng)建,需要的朋友可以參考下
    2023-11-11
  • Java中instanceOf關(guān)鍵字的用法及特性詳解

    Java中instanceOf關(guān)鍵字的用法及特性詳解

    當(dāng)我們?cè)谶M(jìn)行向下轉(zhuǎn)型時(shí),如果兩個(gè)對(duì)象之間沒(méi)有直接或間接的繼承關(guān)系,在轉(zhuǎn)換時(shí)有可能會(huì)產(chǎn)生強(qiáng)制類型轉(zhuǎn)換異常,我們可以使用java中自帶的instanceOf關(guān)鍵字來(lái)解決這個(gè)問(wèn)題,所以本篇文章,會(huì)帶大家學(xué)習(xí)instanceOf的用法及特性,需要的朋友可以參考下
    2023-05-05
  • Java虛擬機(jī)棧jvm棧的作用

    Java虛擬機(jī)棧jvm棧的作用

    本文主要介紹了Java虛擬機(jī)棧jvm棧的作用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • SpringBoot整合Elasticsearch實(shí)現(xiàn)索引和文檔的操作方法

    SpringBoot整合Elasticsearch實(shí)現(xiàn)索引和文檔的操作方法

    Elasticsearch 基于 Apache Lucene 構(gòu)建,采用 Java 編寫,并使用 Lucene 構(gòu)建索引、提供搜索功能,本文分步驟通過(guò)綜合案例給大家分享SpringBoot整合Elasticsearch的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Springboot詳細(xì)講解循環(huán)依賴

    Springboot詳細(xì)講解循環(huán)依賴

    最近在使用Springboot做項(xiàng)目的時(shí)候,遇到了一個(gè)循環(huán)依賴的問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于springboot循環(huán)依賴實(shí)現(xiàn)以及分析的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • JAVA實(shí)現(xiàn)空間索引編碼——GeoHash的示例

    JAVA實(shí)現(xiàn)空間索引編碼——GeoHash的示例

    本篇文章主要介紹了JAVA實(shí)現(xiàn)空間索引編碼——GeoHash的示例,如何從眾多的位置信息中查找到離自己最近的位置,有興趣的朋友可以了解一下
    2016-10-10
  • SpringBoot添加Email發(fā)送功能及常見(jiàn)異常詳解

    SpringBoot添加Email發(fā)送功能及常見(jiàn)異常詳解

    本篇文章主要介紹了SpringBoot添加Email發(fā)送功能及常見(jiàn)異常詳解,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-04-04

最新評(píng)論

大英县| 多伦县| 高邑县| 柏乡县| 府谷县| 哈巴河县| 长治市| 万宁市| 奎屯市| 永德县| 鄂伦春自治旗| 文安县| 太仆寺旗| 长岭县| 望江县| 榆社县| 翼城县| 都匀市| 桐柏县| 白城市| 介休市| 贵港市| 衢州市| 额济纳旗| 常宁市| 开封市| 西峡县| 铜川市| 汝南县| 宜春市| 通榆县| 宜宾市| 东山县| 余干县| 和林格尔县| 福建省| 永定县| 托克逊县| 都匀市| 和平区| 四川省|