Spring Cloud Zuul 閘道器

sun1584732發表於2021-07-20
<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/...

Spring Cloud Zuul 閘道器
通過訪問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介面

Spring Cloud Zuul 閘道器

Spring Cloud Zuul 閘道器

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 閘道器不足

Spring Cloud Zuul 閘道器

本作品採用《CC 協議》,轉載必須註明作者和本文連結
每天進步一點點

相關文章