Spring Coud Alibababa学習ノート(21)-Spring Coud Gatewayカスタムグローバルフィルタ

1932 ワード

上記では、Spring Cloud Gatewayによるグローバルフィルタの一連の内蔵を紹介しましたが、ここではグローバルフィルタのカスタマイズ方法を紹介します.
グローバルフィルタリングをカスタマイズするには、Global Filterインターフェースを実現する必要があります.このインターフェースはGatewayFilterと同じ方法で定義されていますが、Global Filterの例は全てのルートに作用します.
グローバルフィルタをカスタマイズ
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 *         
 */
@Slf4j
@Component
public class CustomizeGlobalFilter implements GlobalFilter {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String path = exchange.getRequest().getURI().getPath();
        log.info("[CustomizeGlobalFilter]      :{}", path);

        long start = System.currentTimeMillis();
        return chain.filter(exchange)
                // then               ,     
                .then(Mono.fromRunnable(() ->
                        log.info("[ {} ]        :{} /ms", path, System.currentTimeMillis() - start)
                ));
    }
}
上記のコードでは、@Componentコメントを使ってグローバルフィルタを有効にします.もう一つの方法は、これらのグローバルフィルタを専門的な配置クラスを使って実際化し、Spring容器に管理することです.コードは以下の通りです.
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

@Slf4j
@Configuration
public class FilterConfig {

    @Bean
    //                ,         
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public GlobalFilter myGlobalFilter(){
        log.info("create myGlobalFilter...");
        return new MyGlobalFilter();
    }
}