日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring cloud 限流的多種方式

瀏覽:23日期:2023-07-12 10:55:25
目錄一、實戰基于 Spring cloud Gateway 的限流二、基于阿里開源限流神器:Sentinel

在頻繁的網絡請求時,服務有時候也會受到很大的壓力,尤其是那種網絡攻擊,非法的。這樣的情形有時候需要作一些限制。例如:限制對方的請求,這種限制可以有幾個依據:請求IP、用戶唯一標識、請求的接口地址等等。

當前限流的方式也很多:Spring cloud 中在網關本身自帶限流的一些功能,基于 redis 來做的。同時,阿里也開源了一款:限流神器 Sentinel。今天我們主要圍繞這兩塊來實戰微服務的限流機制。

首先講 Spring cloud 原生的限流功能,因為限流可以是對每個服務進行限流,也可以對于網關統一作限流處理。

一、實戰基于 Spring cloud Gateway 的限流

pom.xml引入依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency>

其基礎是基于redis,所以:

spring: application: name: gateway-service redis: #redis相關配置 database: 8 host: 10.12.15.5 port: 6379 password: 123456 #有密碼時設置 jedis: pool:max-active: 8max-idle: 8min-idle: 0 timeout: 10000ms

接下來需要注入限流策略的 bean:

@Primary @Bean(value = 'ipKeyResolver') KeyResolver ipKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); //return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); //return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); } @Bean(value = 'apiKeyResolver') KeyResolver apiKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getPath().value()); } @Bean(value = 'userKeyResolver') KeyResolver userKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst('userId')); }

這里引入ipKeyResolver、apiKeyResolver、userKeyResolver三種策略,可以利用注解 @Primary 來決定其中一個被使用。

注入bean后,需要在配置中備用:

spring: application: name: gateway-service redis: #redis相關配置 database: 8 host: 10.12.15.5 port: 6379 password: 123456 #有密碼時設置 jedis: pool:max-active: 8max-idle: 8min-idle: 0 timeout: 10000ms

后面是限流的主要配置:

spring cloud: gateway: routes: #路由配置:參數為一個List - id: cas-server #唯一標識uri: lb://cas-server-service #轉發的地址,寫服務名稱order: -1predicates:- Path=/cas-server/** #判斷匹配條件,即地址帶有/ribbon/**的請求,會轉發至lb:cas-server-servicefilters:- StripPrefix=1 #去掉Path前綴,參數為1代表去掉/ribbon- name: RequestRateLimiter #基于redis的Gateway的自身限流 args: redis-rate-limiter.replenishRate: 1 # 允許用戶每秒處理多少個請求 redis-rate-limiter.burstCapacity: 3 # 令牌桶的容量,允許在一秒鐘內完成的最大請求數 key-resolver: '#{@ipKeyResolver}' #SPEL表達式取的對應的bean - id: admin-weburi: lb://admin-web-serviceorder: -1predicates:- Path=/admin-web/**filters:- StripPrefix=1- name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 1 # 允許用戶每秒處理多少個請求 redis-rate-limiter.burstCapacity: 3 # 令牌桶的容量,允許在一秒鐘內完成的最大請求數 key-resolver: '#{@ipKeyResolver}' #SPEL表達式取的對應的bean

這里是在原有的路由基礎上加入 RequestRateLimiter限流過濾器,包括三個參數:

- name: RequestRateLimiter #基于redis的Gateway的自身限流 args: redis-rate-limiter.replenishRate: 3 #允許用戶每秒處理多少個請求 redis-rate-limiter.burstCapacity: 5 #令牌桶的容量,允許在一秒鐘內完成的最大請求數 key-resolver: '#{@ipKeyResolver}' #SPEL表達式取的對應的bean 其中 replenishRate,其含義表示允許每秒處理請求數; burstCapacity 表示允許在一秒內處理的最大請求數; key-resolver 這里采用請求 IP 限流,利用SPEL 表達式取對應的 bean

寫一個小腳本來壓測一下:

for i in $(seq 1 30000); do echo $(expr $i * 3 + 1);curl -i -H 'Accept: application/json' -H 'Authorization:bearer b064d95b-af3f-4053-a980-377c63ab3413' -X GET http://10.10.15.5:5556/order-service/api/order/getUserInfo;donefor i in $(seq 1 30000); do echo $(expr $i * 3 + 1);curl -i -H 'Accept: application/json' -H 'Authorization:bearer b064d95b-af3f-4053-a980-377c63ab3413' -X GET http://10.10.15.5:5556/admin-web/api/user/getCurrentUser;done

上面兩個腳本分別對2個服務進行壓測,打印結果:

{'message':{'status':200,'code':0,'message':'success'},'data':'{'message':{'status':200,'code':0,'message':'get user success'},'data':{'id':23,'isAdmin':1,'userId':'fbb18810-e980-428c-932f-848f3b9e7c84','userType':'super_admin','username':'admin','realName':'super_admin','password':'$2a$10$89AqlYKlnsTpNmWcCMvgluRFQ/6MLK1k/nkBpz.Lw6Exh.WMQFH6W','phone':null,'email':null,'createBy':'admin','createTime':1573119753172,'updateBy':'admin','updateTime':1573119753172,'loginTime':null,'expireTime':null,'remarks':'super_admin','delFlag':0,'loginType':null}}'}ex

在用測試工具Jmeter在同一秒內多次請求后:

HTTP/1.1 429 Too Many RequestsX-RateLimit-Remaining: 0X-RateLimit-Burst-Capacity: 3X-RateLimit-Replenish-Rate: 1content-length: 0expr: syntax errorHTTP/1.1 429 Too Many RequestsX-RateLimit-Remaining: 0X-RateLimit-Burst-Capacity: 3X-RateLimit-Replenish-Rate: 1content-length: 0expr: syntax error

從上面可以看到,執行后,會出現調用失敗的情況,狀態變為429 (Too Many Requests) 。

二、基于阿里開源限流神器:Sentinel

首先引入依賴:

<!--基于 阿里的sentinel作限流 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>

在配置文件 application.yaml 文件中配置,需要新增2個配置:

spring: application: name: admin-web cloud: kubernetes: discovery:all-namespaces: true sentinel: eager: true #取消Sentinel控制臺的懶加載 transport:dashboard: 10.12.15.2:8080 #sentinel的Dashboard地址port: 8719 #是sentinel應用端和控制臺通信端口heartbeat-interval-ms: 500 #心跳時間 scg:fallback: #scg.fallback為sentinel限流后的響應配置 mode: response response-status: 455 response-body: 已被限流

其中,這里面配置了一個服務:spring.cloud.sentinel.transport.dashboard,配置的是 sentinel 的 Dashboard 地址。同時 spring.cloud.sentinel.transport.port 這個端口配置會在應用對應的機器上啟動一個Http Server,該 Server 會與 Sentinel 控制臺做交互。

Sentinel 默認為所有的 HTTP 服務提供限流埋點,上面配置完成后自動完成所有埋點,只需要控制配置限流規則即可。這里我們講下通過注解來給指定接口函數加上限流埋點,寫一個RestController,在接口函數上加上注解

@SentinelResource:@GetMapping(value = '/getToken')@SentinelResource('getToken')public Response<Object> getToken(Authentication authentication){ //Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); authentication.getCredentials(); OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails)authentication.getDetails(); String token = details.getTokenValue(); return Response.ok(200, 0, 'get token success', token);}

以上代碼部分完成了,接下來先安裝SentinelDashBoard,Sentinel DashBoard下載地址:github.com/alibaba/Sentinel/releases。

下載完成后,命令啟動:

java -jar sentinel-dashboard-1.6.2.jar

默認啟動端口為8080,訪問 IP:8080,就可以顯示 Sentinel 的登錄界面,用戶名與密碼均為sentinel。登錄 Dashboard 成功后,多次訪問接口'/getToken',可以在 Dashboard 看到相應數據,這里不展示了。接下來可以設置接口的限流功能,在 “+流控” 按鈕點擊打開設置界面,設置閾值類型為 qps,單機閾值為5。

瀏覽器重復請求 http://10.10.15.5:5556/admin-web/api/user/getToken 如果超過閥值就會出現如下界面信息:Blocked by Sentinel (flow limiting)

此時,就看到Sentinel 限流起作用了,可以加上 spring.cloud.sentinel.scg.fallback 為sentinel 限流后的響應配置,亦可自定義限流異常信息:

@GetMapping(value = '/getToken')@SentinelResource(value = 'getToken', blockHandler = 'handleSentinelException', blockHandlerClass = {MySentinelException.class}))public Response<Object> getToken(Authentication authentication){ //Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); authentication.getCredentials(); OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails)authentication.getDetails(); String token = details.getTokenValue(); return Response.ok(200, 0, 'get token success', token);}public class MySentinelException { public static Response<Object> handleSentinelException(BlockException e) {Map<String,Object> map=new HashMap<>();logger.info('Oops: ' + ex.getClass().getCanonicalName());return Response.ok(200, -8, '通過注解 @SentinelResource 配置限流埋點并自定義限流后的處理邏輯', null); }}

這里講下注解 @SentinelResource 包含以下屬性:

value:資源名稱,必需項; entryType:入口類型,可選項(默認為 EntryType.OUT); blockHandler:blockHandlerClass中對應的異常處理方法名,參數類型和返回值必須和原方法一致; blockHandlerClass:自定義限流邏輯處理類

Sentinel 限流邏輯處理完畢了,但每次服務重啟后,之前配置的限流規則就會被清空。因為是內存形式的規則對象。所以下面就講下用 Sentinel 的一個特性 ReadableDataSource 獲取文件、數據庫或者配置中心設置限流規則,目前支持 Apollo、Nacos、ZK 配置來管理。

首先回憶一下,一條限流規則主要由下面幾個因素組成:

resource:資源名,即限流規則的作用對象,即為注解 @SentinelResource 的value; count:限流閾值;grade:限流閾值類型(QPS 或并發線程數); limitApp:流控針對的調用來源,若為 default 則不區分調用來源; strategy:基于調用關系的限流策略; controlBehavior:流量控制效果(直接拒絕、排隊等待、勻速器模式)

理解了意思,接下來通過文件來配置:

#通過文件讀取限流規則spring.cloud.sentinel.datasource.ds1.file.file=classpath:flowrule.jsonspring.cloud.sentinel.datasource.ds1.file.data-type=jsonspring.cloud.sentinel.datasource.ds1.file.rule-type=flow

在resources新建一個文件,比如 flowrule.json 添加限流規則:

[ { 'resource': 'getToken', 'count': 1, 'controlBehavior': 0, 'grade': 1, 'limitApp': 'default', 'strategy': 0 }, { 'resource': 'resource', 'count': 1, 'controlBehavior': 0, 'grade': 1, 'limitApp': 'default', 'strategy': 0 }]

重新啟動項目,出現如下日志說明成功:

DataSource ds1-sentinel-file-datasource start to loadConfigDataSource ds1-sentinel-file-datasource load 2 FlowRule

如果采用 Nacos 作為配置獲取限流規則,可在文件中加如下配置:

spring: application: name: order-service cloud: nacos: config:server-addr: 10.10.15.5:8848 discovery:server-addr: 10.10.15.5:8848 sentinel: eager: true transport:dashboard: 10.10.15.5:8080 datasource:ds1: nacos: server-addr: 10.10.15.5:8848 dataId: ${spring.application.name}-flow-rules data-type: json rule-type: flow

到此這篇關于Spring cloud 限流的多種方式的文章就介紹到這了,更多相關Spring cloud 限流內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
97人人精品| 亚洲电影在线一区二区三区| 国产v日韩v欧美v| 日韩免费精品| 在线看片福利| 丝袜脚交一区二区| 婷婷综合六月| 国产一区二区三区免费在线| 国产三级一区| 久久精品99久久无色码中文字幕| 美女av一区| 日本精品久久| 日韩和欧美的一区| 亚洲3区在线| 六月丁香综合| 亚洲色诱最新| 在线亚洲精品| 亚洲一区二区毛片| 性欧美videohd高精| 久久不卡国产精品一区二区| 97久久中文字幕| 亚洲18在线| 三级亚洲高清视频| 蜜桃视频第一区免费观看| 日韩视频二区| 99在线精品免费视频九九视| 欧美日韩在线播放视频| 99久久精品国产亚洲精品| 欧美精品资源| 久久婷婷丁香| 亚洲黑丝一区二区| 日本欧美国产| 亚洲一区资源| 日韩欧美另类一区二区| 国产综合精品一区| 群体交乱之放荡娇妻一区二区| 福利一区视频| 日韩欧美视频专区| 一本大道色婷婷在线| 国产成人77亚洲精品www| 国产一区2区在线观看| 精品国产亚洲日本| 香蕉成人av| 一级欧洲+日本+国产| 久久福利一区| 日韩欧美三区| 久久精品999| 国内一区二区三区| 久久影视一区| 欧美日韩激情在线一区二区三区| 一区视频在线| 日韩激情综合| 日本aⅴ精品一区二区三区 | 玖玖精品视频| 亚洲在线观看| 一区二区日韩免费看| 欧美日本不卡高清| 成人午夜毛片| 日韩精品免费一区二区在线观看| 1024精品久久久久久久久| 美女国产精品| 欧美亚洲国产日韩| 精品国产一区二区三区2021| 精品一区三区| 国产一区二区久久久久| 亚洲理论在线| 久久国产精品成人免费观看的软件| 青青草国产精品亚洲专区无| 久久久久亚洲| 国产精品红桃| 免费看精品久久片| 快播电影网址老女人久久| 欧美午夜三级| 石原莉奈一区二区三区在线观看| 不卡一二三区| 欧美激情综合| 日韩中文av| 亚洲女同中文字幕| 国产在线日韩精品| 日韩av中文字幕一区二区| 国产亚洲高清视频| 91精品国产乱码久久久久久久| 免费日韩成人| 欧美视频久久| 亚洲三级av| 夜夜嗨一区二区三区| 999国产精品视频| 精品国产午夜肉伦伦影院| 日本一区免费网站| 一区在线免费观看| 日韩精品诱惑一区?区三区| 国产日本亚洲| 在线精品一区| 91精品一区国产高清在线gif| 鲁大师精品99久久久| 日韩三级精品| 久久亚洲国产精品一区二区| 欧美成人基地| 免费看av不卡| 国内精品伊人| 国产高清亚洲| 国产精品主播| 日韩1区2区3区| 日韩一区二区三免费高清在线观看| 亚洲欧美日韩精品一区二区| 日韩网站在线| 鲁大师成人一区二区三区 | 日本精品影院| 国产一区国产二区国产三区| 国产精品免费99久久久| 欧美一区91| 久久激情综合网| 91成人在线| 日本欧美大码aⅴ在线播放| 午夜久久av| 欧美日韩亚洲国产精品| 日韩高清成人在线| 欧美精品影院| 欧美在线看片| 国产日韩精品视频一区二区三区| 日本免费新一区视频| 亚洲免费福利一区| 婷婷精品在线| 国产情侣久久| 精品久久在线| 免费一二一二在线视频| 高潮一区二区| 久久香蕉国产| 亚洲激情社区| 亚洲涩涩av| 欧美永久精品| 欧美国产另类| 麻豆mv在线观看| 久久精品青草| 狠狠干综合网| 蜜臀久久99精品久久久久久9 | 亚洲a一区二区三区| 在线一区av| 久久久久久久久久久妇女 | 女人天堂亚洲aⅴ在线观看| 亚洲第一精品影视| 国产高清久久| 综合色一区二区| 国产精品一卡| 日韩一区三区| 丝袜国产日韩另类美女| 日韩美女国产精品| 久久中文欧美| av免费不卡国产观看| 在线成人直播| 日韩精品免费一区二区夜夜嗨| 久久精品欧洲| 久久中文视频| 亚洲精品在线国产| 久久久国产精品入口麻豆| 欧美成人a交片免费看| 黄色成人91| 国产调教一区二区三区| 伊人网在线播放| 性色一区二区| 国产日韩欧美| 91看片一区| 亚洲日产国产精品| 国产精品成人3p一区二区三区| 电影亚洲精品噜噜在线观看| 久久av一区| 精品国产网站| 黑丝一区二区| 国产欧美日本| 日韩欧美三级| 亚洲毛片一区| 日韩在线中文| 日韩一区二区三区免费视频| 日韩1区在线| 视频一区二区欧美| 精品视频免费| 中文字幕日本一区二区| 精品国产亚洲日本| 欧美日韩激情| 国产日韩欧美中文在线| 日韩在线观看不卡| 日本午夜精品视频在线观看| 日韩精品免费一区二区三区| 日韩高清一区在线| 亚洲小说欧美另类婷婷| 国产精品亚洲人成在99www| av亚洲一区二区三区| 日韩高清欧美激情| 欧美影院三区| 麻豆一区在线| 免费看欧美美女黄的网站| 福利精品在线| 亚洲资源网站| 四虎国产精品免费观看| 男女激情视频一区| 久久电影tv| 91精品美女| 亚洲免费在线| 欧美sss在线视频| 国产欧美自拍|