토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

스프링 클라우드 게이트웨이 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차


이 문서는 게이트웨이에 몇 가지 커스텀 컴포넌트를 작성하기 위한 기본 가이드다.


17.1. Writing Custom Route Predicate Factories

Route Predicate를 작성하려면 RoutePredicateFactory를 구현해야 한다. AbstractRoutePredicateFactory라는 추상 클래스를 상속해도 된다.

MyRoutePredicateFactory.java

public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<HeaderRoutePredicateFactory.Config> {

    public MyRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        // grab configuration from Config object
        return exchange -> {
            //grab the request
            ServerHttpRequest request = exchange.getRequest();
            //take information from the request to see if it
            //matches configuration.
            return matches(config, request);
        };
    }

    public static class Config {
        //Put the configuration properties for your filter here
    }

}

17.2. Writing Custom GatewayFilter Factories

GatewayFilter를 작성하려면 GatewayFilterFactory를 구현해야 한다. AbstractGatewayFilterFactory라는 추상 클래스를 상속해도 된다. 다음은 그 방법을 보여주는 예시다:

Example 72. PreGatewayFilterFactory.java

public class PreGatewayFilterFactory extends AbstractGatewayFilterFactory<PreGatewayFilterFactory.Config> {

    public PreGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        // grab configuration from Config object
        return (exchange, chain) -> {
            //If you want to build a "pre" filter you need to manipulate the
            //request before calling chain.filter
            ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
            //use builder to manipulate the request
            return chain.filter(exchange.mutate().request(builder.build()).build());
        };
    }

    public static class Config {
        //Put the configuration properties for your filter here
    }

}

PostGatewayFilterFactory.java

public class PostGatewayFilterFactory extends AbstractGatewayFilterFactory<PostGatewayFilterFactory.Config> {

    public PostGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        // grab configuration from Config object
        return (exchange, chain) -> {
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                ServerHttpResponse response = exchange.getResponse();
                //Manipulate the response in some way
            }));
        };
    }

    public static class Config {
        //Put the configuration properties for your filter here
    }

}

17.2.1. Naming Custom Filters And References In Configuration

커스텀 필터 클래스 이름은 GatewayFilterFactory로 끝나야 한다.

예를 들어서, 설정 파일에서 Something이란 필터를 참조하려면 SomethingGatewayFilterFactory라는 클래스 안에 필터가 있어야 한다.

class AnotherThing과 같이 이름에 GatewayFilterFactory suffix가 없는 게이트웨이 필터도 생성할 수는 있다. 설정 파일에선 AnotherThing으로 참조할 수 있다. 하지만 공식적으로 지원하는 네이밍 컨벤션은 아니다. 이 문법은 향후 릴리즈에서 제거될 수도 있다. 필터 이름은 컨벤션 규정을 준수하도록 업데이트해라.


17.3. Writing Custom Global Filters

커스텀 글로벌 필터를 작성하려면 GlobalFilter 인터페이스를 구현해야 한다. 이 필터는 모든 요청에 적용된다.

다음 예제에선 각각 글로벌 pre, post 필터를 설정하고 있다:

@Bean
public GlobalFilter customGlobalFilter() {
    return (exchange, chain) -> exchange.getPrincipal()
        .map(Principal::getName)
        .defaultIfEmpty("Default User")
        .map(userName -> {
          //adds header to proxied request
          exchange.getRequest().mutate().header("CUSTOM-REQUEST-HEADER", userName).build();
          return exchange;
        })
        .flatMap(chain::filter);
}

@Bean
public GlobalFilter customGlobalPostFilter() {
    return (exchange, chain) -> chain.filter(exchange)
        .then(Mono.just(exchange))
        .map(serverWebExchange -> {
          //adds header to response
          serverWebExchange.getResponse().getHeaders().set("CUSTOM-RESPONSE-HEADER",
              HttpStatus.OK.equals(serverWebExchange.getResponse().getStatusCode()) ? "It worked": "It did not work");
          return serverWebExchange;
        })
        .then();
}

전체 목차는 여기에 있습니다.

<< >>

TOP