电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Spring cloud 限流的多種方式

瀏覽:3日期: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
相關文章:
主站蜘蛛池模板: 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 锥形螺带干燥机(新型耙式干燥机)百科-常州丰能干燥工程 | 高低温万能试验机-复合材料万能试验机-馥勒仪器 | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 电梯装饰-北京万达中意电梯装饰有限公司| 佛山市德信昌电子有限公司| 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 天然气分析仪-液化气二甲醚分析仪|传昊仪器 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 对辊式破碎机-对辊制砂机-双辊-双齿辊破碎机-巩义市裕顺机械制造有限公司 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 烘干设备-热泵烘干机_广东雄贵能源设备有限公司 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 粘度计,数显粘度计,指针旋转粘度计| 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | MVE振动电机_MVE震动电机_MVE卧式振打电机-河南新乡德诚生产厂家 | 超声波_清洗机_超声波清洗机专业生产厂家-深圳市好顺超声设备有限公司 | 电脑刺绣_绣花厂家_绣花章仔_织唛厂家-[源欣刺绣]潮牌刺绣打版定制绣花加工厂家 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 综合管廊模具_生态,阶梯护坡模具_检查井模具制造-致宏模具厂家 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 工业洗衣机_工业洗涤设备_上海力净工业洗衣机厂家-洗涤设备首页 bkzzy在职研究生网 - 在职研究生招生信息咨询平台 | 撕碎机,撕破机,双轴破碎机-大件垃圾破碎机厂家 | 福建成考网-福建成人高考网 | 齿式联轴器-弹性联轴器-联轴器厂家-江苏诺兴传动联轴器制造有限公司 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 钢格板_钢格栅_格栅板_钢格栅板 - 安平县鑫拓钢格栅板厂家 | 电梯乘运质量测试仪_电梯安全评估测试仪-武汉懿之刻 |