1.介紹
Zuul是spring cloud中的微服務網關。網關: 是一個網絡整體系統中的前置門戶入口。請求首先通過網關,進行路徑的路由,定位到具體的服務節點上。也減少了客戶端與服務端的耦合,服務可以獨立發展,通過網關層來做映射
Zuul主要有兩大功能:路由轉發和過濾。路由轉發能夠爲全部服務提供一個唯一的入口,起到外部和內部隔離的作用,保障了後臺服務的安全性。過濾可以用來鑑權校驗,識別每個請求的權限,拒絕不符合要求的請求。
當它和config server組件配合時能夠實現動態路由,動態的將請求路由到不同的後端集羣中。
Zuul默認是實現了hystrix,ribbon和actuator
2.路由功能
要創建一個Zuul項目,很簡單:
2.1 引入pom文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2.2 主類添加@EnableZuulProxy註解開啓網關服務功能
2.3 application.yml
spring:
application:
name: zuul-demo
server:
port: 5555
這樣zuul就搭建完成了,然後我們可以通過在配置文件中對zuul進行配置來實現路由轉發。
2.4 傳統路由配置
2.4.1 單實例配置
在傳統的路由的單實例配置中,通過配置path和url來進行轉發,配置格式爲:zuul.routes.<routeName>.path和zuul.routes.<routeName>.url,如以下配置,<routeName>則表示api-a,該名稱可隨意定義。但是一組path和url映射關係的路由名要相同
zuul:
routes:
api-a:
path: /apia/**
url: http://localhost:8080/
像如上配置,當我們訪問http://localhost:5555/apia/hello時,會被轉發到http://localhost:8080/hello
2.4.2 多實例配置
通過zuul.routes.<routeName>.path和zuul.routes.<routeName>.serviceId參數進行配置,然後利用ribbon的服務列表實現負載均衡(Zuul中自帶了對Ribbon的依賴)
zuul:
routes:
api-a:
path: /apia/**
serviceId: api-a
api-a:
ribbon:
listOfServers: http://localhost:8090/
傳統的路由模式中,無論是單實例還是多實例,我們都需要自己去維護路由名稱,且需要自己定義path和服務實例的列表,這樣無疑是很麻煩的。那我們可以將Eureka加進來,因爲Eureka中存在所有的服務列表。
2.5 服務路由配置(Zuul和Eureka整合)
通過Zuul和Eureka的整合,可以實現對服務實例的自動化維護,即我們不需要再爲每個serviceId指定具體的服務實例列表.但是我們依然是需要維護請求路徑的匹配表達式和服務名的映射關係,(也可不維護,會根據默認的路由規則生成)
爲Zuul項目添加Eureka的依賴,和@EnableDiscoveryClient註解。
現在我們啓動Eureka註冊中心,服務提供者端口8090,和Zuul項目
當我們將Zuul和Eureka整合後,只需要像如下配置即可:route名可隨意定義
zuul:
routes:
#route名,可隨意定義
feign-service-provider:
path: /feign-service-provider/**
serviceId: feign-service-provider
我們也可以使用更簡單的配置方式:zuul.routes.<serviceId>=<path>,如上的配置等價於:
zuul:
routes:
feign-service-provider: /feign-service-provider/**
然後訪問http://localhost:5555/feign-service-provider/okuserpost,返回成功
2.5.1 通過接口的方式查看路由列表
首先需要在application.yml中添加如下配置,將actuator的/routes端口暴露出來,如果不添加配置,訪問該端口會報404
management:
endpoints:
web:
exposure:
include: "*"
然後訪問http://localhost:5555/actuator/routes,會出現以下json結果:
{
"/feign-service-provider/**": "feign-service-provider"
}
2.5.2 路由默認規則
由於再實際的運用過程中,大部分的路由配置規則幾乎都會採用服務名作爲外部請求的前綴,比如以下例子,其中path路徑的前綴使用了feign-service-provider,而對應的服務名也是feign-service-provider,對於這樣有規則性的配置內容,我們希望自動化的完成
zuul:
routes:
#route名,可隨意定義
feign-service-provider:
path: /feign-service-provider/**
serviceId: feign-service-provider
當我們將Zuul和Eureka整合後,Zuul默認實現了這樣一套規則,該規則會自動的生成path和serviceId的關聯,這樣我們就不需要再爲這些服務維護這些基本的路由規則了。
由於默認情況下所有Eureka上的服務都會被Zuul自動地創建路由,這回使得一些我們不希望對外開放的服務也會被外部訪問到,這時,我們可以使用zuul.ignored-services參數來設置一個服務名表達式來定義不自動創建路由的規則,如當我們設置zuul.ignored-services=*時,Zuul對所有的服務都不自動創建規則。在這種情況下,我們要在配置文件中逐個爲需要路由的服務添加規則(使用zuul.routes.<serviceId>=<path>的方式)。