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類型過濾器:
ServletDetectionFilter
:該過濾器用於檢查請求是否通過Spring Dispatcher。檢查後,通過isDispatcherServletRequest
設置布爾值FormBodyWrapperFilter
:解析表單數據,併爲請求重新編碼DebugFilter
:顧名思義,調試用的過濾器,可以通過zuul.debug.request=true
開啓該過濾器
2)route類型過濾器SendForwardFilter
:該過濾器使用Servlet RequestDispatcher轉發請求,轉發位置存儲在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
:如果RequestContext.getThrowable()
不爲null,那麼默認就會轉發到/error,也可以設置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:如需使用該客戶端,需保證com.squareup.okhttp3
的依賴在classpath中,並設置ribbon.okhttp.enabled = true
(3)Netflix Ribbon HTTP client:設置ribbon.restclient.enabled = true
即可啓用該HTTP客戶端。需要注意的是,該客戶端有一定限制,例如不支持PATCH方法,另外,它有內置的重試機制SimpleHostRoutingFilter
:該過濾器通過Apache HttpClient向指定的URL發送請求。URL在RequestContext.getRouteHost()
中