Zuul概述
Zuul
包含的對請求的路由和過濾兩個主要功能。
其中路由功能負責将外部請求轉發到具體的微服務執行個體上,是實作外部通路統一入口的基礎,而過濾功能則負責對請求的處理過程進行幹預,是實作請求校驗、服務聚合等功能的基礎。
Zuul
和
Eureka
整合,将
zuul
自身注冊為
Eureka
服務治理下的應用,同時從
Eureka
中擷取其他微服務的消息,也就i是說以後通路微服務都要通過
Zuul
跳轉後獲得。
Zuul
最終也是要注冊進
Eureka
的。
Zuul
主要提供:代理、路由、過濾三大功能。
Zuul的實作
通過上面的概述,我們可以了解到Zuul最終還是會注冊到Eureka中,是以,zuul的本質也可以看作一個eureka的服務
建立一個項目
1)引入依賴
<dependencies>
<!-- 引入公用實體類依賴,引入api -->
<dependency>
<groupId>com.sc</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- spring boot web啟動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- Ribbon依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- Hystrix依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- Hystrix Dashboard依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 監控資訊 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Zuul依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 熱部署依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
2)編寫配置檔案
server:
port: 6527
spring:
application:
name: zuul
#Eureka 配置
eureka:
client:
service-url:
defaultZone: http://localhost:7003/eureka/
instance:
instance-id: zuul6527
prefer-ip-address: false #false 隐藏服務的位址資訊,true顯示IP位址
#路由網關配置
zuul:
routes: #配置微服務的通路别名
mydept.serviceId: peo_user
mydept.path: /mydept/**
ignored-services: "*" # peo_user忽略微服務的真實名稱,不能以名稱通路,"*"隐藏全部服務
prefix: /fyy #統一通路字首
info:
app.name: fyy
company.name: www.fyy.com
3)配置啟動類
@SpringBootApplication
@EnableZuulProxy
public class ZuuApplication {
public static void main(String[] args) {
SpringApplication.run(ZuuApplication.class,args);
}
}
簡單三步,我們就實作了zuul統一網關的實作內建
Zuul配置詳解
-
檢視 zuul 中配置好的路由和過濾器資訊
當我們啟動了zuul 的網關之後,想知道目前zuul代理了那些路由,通路的路徑又是那些或者我們自己寫了一個zuul的filter,想知道它目前位于zuul的filter的那個位置時,該如何查詢
通路路徑:
http://網關位址:端口/routes 通路路由的簡單資訊
http://網關位址:端口/routes?format=details 通路路由的詳細資訊
http://網關位址:端口/filters 通路zuul中使用了那些過濾器
yml配置
management:
security:
enabled: false # 預設值是 true, 為true的話那麼頁面上可能會報沒有權限通路
- 忽略所有微服務或某些微服務
zuul:
ignored-services: "*" #忽略所有微服務
ignored-services: product-provider,product-consumer-8201 #忽略某些微服務:(直接寫微服務的名字=>可以了解為spring.application.name的值,多個以都好分隔)
- 路由指定的微服務
zuul:
routes: #配置微服務的通路别名,一個map的key-value
mydept.serviceId: peo_user
mydept.path: /mydept/**
...
...
- 通過path和url通路到具體的某台機器上
zuul:
routes:
product-provider:
path: /product/**
url: http://localhost:8202/ #url 裡面不可以寫多個url,通路不會作為 HystrixCommand 來進行通路
- 脫離eureka進行通路,并使之具有負載均衡和隔離的機制等
ribbon:
eureka:
enabled: false #修改為false
zuul:
routes:
product-provider:
path:
serviceId:
baidu-oschina:
ribbon:
listOfServers: http://www.baidu.com/,https://gitee.com:443/
- 轉發前是否去掉路由字首&添加統一路由字首
zuul:
prefix: /fyy #統一通路字首
strip-prefix: true #轉發前是否去掉路由字首 true:去掉;false:不去
- 忽略某些路徑不進行路由
zuul:
ignored-patterns: /**/selectOne/**
@EnableZuulServer、@EnableZuulProxy兩個注解的差別
簡單的說
@EnableZuulProxy
是
@EnableZuulServer
的增強版,當Zuul與Eureka、Ribbon等元件配合使用時,我們使用
@EnableZuulProxy
。
@EnableZuulServer過濾器:
1)pre類型過濾器:
-
:該過濾器用于檢查請求是否通過Spring Dispatcher。檢查後,通過ServletDetectionFilter
設定布爾值isDispatcherServletRequest
-
:解析表單資料,并為請求重新編碼FormBodyWrapperFilter
-
:顧名思義,調試用的過濾器,可以通過DebugFilter
zuul.debug.request=true
開啟該過濾器
2)route類型過濾器
-
:該過濾器使用Servlet RequestDispatcher轉發請求,轉發位置存儲在SendForwardFilter
中,可以設定為RequestContext.getCurrentContext().get("forward.to")
,然後通路zuul、routes、abc、path: /abc/**、url: forward:/abc
$ZUUL_HOST:ZUUL_PORT/abc
,觀察該過濾器的執行過程。
3)post類型過濾器
SendResponseFilter
:将Zuul所代理的微服務的響應寫入目前響應
4)error類型過濾器
:如果SendErrorFilter
不為null,那麼預設就會轉發到/error,也可以設定RequestContext.getThrowable()
屬性修改預設的轉發路徑error.path
@EnableZuulProxy過濾器:
如果使用注解
@EnableZuulProxy
,那麼除上述過濾器之外,Spring Cloud還會增加以下過濾器
1)pre類型過濾器
-
PreDecorationFilter
:該過濾器根據提供的RouteLocator确定路由到的位址,以及怎樣去路由。該路由器也可為後端請求設定各種代理相關的header
2)route類型過濾器
-
RibbonRoutingFilter
:該過濾器使用Ribbon,Hystrix和可插拔的HTTP用戶端發送請求,該過濾器可使用不同的HTTP用戶端
(1) Apache HttpClient:預設的HTTP用戶端
(2)SquareupOkHttpClient v3:如需使用該用戶端,需保證
的依賴在classpath中,并設定com.squareup.okhttp3
(3)Netflix Ribbon HTTP client:設定ribbon.okhttp.enabled = true
即可啟用該HTTP用戶端。需要注意的是,該用戶端有一定限制,例如不支援PATCH方法,另外,它有内置的重試機制ribbon.restclient.enabled = true
-
:該過濾器通過Apache HttpClient向指定的URL發送請求。URL在SimpleHostRoutingFilter
中RequestContext.getRouteHost()
源碼位址:下載下傳位址