Spring Cloud Zuul:API網關服務
- Zuul簡介
- 常用功能
- 啟動相關服務
- 配置路由規則
- 默認路由規則
- 負載均衡功能
- 配置訪問前綴
- Header過濾及重定向添加Host
- 查看路由資訊
- 過濾器
- 過濾器型別
- 過濾器的生命周期
- 自定義過濾器
- 核心過濾器
- 禁用過濾器
- Ribbon和Hystrix的支持
- 常用配置
Spring Cloud Zuul 是Spring Cloud Netflix 子專案的核心組件之一,可以作為微服務架構中的API網關使用,支持動態路由與過濾功能,本文將對其用法進行詳細介紹,
Zuul簡介
API網關為微服務架構中的服務提供了統一的訪問入口,客戶端通過API網關訪問相關服務,API網關的定義類似于設計模式中的門面模式,它相當于整個微服務架構中的門面,所有客戶端的訪問都通過它來進行路由及過濾,它實作了請求路由、負載均衡、校驗過濾、服務容錯、服務聚合等功能,
常用功能
配置路由規則
我們可以通過修改application.yml中的配置來配置路由規則,這里我們將匹配/userService/**的請求路由到user-service服務上去匹配/feignService/**的請求路由到feign-service上去,
zuul:
routes: #給服務配置路由
user-service:
path: /userService/**
feign-service:
path: /feignService/**
- 訪問http://localhost:8801/userService/user/1可以發現請求路由到了user-service上了;
- 訪問http://localhost:8801/feignService/user/1可以發現請求路由到了feign-service上了,
默認路由規則
Zuul和Eureka結合使用,可以實作路由的自動配置,自動配置的路由以服務名稱為匹配路徑,相當于如下配置:
zuul:
routes: #給服務配置路由
user-service:
path: /user-service/**
feign-service:
path: /feign-service/**
- 訪問http://localhost:8801/user-service/user/1同樣可以路由到了user-service上了;
- 訪問http://localhost:8801/feign-service/user/1同樣可以路由到了feign-service上了
如果不想使用默認的路由規則,可以添加以下配置來忽略默認路由配置:
zuul:
ignored-services: user-service,feign-service #關閉默認路由配置
負載均衡功能
多次呼叫http://localhost:8801/user-service/user/1進行測驗,可以發現運行在8201和8202的user-service服務交替列印如下資訊,
2019-10-05 10:31:58.738 INFO 11520 --- [nio-8202-exec-5] c.macro.cloud.controller.UserController : 根據id獲取用戶資訊,用戶名稱為:macro
2019-10-05 10:32:00.356 INFO 11520 --- [nio-8202-exec-6] c.macro.cloud.controller.UserController : 根據id獲取用戶資訊,用戶名稱為:macro
配置訪問前綴
我們可以通過以下配置來給網關路徑添加前綴,此處添加了/proxy前綴,這樣我們需要訪問http://localhost:8801/proxy/user-service/user/1才能訪問到user-service中的介面,
zuul:
prefix: /proxy #給網關路由添加前綴
Header過濾及重定向添加Host
zuul:
sensitive-headers: Cookie,Set-Cookie,Authorization #配置過濾敏感的請求頭資訊,設定為空就不會過濾
Zuul在請求路由時,不會設定最初的host頭資訊,以下配置可以解決:
zuul:
add-host-header: true #設定為true重定向是會添加host請求頭
查看路由資訊
我們可以通過SpringBoot Actuator來查看Zuul中的路由資訊,
在pom.xml中添加相關依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改application.yaml組態檔,開啟查看路由的端點:
management:
endpoints:
web:
exposure:
include: 'routes'
通過訪問http://localhost:8801/actuator/routes查看簡單路由資訊:

過濾器
路由與過濾是Zuul的兩大核心功能,路由功能負責將外部請求轉發到具體的服務實體上去,是實作統一訪問入口的基礎,過濾功能負責對請求程序進行額外的處理,是請求校驗過濾及服務聚合的基礎,
過濾器型別
Zuul中有以下幾種典型的過濾器型別,
- pre:在請求被路由到目標服務前執行,比如權限校驗、列印日志等功能;
- routing:在請求被路由到目標服務時執行,這是使用Apache HttpClient或Netflix
Ribbon構建和發送原始HTTP請求的地方; - post:在請求被路由到目標服務后執行,比如給目標服務的回應添加頭資訊,收集統計資料等功能;
- error:請求在其他階段發生錯誤時執行,
過濾器的生命周期
下圖描述了一個HTTP請求到達API網關后,如何在各種不同型別的過濾器中流轉的程序,

自定義過濾器
接下來我們自定義一個過濾器來演示下過濾器的作用,
添加PreLogFilter類繼承ZuulFilter
這是一個前置過濾器,用于在請求路由到目標服務前列印請求日志,
@Component
public class PreLogFilter extends ZuulFilter {
private Logger LOGGER = LoggerFactory.getLogger(this.getClass());
/**
* 過濾器型別,有pre、routing、post、error四種,
*/
@Override
public String filterType() {
return "pre";
}
/**
* 過濾器執行順序,數值越小優先級越高,
*/
@Override
public int filterOrder() {
return 1;
}
/**
* 是否進行過濾,回傳true會執行過濾,
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 自定義的過濾器邏輯,當shouldFilter()回傳true時會執行,
*/
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
String host = request.getRemoteHost();
String method = request.getMethod();
String uri = request.getRequestURI();
LOGGER.info("Remote host:{},method:{},uri:{}", host, method, uri);
return null;
}
}
過濾器功能演示
添加過濾器后,我們訪問http://localhost:8801/user-service/user/1測驗下,會列印如下日志,
2019-10-05 15:13:10.232 INFO 11040 --- [nio-8801-exec-7] com.macro.cloud.filter.PreLogFilter : Remote host:0:0:0:0:0:0:0:1,method:GET,uri:/user-service/user/1
核心過濾器

禁用過濾器
我們可以對過濾器進行禁用的配置,配置格式如下:
zuul:
filterClassName:
filter:
disable: true
以下是禁用PreLogFilter的示例配置:
zuul:
PreLogFilter:
pre:
disable: true
Ribbon和Hystrix的支持
由于Zuul自動集成了Ribbon和Hystrix,所以Zuul天生就有負載均衡和服務容錯能力,我們可以通過Ribbon和Hystrix的配置來配置Zuul中的相應功能,
可以使用Hystrix的配置來設定路由轉發時HystrixCommand的執行超時時間:
hystrix:
command: #用于控制HystrixCommand的行為
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000 #配置HystrixCommand執行的超時時間,執行超過該時間會進行服務降級處理
可以使用Ribbon的配置來設定路由轉發時請求連接及處理的超時時間:
ribbon: #全域配置
ConnectTimeout: 1000 #服務請求連接超時時間(毫秒)
ReadTimeout: 3000 #服務請求處理超時時間(毫秒)
常用配置
zuul:
routes: #給服務配置路由
user-service:
path: /userService/**
feign-service:
path: /feignService/**
ignored-services: user-service,feign-service #關閉默認路由配置
prefix: /proxy #給網關路由添加前綴
sensitive-headers: Cookie,Set-Cookie,Authorization #配置過濾敏感的請求頭資訊,設定為空就不會過濾
add-host-header: true #設定為true重定向是會添加host請求頭
retryable: true # 關閉重試機制
PreLogFilter:
pre:
disable: false #控制是否啟用過濾器
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/234239.html
標籤:其他
上一篇:MyBatis學習總結
