Spring Cloud로 개발하는 마이크로서비스 애플리케이션_API Gateway Service_5

2023. 2. 20. 00:23·공부/Spring
반응형

 

 

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Spring Cloud Gateway - Custom Filter 적용

CustomFilter.java 생성

@Component
@Slf4j
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
    public CustomFilter() {
        super(Config.class);
    }

    @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 id -> {}", response.getStatusCode());
            }));
        };
    }

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

Mono 객체는 웹 플럭스라고 spring5에서 추가된 기능이다. 웹 서버 동기 방식이 아닌 비동기 방식에서 단일 값을 전달하기 위해 사용한다.

 

application.yml 필터 추가

          filters:
#            - AddRequestHeader=first-request, first-request-header2
#            - AddResponseHeader=first-response, first-response-header2
            - CustomFilter
// ....생략
          filters:
#            - AddRequestHeader=second-request, second-request-header2
#            - AddResponseHeader=second-response, second-response-header2
            - CustomFilter

기존에 적용했던 필터들을 주석처리 후 CustomFilter를 적용한다.

서버 종료 후 재시작한다.

 

check 메서드 추가

first-service의 FirstServiceController.java

@GetMapping("/check")
public String check() {
    return "Hi, there. This is a message from first Service";
}

 

second-service의 SecondServiceController.java

@GetMapping("/check")
public String check() {
    return "Hi, there. This is a message from second Service";
}

 

각 서버를 재시작한다.

크롬에서 확인한다.

 

apigateway-service 콘솔에 보면 filter가 잘 적용되어있는 걸 확인할 수 있다.

 

 

 

Spring Cloud Gateway - Global Filter

Custom Filter와 만드는 방식은 비슷하다. Custom Filter와의 차이점은 어떠한 Route 정보가 실행되더라도 공통적으로 적용할 수 있는 필터라는 점이다.

GlobalFilter는 어떤 Filter보다 먼저 실행되고, 또 제일 마지막에 실행된다. GlobalFilter와 CustomFilter 두 개 사용 시

  • GlobalFilter PRE
  • CustomFilter PRE
  • CustomFilter POST
  • GlobalFilter POST

순으로 로그가 출력 될 것이다.

 

GlobalFilter.java 생성

 

@Component
@Slf4j
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
    public GlobalFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        // Custom Pre Filter
        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 Start : request id -> {}", request.getId());
            }

            // Custom Post Filter
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                if(config.isPostLogger()) {
                    log.info("Global Filter End : response code -> {}", response.getStatusCode());
                }
            }));
        };
    }

    @Data
    public static class Config {
        private String baseMessage;
        private boolean preLogger;
        private boolean postLogger;
    }
}

 

 

application.yml 설정

 spring:
    cloud:
      gateway:
        default-filters:
          - name : GlobalFilter
            args :
              baseMessage : Spring Cloud Gateway Global Filter
              preLogger : true
              postLogger : true

위와 같은 설정 정보는 수정할 때마다 서비스를 재실행해야하는 부담이 있다. 만약 배포되고 있는 서비스라면 과정은 더 번거로울 것이다. 그래서 많은 MSA 환경에서는 이러한 설정 정보를 외부에 따로 분리해두어 서비스를 재실행, 재배포하지 않도록 한다. (추후 더 설명)

 

서버 재실행 후 크롬에서 확인

apigateway-service 프로젝트 콘솔 확인

 

 


- 출처 : 인프런 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/Spring' 카테고리의 다른 글
  • Spring Cloud로 개발하는 마이크로서비스 애플리케이션_API Gateway Service_7
  • Spring Cloud로 개발하는 마이크로서비스 애플리케이션_API Gateway Service_6
  • Spring Cloud로 개발하는 마이크로서비스 애플리케이션_API Gateway Service_4
  • Spring Cloud로 개발하는 마이크로서비스 애플리케이션_API Gateway Service_3
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JPA
    egov
    IT
    Spring
    SQL
    스프링부트
    react
    에러해결
    MSA
    알고리즘
    자바스크립트
    토비의스프링부트
    백준
    프로그래머스
    넥사크로
    QueryDSL
    전자정부프레임워크
    SpringBoot를 이용한 RESTful Web Service 개발
    RESTful
    springboot
    Java
    기출문제
    방통대
    oracle
    코딩테스트
    인프런
    토이프로젝트
    운영체제
    프론트엔드
    개발자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
Spring Cloud로 개발하는 마이크로서비스 애플리케이션_API Gateway Service_5
상단으로

티스토리툴바