SpringGateway網(wǎng)關(guān)
奈非框架簡(jiǎn)介
早期(2020年前)奈非提供的微服務(wù)組件和框架受到了很多開(kāi)發(fā)者的歡迎
這些框架和SpringCloud Alibaba的對(duì)應(yīng)關(guān)系我們要了解
Nacos對(duì)應(yīng)Eureka都是注冊(cè)中心
Dubbo對(duì)應(yīng)Ribbon+feign都是實(shí)現(xiàn)微服務(wù)遠(yuǎn)程調(diào)用的組件
Sentinel對(duì)應(yīng)Hystrix都是項(xiàng)目限流熔斷降級(jí)的組件
Gateway對(duì)應(yīng)Zuul都是網(wǎng)關(guān)項(xiàng)目
Gateway框架不是阿里寫(xiě)的,是Spring提供的
什么是網(wǎng)關(guān)
"網(wǎng)"指網(wǎng)絡(luò),"關(guān)"指關(guān)口或關(guān)卡
網(wǎng)關(guān):就是指網(wǎng)絡(luò)中的關(guān)口\關(guān)卡
網(wǎng)關(guān)就是當(dāng)前微服務(wù)項(xiàng)目的"統(tǒng)一入口"
程序中的網(wǎng)關(guān)就是當(dāng)前微服務(wù)項(xiàng)目對(duì)外界開(kāi)放的統(tǒng)一入口
因?yàn)樘峁┝私y(tǒng)一入口之后,方便對(duì)所有請(qǐng)求進(jìn)行統(tǒng)一的檢查和管理

網(wǎng)關(guān)的主要功能有
將所有請(qǐng)求統(tǒng)一由經(jīng)過(guò)網(wǎng)關(guān)
網(wǎng)關(guān)可以對(duì)這些請(qǐng)求進(jìn)行檢查
網(wǎng)關(guān)方便記錄所有請(qǐng)求的日志
網(wǎng)關(guān)可以統(tǒng)一將所有請(qǐng)求路由到正確的模塊\服務(wù)上
路由的近義詞就是"分配"
Spring Gateway簡(jiǎn)介
我們使用Spring Gateway作為當(dāng)前項(xiàng)目的網(wǎng)關(guān)框架
Spring Gateway是Spring自己編寫(xiě)的,也是SpringCloud中的組件
SpringGateway官網(wǎng)
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
簡(jiǎn)單網(wǎng)關(guān)演示
SpringGateway網(wǎng)關(guān)是一個(gè)依賴(lài),不是一個(gè)軟件
所以我們要使用它的話,必須先創(chuàng)建一個(gè)SpringBoot項(xiàng)目
這個(gè)項(xiàng)目也要注冊(cè)到Nacos注冊(cè)中心,因?yàn)榫W(wǎng)關(guān)項(xiàng)目也是微服務(wù)項(xiàng)目的一個(gè)組成部分
beijing和shanghai是編寫(xiě)好的兩個(gè)項(xiàng)目
gateway項(xiàng)目就是網(wǎng)關(guān)項(xiàng)目,需要添加相關(guān)配置
我們從yml文件配置開(kāi)始添加
我們使用
http://localhost:9000/bj/show可以訪問(wèn)beijing服務(wù)器的資源
http://localhost:9000/sh/show可以訪問(wèn)shanghai服務(wù)器的資源
以此類(lèi)推,再有很多服務(wù)器時(shí),我們都可以?xún)H使用9000端口號(hào)來(lái)將請(qǐng)求路由到正確的服務(wù)器
就實(shí)現(xiàn)了gateway成為項(xiàng)目的統(tǒng)一入口的效果
動(dòng)態(tài)路由
網(wǎng)關(guān)項(xiàng)目隨著微服務(wù)數(shù)量的增多
gateway項(xiàng)目的yml文件配置會(huì)越來(lái)越多,維護(hù)的工作量也會(huì)越來(lái)越大
所以我們希望gateway能夠設(shè)計(jì)一套默認(rèn)情況下自動(dòng)路由到每個(gè)模塊的路由規(guī)則
這樣的話,不管當(dāng)前項(xiàng)目有多少個(gè)路由目標(biāo),都不需要維護(hù)yml文件了
這就是我們SpringGateway的動(dòng)態(tài)路由功能
配置文件中開(kāi)啟即可
內(nèi)置斷言
斷言的意思就是判斷某個(gè)條件是否滿足
我們之前使用了Path斷言,判斷請(qǐng)求的路徑是不是滿足條件,例如是不是/sh/**?/bj/**
如果路徑滿足這個(gè)條件,就路由到指定的服務(wù)器
但是Path實(shí)際上只是SpringGateway提供的多種內(nèi)置斷言中的一種
還有很多其它斷言
after
before
between
cookie
header
host
method
path
query
remoteaddr
時(shí)間相關(guān)
after,before,between
判斷當(dāng)前時(shí)間在指定時(shí)間之前,之后或之間的操作
如果條件滿足可以執(zhí)行路由操作,否則拒絕訪問(wèn)
我們先利用下面代碼
獲得當(dāng)前時(shí)間,這個(gè)時(shí)間的格式可能是
下面在yml配置中添加新的斷言配置,使用After設(shè)置必須在指定時(shí)間之后訪問(wèn)
必須在指定時(shí)間之后才能訪問(wèn)服務(wù)
否則發(fā)生404錯(cuò)誤拒絕訪問(wèn)
需要注意測(cè)試時(shí),先啟動(dòng)Nacos,再啟動(dòng)shanghai之后啟動(dòng)gateway
測(cè)試時(shí)必須通過(guò)9000端口訪問(wèn)才能有效果
使用Before設(shè)置必須在指定時(shí)間之前訪問(wèn)
使用Between設(shè)置必須在指定時(shí)間之間訪問(wèn)
要求指定請(qǐng)求參數(shù)
Query斷言,判斷是否包含指定的參數(shù)名稱(chēng),包含指定參數(shù)名稱(chēng)才能通過(guò)路由
內(nèi)置過(guò)濾器
Gateway還提供的內(nèi)置過(guò)濾器
不要和我們學(xué)習(xí)的filter混淆
內(nèi)置過(guò)濾器允許我們?cè)诼酚烧?qǐng)求到目標(biāo)資源的同時(shí),對(duì)這個(gè)請(qǐng)求進(jìn)行一些加工或處理
常見(jiàn)過(guò)濾器也有一些
我們給大家演示一下AddRequestParameter過(guò)濾器
它的作用是在請(qǐng)求中添加參數(shù)
進(jìn)行測(cè)試 http://localhost:9000/sh/show?name=tom
因?yàn)檫^(guò)濾器的存在,控制器可以獲取網(wǎng)關(guān)過(guò)濾器添加的參數(shù)值
其他內(nèi)置過(guò)濾器和自定義過(guò)濾器的使用,可以查閱相關(guān)文檔自己了解;
創(chuàng)建gateway網(wǎng)關(guān)子項(xiàng)目
父子相認(rèn)
修改子項(xiàng)目pom文件和依賴(lài)
application.yml文件配置如下
網(wǎng)關(guān)項(xiàng)目的knife4j配置
我們希望配置網(wǎng)關(guān)之后,在使用knife4j測(cè)試時(shí)
就不來(lái)回切換端口號(hào)了
我們需要配置Knife4j才能實(shí)現(xiàn)
在gateway項(xiàng)目中創(chuàng)建config包
SwaggerProvider
SwaggerController類(lèi)
SwaggerHeaderFilter類(lèi)
啟動(dòng)Nacos\Seata\Sentinel
啟動(dòng)cart\stock\order\business
最后啟動(dòng)gateway
可以通過(guò)10000端口測(cè)試各個(gè)業(yè)務(wù)模塊的功能
http://localhost:10000/nacos-stock/doc.html
http://localhost:10000/nacos-cart/doc.html
http://localhost:10000/nacos-order/doc.html
http://localhost:10000/nacos-business/doc.html
如果不使用網(wǎng)關(guān)一切正常,但是啟動(dòng)網(wǎng)關(guān)訪問(wèn)失敗的話,就是gateway項(xiàng)目配置問(wèn)題
Gateway和SpringMvc依賴(lài)沖突問(wèn)題和解決
之前網(wǎng)關(guān)的演示項(xiàng)目我們添加的網(wǎng)關(guān)依賴(lài)
當(dāng)前項(xiàng)目需要配置knife4j的路由配置,需要編寫(xiě)一個(gè)控制器
所以我們添加了SpringMvc的依賴(lài)
這兩個(gè)依賴(lài)在同一個(gè)項(xiàng)目中時(shí),默認(rèn)情況下啟動(dòng)會(huì)報(bào)錯(cuò)
SpringMvc框架中自帶一個(gè)Tomcat服務(wù)器
而SpringGateway框架中自帶一個(gè)Netty的服務(wù)器
在啟動(dòng)項(xiàng)目時(shí),兩個(gè)框架中包含的服務(wù)器都想占用相同端口,因?yàn)闋?zhēng)奪端口號(hào)和主動(dòng)權(quán)而發(fā)生沖突
導(dǎo)致啟動(dòng)服務(wù)時(shí)報(bào)錯(cuò)
要想能夠正常啟動(dòng)必須在yml文件配置
reactive:反應(yīng)的
添加這個(gè)配置之后,會(huì)啟動(dòng)netty服務(wù)器