본문 바로가기

Java

Spring Cloud Gateway 기본적인 사용 방법

Spring Cloud 는 기본적으로 Netty를 사용하는 비동기 방식의 웹서버를 지원합니다.

 

Spring Cloud는 기본적으로 yml을 통한 설정과 자바 코드를 통해 설정하는 두 가지 방식을 지원합니다.

이번에 알아볼 것은 yml을 통해 사용하는 방법입니다.

 

application.yml

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      default-filters:
      - name: AuthFilter
        args:
          preLogger: true
          postLogger: true
      routes:
        - id: test-server
          uri: http://localhost:8081/      # http://localhost:8081/ (이동될 주소)
          predicates:         # 해당 라우터의 조건 (사용자가 입력한 주소) /test-service/**로 들어오는 요청은 모두 test-service로 보낸다.
            - Path=/test-server/**
         filters: 
          	- AuthFilter

로 사용이 가능합니다.

 

글로벌 필터의 경우 아규먼트를 통해 필터에 지정된 값을 넘겨 줄 수 있습니다.

@Component
@Slf4j
public class AuthFilter extends AbstractGatewayFilterFactory<AuthFilter.Config> {

	public AuthFilter() {
		super(Config.class);
	}
	
	@Data
	public static class Config {
		private boolean preLogger;
		private boolean postLogger;
	}

	@Override
	public GatewayFilter apply(Config config) {

		return (exchange, chain) -> {
			ServerHttpRequest request = exchange.getRequest();
			ServerHttpResponse response = exchange.getResponse();
			
			log.info("Global Filter Start : request id -> {}", request.getId());
			if (config.isPreLogger()) {
				log.info("리스폰스 오기 전 로그");
			}

			// 리스폰스 받은 경우
			return chain.filter(exchange).then(Mono.fromRunnable(() -> {
				if (config.isPostLogger()) {
					log.info("Global Filter End : response code -> {}", response.getStatusCode());
				}
			}));
		};
	}
}

위와 같이 정상적으로 적용이 완료되었고 인자를 통해 값이 넘어 온 것을 확인 하실 수 있습니다.

 

만약 인증,인가 서버로 사용할 경우

response.setRawStatusCode(403);
return response.setComplete();

위 코드를 추가하여 리스폰스를 받지 않고 403 status를 리턴 할 수 있습니다.