<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
@SpringBootApplication
@EnableZuulProxy // 開啟Zuul的閘道器功能
public class ZullServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZullServerApplication.class,args);
}
}
server:
port: 9003
spring:
application:
name: zull-service
4.1 簡單入門案例
#路由配置
zuul:
routes:
#以訂單微服務進行配置
#路由ID ,任意指定
product-server:
path: /order-service/** # 對映的路徑 localhost:9003/product-service/**
url: http://127.0.0.1:9001 #對映路徑對應的實際微服務url 地址
訪問路徑:localhost:9003/order-service/order/...
通過訪問zuul 服務埠+ /order-service 即可跳轉訂單微服務呼叫 buy/1 介面
4.2 面向服務的路由
4.2.1 新增eureka 的依賴
<!--註冊中心客戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
4.2.2 開啟eureka的客戶端服務發現
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZullServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZullServerApplication.class,args);
}
}
4.2.3 在Zuul閘道器服務中配置eureka 的註冊中心相關資訊
#註冊中心 客戶端
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9000/eureka/ # 註冊多個eurekaserver 之間用, 隔開
instance:
prefer-ip-address: true #使用ip地址註冊
instance-id: ${spring.cloud.client.ip-address}:${server.port}
lease-renewal-interval-in-seconds: 30 # 傳送心跳間隔 預設 30
lease-expiration-duration-in-seconds: 90 # 續約到期時間 預設 90
4.2.4 修改路由中的對映配置
#路由配置
zuul:
routes:
#以訂單微服務進行配置
#路由ID ,任意指定
product-server:
path: /order-service/** # 對映的路徑 localhost:9003/product-service/**
#url: http://127.0.0.1:9002 #對映路徑對應的實際微服務url 地址
serviceId: service-order #配置轉發的微服務的服務名稱
跟上面的配置唯一區別 修改為 serviceId ,呼叫/order-service/** 轉換成微服務模組的ID , 訂單的服務模組: service-order
4.2.5 簡化路由配置
zuul:
routes:
service-order: /order-service/** # servoce-order 表示就是服務模組的ID
zuul 不進行路由配置,那麼會有預設的路由配置
例如: 如果訂單模組的服務ID service-order ,預設的請求對映路徑 /service-product/** 在呼叫訂單模組的API ,可以loaclhost:8099/service-order/buy/1 也可以呼叫訂單的API介面
配置好eureka ,zull 閘道器,將服務模組的ID 作為routes 的id ,那麼在呼叫service-order 訂單模組API 只需要呼叫/order-service 即可跳轉呼叫訂單模組API介面
pre: 轉發到你微服務之前執行的過濾器
routing: 在路由請求時執行的過濾器
post: 執行微服務獲取返回值之後執行的過濾器
error: 整個階段丟擲異常的時候執行的過濾器
5.1 自定義過濾器
/*
* 自定義PRE過濾器
* */
@Component
public class LoginFilter extends ZuulFilter {
/**
* pre
* routing
* post
* error
* */
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
/*
*當前過濾器是否生效
* true: 使用此過濾器
* false : 不適用此過濾器
* */
@Override
public boolean shouldFilter() {
return true;
}
/**
* 指定過濾器業務邏輯
* */
@Override
public Object run() throws ZuulException {
System.out.println("在轉發到微服務之前執行了過濾器");
return null;
}
}
測試案例: 在自定義pre過濾器中做身份驗證,如果含有token 預設通過,為空則不通過
/**
* 指定過濾器業務邏輯
* */
@Override
public Object run() throws ZuulException {
//獲取上下文
RequestContext requestContext = RequestContext.getCurrentContext();
//獲取當前的http 請求物件
HttpServletRequest request = requestContext.getRequest();
//獲取引數,驗證token
String token = request.getParameter("access-token");
System.out.println(token);
if(token == null){
System.out.println("身份驗證失敗");
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
//身份驗證失敗,那麼將返回401 錯誤
}else{
System.out.println("身份驗證通過");
}
return null;
}
ZUUL 閘道器不足
本作品採用《CC 協議》,轉載必須註明作者和本文連結