概述:
服務的合並,轉發,驗證,異構協議。將上百個請求融為一個發送到后台,返回大的JSON返回處理;
作用:這減少了客戶端與應用程序間的交互次數,還簡化了客戶端代碼。
Zuul可以通過加載動態過濾機制,從而實現以下各項功能:
l 驗證與安全保障: 識別面向各類資源的驗證要求並拒絕那些與要求不符的請求。
l 審查與監控: 在邊緣位置追蹤有意義數據及統計結果,從而為我們帶來准確的生產狀態結論。
l 動態路由: 以動態方式根據需要將請求路由至不同后端集群處。
l 壓力測試: 逐漸增加指向集群的負載流量,從而計算性能水平。
l 負載分配: 為每一種負載類型分配對應容量,並棄用超出限定值的請求。
l 靜態響應處理: 在邊緣位置直接建立部分響應,從而避免其流入內部集群。
l 多區域彈性: 跨越AWS區域進行請求路由,旨在實現ELB使用多樣化並保證邊緣位置與使用者盡可能接近。
除此之外,Netflix公司還利用Zuul的功能通過金絲雀版本實現精確路由與壓力測試。
具體實現:Eureka整合Zuul,並實現斷路器
1.pom.xml
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>client.Zuul</groupId> <artifactId>client-Zuul</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- Hystrix,Feign是基於Hystrix的 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
2.啟動項 ZuulRunApp
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy public class ZuulRunApp { public static void main(String[] args) { SpringApplication.run(ZuulRunApp.class, args); } }
application.yml
server:
port: 8050
spring:
application:
name: client-Zuul
eureka:
client:
serviceUrl:
defaultZone: http://user:password123@localhost:8761/eureka
zuul:
routes:
app-a:
path: /user/**
serviceId: consumer-Hystrix
ZuulFallBack.java
package cn.hz.fallback; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; @Component public class ZuulFallBack implements ZuulFallbackProvider{ @Override public String getRoute() { //為了通用,寫了個* return "*"; } @Override public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); return headers; } @Override public InputStream getBody() throws IOException { String msg = "This is responseContext!"; return new ByteArrayInputStream(msg.getBytes()); } @Override public String getStatusText() throws IOException { return HttpStatus.BAD_REQUEST.getReasonPhrase(); } @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.BAD_REQUEST; } @Override public int getRawStatusCode() throws IOException { return HttpStatus.BAD_REQUEST.value(); } @Override public void close() { } }; } }
執行:
依次啟動:eurekaserver, provider , consumer , Zuul
確保訪問正常后,關閉provider;
執行結果:http://localhost:8050/user/hello/82