javascript
Spring Cloud(四) API网关Zuul
前文回顧:
Spring Cloud(一)Eureka Server-單體及集群搭建
Spring Cloud(二) 配置Eureka Client
Spring Cloud(三) 熔斷器Hystrix
一.API網(wǎng)關(guān)
API網(wǎng)關(guān)旨在用一套單一且統(tǒng)一的API入口點(diǎn),來(lái)組合一個(gè)或多個(gè)內(nèi)部API。
API網(wǎng)關(guān)定位為應(yīng)用系統(tǒng)服務(wù)接口的網(wǎng)關(guān),區(qū)別于網(wǎng)絡(luò)技術(shù)的網(wǎng)關(guān),但是原理是一樣的。API網(wǎng)關(guān)統(tǒng)一服務(wù)入口,可方便實(shí)現(xiàn)對(duì)平臺(tái)眾多服務(wù)接口進(jìn)行管控,如對(duì)訪(fǎng)問(wèn)服務(wù)的身份認(rèn)證、防報(bào)文重放與防數(shù)據(jù)篡改、功能調(diào)用的業(yè)務(wù)鑒權(quán),以及相應(yīng)數(shù)據(jù)的脫敏、流量與并發(fā)控制,甚至基于API調(diào)用的計(jì)量或計(jì)費(fèi)等。
API網(wǎng)關(guān)常用于以下場(chǎng)景:
-
黑白名單:實(shí)現(xiàn)通過(guò)IP地址控制禁止訪(fǎng)問(wèn)網(wǎng)關(guān)功能
-
日志:實(shí)現(xiàn)訪(fǎng)問(wèn)日志的記錄,可用于分析訪(fǎng)問(wèn),處理性能指標(biāo),同時(shí)將分析結(jié)果支持其它模塊功能應(yīng)用
-
協(xié)議適配:實(shí)現(xiàn)通信協(xié)議校驗(yàn)、適配轉(zhuǎn)換的功能
-
身份認(rèn)證:負(fù)責(zé)網(wǎng)關(guān)訪(fǎng)問(wèn)身份認(rèn)證驗(yàn)證
-
計(jì)流限流:實(shí)現(xiàn)微服務(wù)訪(fǎng)問(wèn)流量計(jì)算,基于流量計(jì)算分析進(jìn)行限流,可以定義多種限流規(guī)則
-
路由:是API網(wǎng)關(guān)很核心的模塊功能,此模塊實(shí)現(xiàn)根據(jù)請(qǐng)求鎖定目標(biāo)微服務(wù),并將請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)
API網(wǎng)關(guān)所帶來(lái)的好處:
-
避免將內(nèi)部信息泄露給外部
-
為微服務(wù)添加額外的安全層
-
支持混合通信協(xié)議
-
降低構(gòu)建微服務(wù)的復(fù)雜性
-
微服務(wù)模擬與虛擬化
二.Zuul
Zuul是Netflix出品的一個(gè)基于JVM路由和服務(wù)端的負(fù)載均衡器。
Zuul 在云平臺(tái)上提供動(dòng)態(tài)路由,監(jiān)控,彈性,安全等邊緣服務(wù)的框架。Zuul 相當(dāng)于是設(shè)備和 Netflix 流應(yīng)用的 Web 網(wǎng)站后端所有請(qǐng)求的前門(mén)。
Zuul可以通過(guò)加載動(dòng)態(tài)過(guò)濾機(jī)制,從而實(shí)現(xiàn)以下各項(xiàng)功能:
-
驗(yàn)證與安全保障: 識(shí)別面向各類(lèi)資源的驗(yàn)證要求并拒絕那些與要求不符的請(qǐng)求。
-
審查與監(jiān)控: 在邊緣位置追蹤有意義數(shù)據(jù)及統(tǒng)計(jì)結(jié)果,從而為我們帶來(lái)準(zhǔn)確的生產(chǎn)狀態(tài)結(jié)論。
-
動(dòng)態(tài)路由: 以動(dòng)態(tài)方式根據(jù)需要將請(qǐng)求路由至不同后端集群處。
-
壓力測(cè)試: 逐漸增加指向集群的負(fù)載流量,從而計(jì)算性能水平。
-
負(fù)載分配: 為每一種負(fù)載類(lèi)型分配對(duì)應(yīng)容量,并棄用超出限定值的請(qǐng)求。
-
靜態(tài)響應(yīng)處理: 在邊緣位置直接建立部分響應(yīng),從而避免其流入內(nèi)部集群。
-
多區(qū)域彈性: 跨越AWS區(qū)域進(jìn)行請(qǐng)求路由,旨在實(shí)現(xiàn)ELB使用多樣化并保證邊緣位置與使用者盡可能接近。
三.代碼示例
1.pom中添加依賴(lài)
? ?<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/></parent> ?<properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.SR1</spring-cloud.version></properties> ?<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>2.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency> ?<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies> ?<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>2.Application啟動(dòng)類(lèi)中添加注解
-
@EnableZuulProxy:支持網(wǎng)關(guān)路由
3.配置文件
spring.application.name=gateway-service-zuul server.port=8888 ? zuul.routes.api-a.path=/producer/** zuul.routes.api-a.serviceId=spring-cloud-producer ? eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/4.測(cè)試
依次啟動(dòng) spring-cloud-eureka、 spring-cloud-producer、gateway-service-zuul-eureka,訪(fǎng)問(wèn):http://localhost:8888/producer/hello?name=yfy
返回:hello yfy,welcome to Spring Cloud
測(cè)試集群,修改端口號(hào),啟動(dòng)spring-cloud-producer
@RestController public class HelloController { ?@RequestMapping("/hello")public String index(@RequestParam String name) {return "hello " + name + ",welcome to Spring Cloud:product2";} }修改完成后啟動(dòng)spring-cloud-producer-2,重啟gateway-service-zuul-eureka。測(cè)試多次訪(fǎng)問(wèn)http://localhost:8888/producer/hello?name=yfy,依次返回:
hello yfy,welcome to Spring Cloud hello yfy,welcome to Spring Cloud:product2 hello yfy,welcome to Spring Cloud hello yfy,welcome to Spring Cloud:product2 ...說(shuō)明通過(guò)zuul成功調(diào)用了producer服務(wù)并且做了均衡負(fù)載。
5.網(wǎng)關(guān)的默認(rèn)路由規(guī)則
如果后端服務(wù)多達(dá)十幾個(gè)的時(shí)候,每一個(gè)都這樣配置也挺麻煩的,spring cloud zuul已經(jīng)幫我們做了默認(rèn)配置。默認(rèn)情況下,Zuul會(huì)代理所有注冊(cè)到Eureka Server的微服務(wù),并且Zuul的路由規(guī)則如下:
http://ZUUL_HOST:ZUUL_PORT/微服務(wù)在Eureka上的serviceId/**會(huì)被轉(zhuǎn)發(fā)到serviceId對(duì)應(yīng)的微服務(wù)。
我們注銷(xiāo)掉gateway-service-zuul-eureka項(xiàng)目中關(guān)于路由的配置:
#zuul.routes.api-a.path=/producer/** #zuul.routes.api-a.serviceId=spring-cloud-producer重新啟動(dòng)后,訪(fǎng)問(wèn)http://localhost:8888/spring-cloud-producer/hello?name=yfy,測(cè)試返回結(jié)果和上述示例相同,說(shuō)明Spring cloud zuul默認(rèn)已經(jīng)提供了轉(zhuǎn)發(fā)功能。
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud(四) API网关Zuul的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Cloud(三) 熔断器H
- 下一篇: Spring Cloud(五) Zuul