>  기사  >  Java  >  Spring Cloud Gateway 글로벌 필터 소개

Spring Cloud Gateway 글로벌 필터 소개

不言
不言앞으로
2019-03-06 15:51:312821검색

스프링 클라우드 게이트웨이 글로벌 필터에 대한 소개를 담은 글입니다. 도움이 필요한 친구들이 참고하시면 좋겠습니다.

글로벌 필터는 모든 경로에 적용되며 별도로 구성할 필요가 없습니다. 이를 사용하여 권한 인증, IP 액세스 제한 등 많은 통합 처리 비즈니스 요구 사항을 충족할 수 있습니다.

인터페이스 정의 클래스: org.springframework.cloud.gateway.filter.GlobalFilter

public interface GlobalFilter {
    Mono<void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}</void>

아래와 같이 게이트웨이와 함께 제공되는 GlobalFilter 구현 클래스가 많이 있습니다. : # 🎜🎜#

Spring Cloud Gateway 글로벌 필터 소개

포워딩, 라우팅, 로드 등과 관련된 GlobalFilter가 있습니다. 관심이 있는 경우 소스 코드를 확인하여 자세히 알아볼 수 있습니다.

자체 비즈니스 로직을 구현하기 위해 GlobalFilter를 어떻게 정의하나요?

공식 문서에서 사례를 들어보세요:

@Configuration
public class ExampleConfiguration {
    private Logger log = LoggerFactory.getLogger(ExampleConfiguration.class);

    @Bean
    @Order(-1)
    public GlobalFilter a() {
        return (exchange, chain) -> {
            log.info("first pre filter");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("third post filter");
            }));
        };
    }

    @Bean
    @Order(0)
    public GlobalFilter b() {
        return (exchange, chain) -> {
            log.info("second pre filter");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("second post filter");
            }));
        };
    }

    @Bean
    @Order(1)
    public GlobalFilter c() {
        return (exchange, chain) -> {
            log.info("third pre filter");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("first post filter");
            }));
        };
    }
}
위에 3개의 GlobalFilter가 정의되어 있으며, 실행 순서는 @Order를 통해 지정됩니다. 우선 사항. . 다음은 출력 로그입니다. 로그에서 실행 순서를 확인할 수 있습니다.

2018-10-14 12:08:52.406  INFO 55062 --- [ioEventLoop-4-1] c.c.gateway.config.ExampleConfiguration  : first pre filter
2018-10-14 12:08:52.406  INFO 55062 --- [ioEventLoop-4-1] c.c.gateway.config.ExampleConfiguration  : second pre filter
2018-10-14 12:08:52.407  INFO 55062 --- [ioEventLoop-4-1] c.c.gateway.config.ExampleConfiguration  : third pre filter
2018-10-14 12:08:52.437  INFO 55062 --- [ctor-http-nio-7] c.c.gateway.config.ExampleConfiguration  : first post filter
2018-10-14 12:08:52.438  INFO 55062 --- [ctor-http-nio-7] c.c.gateway.config.ExampleConfiguration  : second post filter
2018-10-14 12:08:52.438  INFO 55062 --- [ctor-http-nio-7] c.c.gateway.config.ExampleConfiguration  : third post filter
GlobalFilter에 로직이 많으면 이를 처리하기 위해 별도의 GlobalFilter를 작성하는 것이 좋습니다. 예를 들어, IP 액세스 제한을 구현하려고 합니다. IP가 화이트리스트에 없으면 통화가 허용되지 않습니다.

별도로 정의하려면 GlobalFilter와 Ordered 두 인터페이스만 구현하면 됩니다.

@Component
public class IPCheckFilter implements GlobalFilter, Ordered {

    @Override
    public int getOrder() {
        return 0;
    }

    @Override
    public Mono<void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        HttpHeaders headers = exchange.getRequest().getHeaders();
        // 此处写死了,演示用,实际中需要采取配置的方式
        if (getIp(headers).equals("127.0.0.1")) {
            ServerHttpResponse response = exchange.getResponse();
            ResponseData data = new ResponseData();
            data.setCode(401);
            data.setMessage("非法请求");
            byte[] datas = JsonUtils.toJson(data).getBytes(StandardCharsets.UTF_8);
            DataBuffer buffer = response.bufferFactory().wrap(datas);
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
            return response.writeWith(Mono.just(buffer));
        }
        return chain.filter(exchange);
    }

    // 这边从请求头中获取用户的实际IP,根据Nginx转发的请求头获取
    private String getIp(HttpHeaders headers) {
        return "127.0.0.1";
    }

}</void>
필터링의 사용은 말할 것도 없습니다. 비교적 간단하지만 매우 유용하고 위에서 언급한 IP 인증 차단은 빙산의 일각에 불과합니다. 더 많은 기능을 구현하려면 자체 필터링 장치가 필요합니다.

예를 들어 A/B 테스트를 하려면 라우팅 및 전달 수준에서 작업을 수행해야 합니다. 앞서 사진을 올렸는데, 사진에는 기본 글로벌 필터가 많이 있습니다. 그 중 하나는 LoadBalancerClientFilter입니다. loadBalancer를 통해 전달 서비스를 선택하는 라우팅 서비스의 로드 필터를 선택한 후 실행을 위해 다음 라우팅 NettyRoutingFilter 필터에 전달하면 이 메커니즘을 기반으로 구현할 수 있습니다.

다음 방법은 필터의 다음 필터로 데이터를 전달하는 데 사용됩니다:

exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);
구매자가 직접 가져옵니다:

URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);
원하는 경우 그렇다면 다음과 같이 할 수 있습니다:

@Component
public class DebugFilter implements GlobalFilter, Ordered {

    @Override
    public int getOrder() {
        return 10101;
    }

    @Override
    public Mono<void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        try {
            exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, new URI("http://192.168.31.245:8081/house/hello2"));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return chain.filter(exchange);
    }

}</void>
LoadBalancerClientFilter의 순서는 10100으로 여기보다 1이 크므로 실행 후 라우팅할 주소를 대체할 수 있습니다. .

위 내용은 Spring Cloud Gateway 글로벌 필터 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제