Sec.2 API Gateway Service

Jane Heo·2023년 9월 10일
0
post-thumbnail

마이크로서비스(first-service) 생성

  • controller
@Slf4j
@RestController
@RequestMapping("/first-service")
public class FirstServiceController {

  @GetMapping("/welcome")
  public String welcome(){
    return "welcome to the first service!";
  }

  @GetMapping("/message")
  public String message(@RequestHeader("first-request") String header) {
    log.info(header);
    return "Hello World in the first service.";
  }

}
  • application.yml
server:
    port: 8081

spring:
  application:
    name: my-first-service

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false


게이트웨이(apigateway-service) 생성

  • application.yml
server:
  port: 8000

eureka:
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://localhost:8761/eureka

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: first-service
          uri: http://localhost:8081
          predicates:
            - Path=/first-service/**
          filters:
            - AddRequestHeader=first-request, first-request-header2
            - AddResponseHeader=first-response, first-response-header2

필터에서 Request Header값을 "first-request-header2"로 주고 있어서 에러가 발생하지 않는다.

게이트웨이(apigateway-service)에 필터적용하기

1) Custom Filter

  • Custom Filter 생성
@Slf4j
@Component
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {

  @Override
  public GatewayFilter apply(Config config) {
    //Custom pre-filter
    return (exchange, chain) -> {
      ServerHttpRequest request = exchange.getRequest();
      ServerHttpResponse response = exchange.getResponse();

      log.info("Custom pre-filter: request id -> {}", request.getId());

      //Custom post-filter
      return chain.filter(exchange).then(Mono.fromRunnable(() -> {
        log.info("Custom post-filter: response status code -> {}", response.getStatusCode());
      }));

    };
  }

  public static class Config {
    //put the configuration properties
  }

  public CustomFilter(){
    super(Config.class);
  }
  
}
  • application.yml 파일에 CustomFilter 추가
spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: first-service
          uri: http://localhost:8081
          predicates:
            - Path=/first-service/**
          filters:
#            - AddRequestHeader=first-request, first-request-header2
#            - AddResponseHeader=first-response, first-response-header2
            - CustomFilter

2) Global Filter

  • Global Filter 생성
@Slf4j
@Component
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {

  @Override
  public GatewayFilter apply(GlobalFilter.Config config) {

    return (exchange, chain) -> {
      ServerHttpRequest request = exchange.getRequest();
      ServerHttpResponse response = exchange.getResponse();

      log.info("Global filter baseMessage: {}", config.getBaseMessage());

      if(config.isPreLogger())
        log.info("Global filter starts! request id -> {}", request.getId());

      return chain.filter(exchange).then(Mono.fromRunnable(() -> {
        if(config.isPostLogger())
          log.info("Global filter ends! response status code -> {}", response.getStatusCode());
      }));

    };
  }

  @Data
  public static class Config {
    //put the configuration properties
    String baseMessage;
    boolean preLogger;
    private boolean postLogger;
  }

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

}
  • application.yml 파일에 default-filters 추가
spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args: #Config클래스 properties
            baseMessage: Spring Cloud Gateway GlobalFilter
            preLogger: true
            postLogger: true
      routes:
        - id: first-service
          uri: http://localhost:8081
          predicates:
            - Path=/first-service/**
          filters:
#            - AddRequestHeader=first-request, first-request-header2
#            - AddResponseHeader=first-response, first-response-header2
            - CustomFilter

3) Logging Filter

  • Logging Filter 생성
@Slf4j
@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {

  @Override
  public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
      ServerHttpRequest request = exchange.getRequest();
      ServerHttpResponse response = exchange.getResponse();

      log.info("Logging filter: baseMessage -> {}", config.getBaseMessage());

      if(config.isPreLogger())
        log.info("Logging pre-filter: request uri -> {}", request.getURI());

      return chain.filter(exchange).then(Mono.fromRunnable(() -> {
        if(config.isPostLogger())
          log.info("Logging post-filter: response status code -> {}", response.getStatusCode());
      }));

    };
  }

  @Data
  public static class Config {
    //put the configuration properties
    String baseMessage;
    boolean preLogger;
    private boolean postLogger;
  }

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

}
  • application.yml 파일에 LoggingFilter 추가
spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args: #Config클래스 properties
            baseMessage: Spring Cloud Gateway GlobalFilter
            preLogger: true
            postLogger: true
      routes:
        - id: first-service
          uri: http://localhost:8081
          predicates:
            - Path=/first-service/**
          filters:
#            - AddRequestHeader=first-request, first-request-header2
#            - AddResponseHeader=first-response, first-response-header2
            - name: CustomFilter
            - name: LoggingFilter
              args:
                baseMessage: Hi there!
                preLogger: true
                postLogger: true

profile
2020.07.01~

0개의 댓글