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