springcloudAlibaba API網(wǎng)關(guān)SpringcloudGateway學(xué)習(xí)筆記
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
66套java從入門(mén)到精通實(shí)戰(zhàn)課程分享
一、概述

服務(wù)發(fā)現(xiàn),讓內(nèi)容中心總能找到與用戶(hù)中心
內(nèi)容中心整合ribbon,實(shí)現(xiàn)負(fù)載均衡
使用feign,讓HTTP的遠(yuǎn)程調(diào)用更加優(yōu)雅
使用sentinel,提升應(yīng)用的可用性以及容錯(cuò)性
使用spring消息編程模型、stream消息編程模型,實(shí)現(xiàn)了基于rocketMQ的通信
下圖為小程序直接調(diào)用微服務(wù):
認(rèn)證復(fù)雜,登錄需要驗(yàn)證,若使用此模式,則需要在內(nèi)容中心、用戶(hù)中心上做登錄認(rèn)證
導(dǎo)致客戶(hù)端難以重構(gòu),隨著項(xiàng)目迭代,可能需要重新劃分微服務(wù),若微服務(wù)域名什么都變了,則客戶(hù)端就要做大量的改動(dòng)
其他微服務(wù)使用了某種瀏覽器不友好協(xié)議,直接訪(fǎng)問(wèn)訪(fǎng)問(wèn)不了
使用服務(wù)(API)網(wǎng)關(guān):
可以在API網(wǎng)關(guān)做統(tǒng)一認(rèn)證,再將請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)到后端微服務(wù)
采用這樣的方式,對(duì)外暴露的永遠(yuǎn)是一個(gè)域名,不論內(nèi)部微服務(wù)如何拆分,域名都不會(huì)變,這樣客戶(hù)端重構(gòu)成本大大降低
其他微服務(wù)為瀏覽器不友好協(xié)議,可以在網(wǎng)關(guān)上邊轉(zhuǎn)換為有好的協(xié)議,如HTTP、websocket
二、spring cloud gateway
是spring cloud的網(wǎng)關(guān)(第二代),未來(lái)取代Zuul(第一代)
基于Netty、Reactor以及WebFlux構(gòu)建
① Netty:網(wǎng)絡(luò)通信框架,可以實(shí)現(xiàn)高性能的服務(wù)端以及客戶(hù)端
② Reactor:是一個(gè)Reactive模型的編程實(shí)現(xiàn)優(yōu)點(diǎn):
① 性能強(qiáng)勁,是zuul的1.6倍?性能PK
② 功能強(qiáng)大,內(nèi)置了很多實(shí)用功能,比如轉(zhuǎn)發(fā)、監(jiān)控、限流等
③ 設(shè)計(jì)優(yōu)雅,易擴(kuò)展缺點(diǎn):
① 依賴(lài)Netty與Webflux,不是Servlet編程模型,有一定的學(xué)習(xí)成本
② 不能在Servlet容器中工作,無(wú)法構(gòu)建war包(只能打成jar包),部署到tomcat
③ 不支持spring boog 1.x
三、網(wǎng)關(guān)搭建
新建spring boot項(xiàng)目
加依賴(lài)
?
????org.springframework.cloud
????spring-cloud-starter-gateway
加注解:無(wú)
寫(xiě)配置:
server:
??port:?8040
#?應(yīng)用程序名稱(chēng)
spring:
??application:
????name:?gateway
??cloud:
????#?服務(wù)發(fā)現(xiàn)
????nacos:
??????discovery:
????????server-addr:?localhost:8848
????gateway:
??????discovery:
????????locator:
??????????#?讓gateway通過(guò)服務(wù)發(fā)現(xiàn)找到其他的微服務(wù)
??????????enabled:?true
#?actuator
management:
??#?展示詳細(xì)信息
??endpoint:
????health:
??????show-details:?always
??#?暴露所有端點(diǎn)
??endpoints:
????web:
??????exposure:
????????include:?'*'
以上,已通過(guò)spring cloud gateway實(shí)現(xiàn)了對(duì)微服務(wù)的反向代理,并且還能總結(jié)轉(zhuǎn)發(fā)規(guī)律
四、核心概念
route(路由):spring cloud gateway 基礎(chǔ)元素,可簡(jiǎn)單理解成一條轉(zhuǎn)發(fā)規(guī)則。包含如下
id
目標(biāo)url
predicate(謂詞):即java.util.function.predicate,spring cloud gateway使用predicate實(shí)現(xiàn)路由的匹配條件
filter(過(guò)濾器):修改請(qǐng)求即響應(yīng)
配置示例:
1、架構(gòu)

gateway client:不是嚴(yán)格意義上的客戶(hù)端,泛指外部請(qǐng)求
proxied service:被代理的微服務(wù)
gateway mapping:會(huì)判斷請(qǐng)求的路徑是否匹配路由的配置
gateway Handler:如果mapping匹配成功,Handler會(huì)讀取這個(gè)路由上的所有過(guò)濾器,然后把請(qǐng)求交給過(guò)濾器處理
2、內(nèi)置路由謂詞工廠詳解
(route predicate factories)使用手記

3、自定義路由謂詞工廠

寫(xiě)配置

代碼示例
@Component
public?class?TimeBetweenRoutePredicateFactory?extends?AbstractRoutePredicateFactory?{
????public?TimeBetweenRoutePredicateFactory()?{
????????super(TimeBetweenConfig.class);
????}
????@Override
????public?Predicate?apply(TimeBetweenConfig?config)?{
????????LocalTime?start?=?config.getStart();
????????LocalTime?end?=?config.getEnd();
????????return?serverWebExchange?->?{
????????????LocalTime?now?=?LocalTime.now();
????????????return?now.isAfter(start)?&&?now.isBefore(end);
????????};
????}
????@Override
????public?List?shortcutFieldOrder()?{
????????return?Arrays.asList("start","end");
????}
}
@Data
class?TimeBetweenConfig?{
????private?LocalTime?start;
????private?LocalTime?end;
}
配置不生效問(wèn)題解決:對(duì) url:lb://user-center 使用理解錯(cuò)誤
錯(cuò)誤理解是帶user-center都會(huì)匹配此規(guī)則
正確理解是http://localhost:8040將會(huì)被轉(zhuǎn)發(fā)到http://user-center 通過(guò)nacos自動(dòng)獲取地址
4、內(nèi)置過(guò)濾器工廠
Spring Cloud Gateway-過(guò)濾器工廠詳解(GatewayFilter Factories)
5、自定義過(guò)濾器工廠
寫(xiě)配置

代碼示例
@Slf4j
@Component
public?class?PreLogGatewayFilterFactory?extends?AbstractNameValueGatewayFilterFactory?{
????public?PreLogGatewayFilterFactory()?{
????}
????public?GatewayFilter?apply(NameValueConfig?config)?{
????????GatewayFilter?filter?=?(((exchange,?chain)?->?{
????????????log.info("請(qǐng)求進(jìn)來(lái)了...{}={}",config.getName(),config.getValue());
????????????ServerHttpRequest?modifiedRequest?=?exchange.getRequest().mutate().build();
????????????ServerWebExchange?modifiedExchange?=?exchange.mutate().request(modifiedRequest).build();
????????????return?chain.filter(modifiedExchange);
????????}));
????????return?new?OrderedGatewayFilter(filter,1000);
????}
}
6、全局過(guò)濾器
Spring Cloud Gateway-全局過(guò)濾器(Global Filters)
過(guò)濾器順序
order越小越靠前執(zhí)行
局部過(guò)濾器的order,會(huì)按照配置順序,按1開(kāi)始遞增
若配置了默認(rèn)過(guò)濾器,會(huì)按照配置順序,按1開(kāi)始遞增,默認(rèn)過(guò)濾器會(huì)比局部過(guò)濾器優(yōu)先
如需自行控制order,可返回OrderedGatewayFilter
五、整合容錯(cuò)服務(wù)
1、gateway默認(rèn)整合Hystrix,配置如下

六、監(jiān)控
Spring Cloud Gateway監(jiān)控
排錯(cuò)、調(diào)試技巧總結(jié)
七、限流
Spring Cloud Gateway限流詳解
Unable to find GatewayFilterFactory with name RequestRateLimiter報(bào)錯(cuò):
要添加redis依賴(lài)
添加了還報(bào)錯(cuò),仔細(xì)檢查,是否寫(xiě)錯(cuò)位置,寫(xiě)到節(jié)點(diǎn)下
八、總結(jié)

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/lzf2284466/article/details/109895210
粉絲福利:實(shí)戰(zhàn)springboot+CAS單點(diǎn)登錄系統(tǒng)視頻教程免費(fèi)領(lǐng)取
???
?長(zhǎng)按上方微信二維碼?2 秒 即可獲取資料
感謝點(diǎn)贊支持下哈?
