路由器和過濾器:Zuul
路由在微服務體系結構的一個組成部分。例如,/可以映射到你的Web應用程序,/api/users映射到用戶服務和/api/shop映射到店服務。Zuul是Netflix的基於JVM的路由器和服務器端負載均衡器。
Netflix使用Zuul進行以下操作:
認證
洞察
壓力測試
金絲雀測試
動態路由
服務遷移
負載脫落
安全
靜態響應處理
主動/主動流量管理
Zuul的規則引擎允許基本上寫任何JVM語言編寫規則和過濾器,內置Java和Groovy。
注意:
配置屬性zuul.max.host.connections已被兩個新屬性zuul.host.maxTotalConnections和zuul.host.maxPerRouteConnections替換,分別默認爲200和20。
注意:
所有路由的默認Hystrix隔離模式(ExecutionIsolationStrategy)爲SEMAPHORE。如果此隔離模式是首選,則zuul.ribbonIsolationStrategy可以更改爲THREAD。
新建Spring Boot 項目 取名servicezuul,pom文件如下:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.heyuanjun.service-zuul</groupId>
<artifactId>service-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-zuul</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.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>
<spring-cloud.version>Camden.SR7</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
<repository>
<id>repository.springframework.maven.snapshot</id>
<name>Spring Framework Maven Snapshot Repository</name>
<url>http://repo.spring.io/snapshot/</url>
</repository>
</repositories>
</project>
zuul的起步依賴是:
org.springframework.cloud
spring-cloud-starter-zuul
啓動類上加上註解,@EnableZuulProxy,@EnableEurekaClient
配置文件作如下配置:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8769
spring:
application:
name: service-zuul
zuul:
#路由方向
routes:
api-a:
path: /api-a/**
serviceId: service-ribbon
api-b:
path: /api-b/**
serviceId: service-feign
啓動服務註冊中心,啓動服務提供者,啓動ribbon工程,啓動feign工程,啓動zuul工程。
瀏覽器訪問:http://localhost:8761/
瀏覽器訪問:http://localhost:8769/api-a/hi?name=君君&token=2000
瀏覽器訪問:http://localhost:8769/api-b/hi?name=君君&token=2000
api-a開頭的請求轉發到了ribbon,api-b開頭的請求轉發到了feign, 說明路由器zuul起到了作用。
請求地址有一個參數是token,這時zuul起到的過濾器的作用。
zuul項目新建一個package,包內新建類ZuulFilter
package com.heyuanjun.servicezuul.servicezuul.filter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
* @author heyaunjun
* @date 2017-11-8 19:42
*/
@Component
public class ZuulFilter extends com.netflix.zuul.ZuulFilter {
private static Logger log = LoggerFactory.getLogger(ZuulFilter.class);
/**
* 返回一個字符串指明是哪個過濾類型
* @return 字符串
*/
@Override
public String filterType() {
// pre:路由之前
// routing:路由之時
// post: 路由之後
// error:發送錯誤調用
return "pre";
}
/**
* 過濾的順序
* @return int
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 可以添加一些邏輯來確定是否需要過濾
* 目前返回true,代表永遠過濾
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("token");
if(accessToken == null) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is null");
}catch (Exception e){
}
return null;
}
return null;
}
}
瀏覽器訪問:http://localhost:8769/api-b/hi?name=君君
模擬了沒有token的情況下,路由器起到的過濾作用。
嵌入式Zuul反向代理
Spring Cloud已經創建了一個嵌入式Zuul代理,以簡化UI應用程序想要代理對一個或多個後端服務的呼叫的非常常見的用例的開發。此功能對於用戶界面對其所需的後端服務進行代理是有用的,避免了對所有後端獨立管理CORS和驗證問題的需求。
要啓用它,使用@EnableZuulProxy註釋Spring Boot主類,並將本地調用轉發到相應的服務。按照慣例,具有ID“用戶”的服務將接收來自位於/users(具有前綴stripped)的代理的請求。代理使用Ribbon來定位一個通過發現轉發的實例,並且所有請求都以 hystrix命令執行,所以故障將顯示在Hystrix指標中,一旦電路打開,代理將不會嘗試聯繫服務。
各種IT書籍書目及下載鏈接
https://blog.csdn.net/dh1027/article/details/89327978