SpringCloudAlibaba - Gateway 自定義過濾器工廠

前言

Gateway中的過濾器可以爲路由添加業務邏輯,修改請求以及響應


環境

Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE


Gateway過濾器的生命週期

  • pre: Gateway轉發請求之前
  • post: Gateway轉發請求之後

過濾器工廠

內置過濾器工廠

  • AddRequestHeader GatewayFilter Factory示例,爲原始請求添加請求參數foo=bar
gateway:
  discovery:
    locator:
      # 讓gateway通過服務發現組件找到其他的微服務
      enabled: true
  routes:
    - id: user-center
      uri: lb://user-center
      predicates:
        - Path=/**
      filters:
        - AddRequestParameter=foo, bar
  • 輸入日誌

在這裏插入圖片描述


自定義過濾器工廠

自定義過濾器工廠 - 實現方式

  • 實現自定義過濾器工廠有兩種方式
繼承 AbstractGatewayFilterFactory
繼承 AbstractNameValueGatewayFilterFactory

自定義過濾器工廠 - 具體實例

  • 實現自定義過濾器工廠 - 日誌打印
  • application.yml
gateway:
  discovery:
    locator:
      # 讓gateway通過服務發現組件找到其他的微服務
      enabled: true
  routes:
    - id: user-center
      uri: lb://user-center
      predicates:
        - Path=/**
      filters:
        - PreLog=參數1,參數2
  • PreLogGatewayFilterFactory.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

/**
 * 自定義過濾器工廠 - 日誌打印
 * 必須以GatewayFilterFactory結尾
 */
@Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return ((exchange, chain) -> {
            log.info("自定義過濾器工廠 - 日誌打印參數:{},{}", config.getName(), config.getValue());

            // 修改請求
            ServerHttpRequest modifiedRequest = exchange.getRequest()
                    .mutate()
                    .build();

            // 修改exchange
            ServerWebExchange modifiedExchange = exchange.mutate()
                    .request(modifiedRequest)
                    .build();

            // 傳遞給下一個過濾器處理
            return chain.filter(modifiedExchange);
        });
    }
}
  • 訪問GATEWAY_URL/**

在這裏插入圖片描述


自定義過濾器工廠- 核心API

exchange.getRequest().mutate().xxx // 修改request
exchange.mutate().xxx // 修改exchange
chain.filter(exchange) // 傳遞給下一個過濾器處理
exchange.getResponse() // 拿到響應

- End -
白嫖有風險
點贊加收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章