<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
parent包
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.8</version> </parent>
gateway依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--服務註冊與發現--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.1.0</version> </dependency> <!--遠端服務路由--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>
springcloud版本管理
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
spring:
application:
name: gatewayservice
cloud:
#找對應網段的網路卡 不設定內部服務就走外網
inetutils:
preferred-networks: 192.168.0
nacos:
discovery:
#nacos註冊地址
server-addr: 192.168.0.221:8848
gateway:
routes:
- id: user
#根據服務名轉發 只需要名稱 不用埠
uri: lb://userservice
#ip的形式轉發
# uri: http://127.0.0.1:7540
predicates:
#路由規則
- Path=/user/**
filters:
#1/去掉字首 0/保持原路徑
- StripPrefix=1
#跨域設定
globalcors:
cors-configurations:
'[/**]':
# 允許攜帶認證資訊
allowCredentials: true
# 允許跨域的源(網站域名/ip),設定*為全部
allowedOriginPatterns: "*"
# 允許跨域的method, 預設為GET和OPTIONS,設定*為全部
allowedMethods: "*"
# 允許跨域請求裡的head欄位,設定*為全部
allowedHeaders: "*"#本地靜態路由設定 jar包依賴不一樣
#my-load-balanced-service:
# ribbon:
# listOfServers: http://127.0.0.1:7540,http://127.0.0.1:7541
#輪詢
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
啟動不同埠的user服務,然後通過gateway呼叫
存取地址http://127.0.0.1:7500/user/test
@Value("${server.port}") String port; @GetMapping("/test") public String test() { return new Date().getTime() + ":" + port; }
1657261506117:7540
1657261509785:7541
1657261513874:7540
1657261517464:7541
可以正常路由轉發和負載均衡,預設策略是輪詢
熔斷:就是通過在轉發過程中失敗的,從而採取的降級策略。良好的返回提示給前端。
@Component public class FallbackHandler implements ErrorWebExceptionHandler { @Override public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) { String message = "服務正在維護,請稍後再試!"; byte[] bytes = String.format("{"code":-1,"message":"%s","data":null}", message).getBytes(StandardCharsets.UTF_8); DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes); exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON); return exchange.getResponse().writeWith(Flux.just(buffer)); } }
本來是想通過Hystrix
直接設定重定向的,奈何spring-cloud-starter-netflix-hystrix
已經不更新了,沒法相容。直接採用一刀切算了。
開啟gateway和user服務存取後,然後停掉user。結果如下
{"code":-1,"message":"服務正在維護,請稍後再試!","data":null}
在這裡需要注意的兩個點
No servers available for service: userservice
用的是自帶的令牌桶演演算法,例如總共十個令牌,每秒恢復一個,那麼一秒內最大隻能獲取10個令牌,超過的則直接控制掉返回429 Too Many Requests
pom依賴如下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency>
#引入資料庫
redis:
database: 0
host: 192.168.0.100
port: 6379
//限流策略
gateway:
routes:
- id: user
uri: lb://userservice
predicates:
- Path=/user/**
filters:
#名稱不可修改
- name: RequestRateLimiter
args:
#限流策略名 通過程式碼注入到spring容器中去
key-resolver: "#{@ipKeyResolver}"
#令牌桶每秒填充平均速率
redis‐rate‐limiter.replenishRate: 1
#令牌桶總容量
redis‐rate‐limiter.burstCapacity: 2
# 每次請求獲取的令牌數
redis-rate-limiter.requestedTokens: 1
上述設定含義:針對ip限流,總令牌數2,沒秒恢復一個,每次獲取一個。也就是說一秒內超過2次則會被限流。
注意上述限流設定缺一不可,不然啟動也不會報錯,也不會生效,重點是轉發也不成功了
//針對ip限流 @Primary @Bean(value = "ipKeyResolver") public KeyResolver ipKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); } //針對路徑限流 // @Bean(name = "apiKeyResolver") public KeyResolver apiKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getPath().value()); }
存取http://127.0.0.1:7500/user/test
,一秒記憶體取三次
redis截圖
網頁端截圖
限流生效!
到此這篇關於SpringCloud Gateway詳細分析實現負載均衡與熔斷和限流的文章就介紹到這了,更多相關SpringCloud Gateway負載均衡內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45