1. 程式人生 > >springcloud系列23——Zuul的過濾器

springcloud系列23——Zuul的過濾器

Zuul的過濾器

Zuul過濾器簡介

spring cloud Zuul包含了對請求的路由和過濾2個功能。路由功能負責將請求轉發到具體的微服務上,而過濾器負責對請求的處理過程進行干預,是實現許可權校驗、服務聚合等功能的基礎。

在實際執行時,路由對映和請求轉發是由幾個不同的過濾器完成的。每一個進入zuul的http請求都會經過一系列的過濾器處理鏈得到請求響應並返回給客戶端。

spring cloud zuul包含4種類型的過濾器。

  • pre過濾器。在請求被路由之前呼叫。Zuul請求微服務之前。比如請求身份驗證,選擇微服務例項,記錄除錯資訊等。
  • route過濾器。負責轉發請求到微服務。原始請求在此構建,並使用Apache HttpClient或Netflix Ribbon傳送原始請求。
  • post過濾器。在route和error過濾器之後被呼叫。可以在響應新增標準HTTP Header、收集統計資訊和指標,以及將響應傳送給客戶端等。
  • error過濾器。在處理請求發生錯誤時被呼叫。

除了預設的Filter,Zuul還允許我們建立自定義的過濾器型別。比如,我們可以自定義一個STATIC型別的過濾器,它在Zuul中生成響應,而不是將請求轉發給具體的微服務。

Zuul請求的生命週期如下:

mark

自定義Zuul過濾器

新建模組microservice-gateway-zuul-filter。

新增Zuul和Eureka客戶端的依賴:

<dependency>
    <
groupId
>
org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency
>

application.yml:

spring:
  application:
    name: microservice-gateway-zuul-filter

server:
  port: 8809

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer-ip-address: true

zuul:
  routes:
    user1:
      path: /user/**
      serviceId: microservice-springcloud-user
      stripPrefix: false

logging:
  level:
    com.netflix: debug

定義一個pre型別的過濾器,記錄請求的URI。

public class MyZuulPreFilter extends ZuulFilter {
    private final static Logger LOGGER = org.slf4j.LoggerFactory.getLogger(MyZuulPreFilter.class);
    @Override
    public String filterType() {
        return "pre"; // 指定過濾器型別
    }

    @Override
    public int filterOrder() {
        return 0; // 過濾器順序,數字越小越先執行
    }

    @Override
    public boolean shouldFilter() {
        return true; // 是否使用該過濾器。
    }

    // 過濾器具體執行的操作
    @Override
    public Object run() {
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        String requestUri = request.getRequestURI();
        LOGGER.info("請求的URI:{}",requestUri);
        return null;
    }
}

spring boot主類:

@SpringBootApplication
@EnableZuulProxy
public class ZuulFilterApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(ZuulFilterApplication.class,args);
    }

    @Bean
    public MyZuulPreFilter myZuulPreFilter() {
        return new MyZuulPreFilter();
    }
}

測試:

啟動Eureka Server、user模組和microservice-gateway-zuul-filter。

我們通過Zuul的host和port訪問user模組的/sample/1.

mark

我們看下控制檯。

mark

我們只是簡單記錄一下請求的URI。更多的用法可以參考netflix-core包中的ZuulFilter實現。

mark