Spring Cloud Gateway 服務(wù)網(wǎng)關(guān)快速實(shí)現(xiàn)解析
Spring Cloud Gateway 服務(wù)網(wǎng)關(guān)
API 主流網(wǎng)關(guān)有NGINX、ZUUL、Spring Cloud Gateway、Linkerd等;Spring Cloud Gateway構(gòu)建于 Spring 5+,基于 Spring Boot 2.x 響應(yīng)式的、非阻塞式的 API。同時(shí),它支持 websockets,和 Spring 框架緊密集成,用來代替服務(wù)網(wǎng)關(guān)Zuul,開發(fā)體驗(yàn)相對來說十分不錯(cuò)。
Spring Cloud Gateway 是 Spring Cloud 微服務(wù)平臺(tái)的一個(gè)子項(xiàng)目,屬于 Spring 開源社區(qū),依賴名叫:spring-cloud-starter-gateway。
Zuul 是 Netflix 公司的開源項(xiàng)目,Spring Cloud 在 Netflix 項(xiàng)目中也已經(jīng)集成了 Zuul,依賴名叫:spring-cloud-starter-netflix-zuul。
API 網(wǎng)關(guān)
API 網(wǎng)關(guān)出現(xiàn)的原因是微服務(wù)架構(gòu)的出現(xiàn),不同的微服務(wù)一般會(huì)有不同的網(wǎng)絡(luò)地址,而外部客戶端可能需要調(diào)用多個(gè)服務(wù)的接口才能完成一個(gè)業(yè)務(wù)需求,如果讓客戶端直接與各個(gè)微服務(wù)通信,會(huì)有以下的問題:
- 客戶端會(huì)多次請求不同的微服務(wù),增加了客戶端的復(fù)雜性。
- 存在跨域請求,在一定場景下處理相對復(fù)雜。
- 認(rèn)證復(fù)雜,每個(gè)服務(wù)都需要獨(dú)立認(rèn)證。
- 難以重構(gòu),隨著項(xiàng)目的迭代,可能需要重新劃分微服務(wù)。例如,可能將多個(gè)服務(wù)合并成一個(gè)或者將一個(gè)服務(wù)拆分成多個(gè)。如果客戶端直接與微服務(wù)通信,那么重構(gòu)將會(huì)很難實(shí)施。
- 某些微服務(wù)可能使用了防火墻 / 瀏覽器不友好的協(xié)議,直接訪問會(huì)有一定的困難。
以上這些問題可以借助 API 網(wǎng)關(guān)解決。API 網(wǎng)關(guān)是介于客戶端和服務(wù)器端之間的中間層,所有的外部請求都會(huì)先經(jīng)過 API 網(wǎng)關(guān)這一層。也就是說,API 的實(shí)現(xiàn)方面更多的考慮業(yè)務(wù)邏輯,而安全、性能、監(jiān)控可以交由 API 網(wǎng)關(guān)來做,這樣既提高業(yè)務(wù)靈活性又不缺安全性。
使用 API 網(wǎng)關(guān)后的優(yōu)點(diǎn)如下:
- 易于監(jiān)控??梢栽诰W(wǎng)關(guān)收集監(jiān)控?cái)?shù)據(jù)并將其推送到外部系統(tǒng)進(jìn)行分析。
- 易于認(rèn)證。可以在網(wǎng)關(guān)上進(jìn)行認(rèn)證,然后再將請求轉(zhuǎn)發(fā)到后端的微服務(wù),而無須在每個(gè)微服務(wù)中進(jìn)行認(rèn)證。
- 減少了客戶端與各個(gè)微服務(wù)之間的交互次數(shù)。
Spring Cloud Gateway的特征
- Java 8
- Spring Framework 5
- Spring Boot 2
- 動(dòng)態(tài)路由
- 內(nèi)置到Spring Handler映射中的路由匹配
- 基于HTTP請求的路由匹配 (Path, Method, Header, Host, etc…)
- 過濾器作用于匹配的路由
- 過濾器可以修改下游HTTP請求和HTTP響應(yīng) (Add/Remove Headers, Add/Remove Parameters, Rewrite Path, Set Path, Hystrix, etc…)
- 通過API或配置驅(qū)動(dòng)
- 支持Spring Cloud DiscoveryClient配置路由,與服務(wù)發(fā)現(xiàn)與注冊配合使用
快速上手
Spring Cloud Gateway 網(wǎng)關(guān)路由有兩種配置方式:
在配置文件 yml 中配置
通過@Bean自定義 RouteLocator,在啟動(dòng)主類 Application 中配置
這兩種方式是等價(jià)的,建議使用 yml 方式進(jìn)配置。
1.pom.xml Maven依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--Spring Cloud Gateway 是使用 netty+webflux 實(shí)現(xiàn)因此不需要再引入 web 模塊--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
2.application.yml配置
server: port: 8080 spring: cloud: gateway: routes: - id: easy_route # 我們自定義的路由 ID,保持唯一 uri: https://github.com # 目標(biāo)服務(wù)地址 predicates: # 路由條件,Predicate 接受一個(gè)輸入?yún)?shù),返回一個(gè)布爾值結(jié)果。該接口包含多種默認(rèn)方法來將 - Path=/smltq/spring-boot-demo
上面這段配置的意思是,配置了一個(gè) id 為 easy_route 的路由規(guī)則,當(dāng)訪問地址 http://localhost:8080/smltq/spring-boot-demo時(shí)會(huì)自動(dòng)轉(zhuǎn)發(fā)到地址:https://github.com/smltq/spring-boot-demo 。
3.配置完成啟動(dòng)項(xiàng)目
在瀏覽器訪問進(jìn)行測試,當(dāng)我們訪問 http://localhost:8080/smltq/spring-boot-demo 時(shí)會(huì)展示如下頁面:
資料
Spring Boot、Spring Cloud示例學(xué)習(xí)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot基礎(chǔ)之RedisUtils工具類
本文來說下RedisUtils工具類,主要介紹了整合Redis、MyBatis,封裝RedisUtils工具類等知識(shí),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05springboot項(xiàng)目或其他項(xiàng)目使用@Test測試項(xiàng)目接口配置
這篇文章主要介紹了springboot項(xiàng)目或其他項(xiàng)目使用@Test測試項(xiàng)目接口配置,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot綁定配置文件中變量的四種方式總結(jié)
當(dāng)在Spring Boot中需要綁定配置文件中的變量時(shí),可以使用以下注解:@PropertySourc,@Value,@Environment,@ConfigurationProperties,具體實(shí)現(xiàn)代碼示例文中講解的非常詳細(xì),需要的朋友可以參考下2023-11-11Springboot整合zookeeper實(shí)現(xiàn)對節(jié)點(diǎn)的創(chuàng)建、監(jiān)聽與判斷的案例詳解
這篇文章主要介紹了基于Springboot整合zookeeper實(shí)現(xiàn)對節(jié)點(diǎn)的創(chuàng)建、監(jiān)聽與判斷,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06SpringBoot自定義對象參數(shù)超詳細(xì)介紹作用
SpringBoot通過自定義對象參數(shù),可以實(shí)現(xiàn)自動(dòng)類型轉(zhuǎn)換與格式化,并可以級聯(lián)封裝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09spring?boot?executable?jar/war?原理解析
spring boot里其實(shí)不僅可以直接以 java -jar demo.jar的方式啟動(dòng),還可以把jar/war變?yōu)橐粋€(gè)可以執(zhí)行的腳本來啟動(dòng),比如./demo.jar,這篇文章主要介紹了spring?boot?executable?jar/war?原理,需要的朋友可以參考下2023-02-02