Zuul簡介
Zuul是Netflix開源的微服務網關,它可以和Eureka、Ribbon、Hystrix等組件配合使用。Zuul的核心是一系列的過濾器,這些過濾器幫助我們完成以下功能:
- 身份認證與安全:識別每個資源的驗證要求,并拒絕那些與要求不符的請求;
- 審查與監控:在邊緣位置追蹤有意義的數據和統計結果,從而為我們帶來精確的生產視圖;
- 動態路由:動態地將請求路由到不同的后端集群;
- 壓力測試:逐漸增加指向集群的流量,以了解性能;
- 負載分配:為每一種負載類型分配對應容量,并棄用超出限定值的請求;
- 靜態響應處理:在邊緣位置直接建立部分響應,從而避免其轉發到內部集群;
- 多區域彈性:跨越AWS Region進行請求路由,旨在實現ELB(Elastic Load Balancing)使用的多樣化;以及讓系統的邊緣更貼近系統的使用者。
注1:以上介紹來自Zuul官方文檔,但其實開源版本的Zuul以上功能一個都沒有——開源的Zuul只是幾個Jar包而已,以上能力指的應該是Netflix官方自用的Zuul的能力。
注2:Netflix自用的Zuul能力是比較強大的,可使用Groovy編寫過濾器,并且可動態加載/卸載、修改規則,而且使用Cassandra作為數據庫,然而開源版本這些一個都沒有。
注3:Spring Cloud中,Zuul絕大部分功能都是Spring Cloud團隊為Zuul開發的。
注4:所以Zuul 2.x的開源進度延后一年,Spring Cloud團隊開發了自己的Spring Cloud Gateway,并宣布Spring Cloud不打算支持Zuul 2.x,你還覺得意外嗎?
注5:看到這里,很多人可能沒有動力學習Zuul了,個人認為還是可以了解一下的,后面講到Spring Cloud Gateway時,你會發現很多設計理念是相通的。
Spring Cloud對Zuul進行了整合與增強。目前,Zuul使用的默認HTTP客戶端是Apache HTTP Client,也可以使用RestClient或者 okhttp3.OkHttpClient
。 如果想要使用RestClient,可以設置 ribbon.restclient.enabled=true
;想要使用 okhttp3.OkHttpClient
,可以設置 ribbon.okhttp.enabled=true
。
創建spring-cloud-zuul模塊:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-wsl</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-zuul</name>
<description>Demo project for Spring Cloud Zuul</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
配置文件application.yml:
server:
port: 8884
spring:
application:
name: gateway-zuul
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
zuul:
routes:
consumer-feign: /feign/**
啟動類添加注解
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
依次啟動注冊中心、提供者、消費者、網關:
此處我啟動了兩個provider
瀏覽器打開輸入http://localhost:8884/consumer-feign/feign/test/wangshilin
這是最簡單的zuul路由方法,之后我盡量更新更多路由配置規則和fallback等功能演示,敬請期待