成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

Spring cloud 限流的多種方式

瀏覽:10日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲茄子视频| 国产美女在线精品免费观看| 亚洲精品护士| 精品少妇一区二区三区日产乱码 | 亚洲一区在线观看免费观看电影高清 | 欧美伊人久久大香线蕉综合69| 亚洲视频 欧洲视频| 91丨九色丨蝌蚪丨老版| 日韩欧美一区二区视频| 久久69国产一区二区蜜臀| 久久看片网站| 亚洲一卡二卡三卡四卡五卡| 今天的高清视频免费播放成人| 欧美精品一区二区蜜臀亚洲| 国产成人在线视频网站| 日本韩国视频一区二区| 成人欧美一区二区三区在线播放| 99精品欧美一区二区三区小说| 91精品午夜视频| 国产自产v一区二区三区c| 色av一区二区| 视频一区在线播放| 国产精品夜夜夜| 有码一区二区三区| 一区在线视频| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品69久久久久水密桃| 欧美日韩在线一区二区| 视频一区视频二区在线观看| 免费久久久一本精品久久区| 一区二区三区中文字幕| 亚洲高清毛片| 亚洲免费在线视频一区 二区| 欧美影视一区| 国产午夜精品一区二区三区视频 | 国产精品国产三级国产普通话三级 | 一区二区日韩av| 夜夜爽av福利精品导航| 综合久久久久久| 亚洲激情av| 亚洲欧美国产毛片在线| 亚洲看片网站| 亚洲精品成人a在线观看| 日韩视频一区| 一区二区三区资源| 免费精品视频| 日韩电影在线观看电影| 欧美主播一区二区三区美女| 美女网站一区二区| 欧美亚洲免费在线一区| 极品少妇xxxx精品少妇| 欧美喷潮久久久xxxxx| 国产中文字幕精品| 91精品国产欧美一区二区| 国产99久久久久| 欧美精品一区视频| 欧美精品一区二区视频| 亚洲视频电影在线| 国产偷自视频区视频一区二区| 亚洲日本欧美天堂| 先锋影音久久久| 天堂av在线一区| 欧美性大战xxxxx久久久| 久久99精品一区二区三区三区| 欧美高清视频一二三区| 丰满放荡岳乱妇91ww| 国产亚洲一区二区在线观看| 黄色精品免费| 亚洲综合男人的天堂| 91国偷自产一区二区三区成为亚洲经典| 蜜臀91精品一区二区三区| 欧美日本视频在线| 成人免费视频一区| 国产喂奶挤奶一区二区三区| 亚洲国产精品123| 视频一区二区中文字幕| 欧美性欧美巨大黑白大战| 福利电影一区二区三区| 国产三级欧美三级日产三级99| 在线观看成人av| 偷偷要91色婷婷| 91精品国产91久久久久久最新毛片| av资源网一区| 中文字幕在线免费不卡| 91黄色激情网站| 91美女在线观看| 一区二区三区日韩欧美精品| 在线观看中文字幕不卡| 国产精品一区二区三区乱码 | 亚洲蜜臀av乱码久久精品蜜桃| 久久精品一区二区三区中文字幕| 国产一区视频导航| 国产亚洲精久久久久久| 免费亚洲一区二区| 国产成人啪免费观看软件| 国产精品久久久久久久浪潮网站| 久久国产精品高清| 国产精品亚洲人在线观看| 日本一区二区三区dvd视频在线| 国产精品亚洲一区| 国产白丝网站精品污在线入口| 国产精品全国免费观看高清| 麻豆av福利av久久av| 国产精品羞羞答答xxdd| 亚洲人吸女人奶水| 欧美少妇一区二区| 欧美激情综合色综合啪啪| 日本伊人色综合网| 国产午夜精品福利| 欧美日韩一级片在线观看| 欧美1区视频| 性做久久久久久久久| 欧美大度的电影原声| 99综合视频| 国产高清精品久久久久| 亚洲精品国产精华液| 在线不卡中文字幕| 黄色免费成人| 国产精品996| 亚洲国产一区二区a毛片| 日韩欧美一区二区视频| 国产九九精品| 不卡视频一二三四| 三级在线观看一区二区 | 国产一区二区精品| caoporn国产精品| 图片区小说区区亚洲影院| 久久久久88色偷偷免费| 欧洲日韩一区二区三区| 欧美精品首页| 国产精品综合网| 亚洲一区二区不卡免费| 久久综合九色欧美综合狠狠| 欧洲精品中文字幕| 91久久国产自产拍夜夜嗨| 国产成人在线影院| 日本成人中文字幕在线视频| 国产精品福利一区二区三区| 国产欧美高清| 欧美国产一区二区三区激情无套| 麻豆国产欧美日韩综合精品二区| 国产精品白丝在线| 欧美精品一区二区三区在线播放 | 久久国产精品久久精品国产| 欧美日韩精品免费观看视频完整 | 国产欧美一区二区在线| 欧美一区二区性放荡片| 免费一级欧美片在线播放| 国产精品草草| 国产a视频精品免费观看| 日韩成人一级片| 亚洲男人的天堂av| www国产精品av| 欧美亚洲一区二区在线| 亚洲一区二区三区欧美| 国产精品成人观看视频免费| 成人激情综合网站| 美女网站色91| 图片区小说区区亚洲影院| 亚洲欧美日韩国产中文在线| 久久久久国产精品麻豆| 日韩欧美成人激情| 欧美日韩精品三区| 一本一道波多野结衣一区二区| 亚洲国产一区二区三区高清| 欧美三级第一页| 99免费精品视频| 国产成人一区二区精品非洲| 日韩电影在线观看电影| 一区二区三区日韩欧美| 国产精品对白交换视频 | 日韩一区二区三区在线观看| 欧美专区日韩专区| 久久婷婷激情| 亚洲一区3d动漫同人无遮挡| 亚洲黄色一区| 农村妇女精品| 99久久久久免费精品国产 | 美国十次综合导航| 一区二区三区国产| 18欧美乱大交hd1984| 欧美激情中文字幕| 久久九九影视网| 久久综合99re88久久爱| 欧美一区二区高清| 8x8x8国产精品| 欧美日免费三级在线| 久久亚洲一区| 麻豆av一区二区三区久久| 99热这里只有精品8| 欧美日韩精品免费看| 色综合欧美在线视频区| 91蜜桃在线观看| 91免费观看视频在线| 国产福利不卡视频| 狠狠网亚洲精品| 国产在线麻豆精品观看| 国内不卡的二区三区中文字幕| 久99久精品视频免费观看| 九九九精品视频|