티스토리 뷰

-해당 실습은 아래의 글에서 이어집니다.

https://ggparkitbank.tistory.com/122

 

[MSA] Spring Cloud로 개발하는 MS 어플리케이션 ( Gateway Custom Filter) - 6 -

- 해당 글은 아래의 글에서 이어 집니다. https://ggparkitbank.tistory.com/121 [MSA] Spring Cloud로 개발하는 MS 어플리케이션 ( Gateway Filter) - 5 - https://ggparkitbank.tistory.com/120?category=101501..

ggparkitbank.tistory.com

 

자 이번에는 Global Filter라는 것을 알아볼건데요. Custom Filter와 굉장히 비슷한 구조를 가지고 있습니다. 

다만 적용되는 방식이 조금 다른데요. Custom Filter의 경우는 특정 서비스에서만 동작했던 것을 기억하시나요? yml파일

에서도 각 서비스마다 등록해줬던 것이 기억이 나실거에요. 

Global Filter는 이름과 같이 어떤 서비스로 접속해도 해당 Filter가 적용되도록 만드는 Filter에요

무슨 말인지 감이 잘 안잡히네요. 역시 이럴 때는 만들어 보는게 최고 인 것 같아요.

 

#Global Filter

저는 해당 위치에 만들었어요 :) 

 

코드를 아래와 같이 작성했어요. 저번 CustomFilter와 달라진 점만 빠르게 짚고 갈까요?

#GlobalFilter.java

package com.example.apigatewayservice;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

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

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

    }
}​

일단 특이하게 @Data를 사용해서 변수를 많이 지정해뒀네요. 추후에 yml파일을 작성하면 이 아이들이 어떻게 지정되는

값들인지 알수 있어요! 필터의 내용도 조금 바뀌었네요?

 log.info("Global Filter baseMessage: {}", config.getBaseMessage());
            if(config.isPreLogger()) {
                log.info("Global Filter Start: request id -> {}", request.getId());
            }
            return chain.filter(exchange).then(Mono.fromRunnable(()->{
                if(config.isPostlogger()){
                    log.info("Global Filter End: response code -> {}",response.getStatusCode());
                }
            }));

기존에는 없었던 config.getBaseMessage()... config클래스 내부의 BaseMessage를 가져오는 거겠죠?

마찬가지로 if문을 사용해서 pre인지 post인지 구별하도록 코드가 구성이 되어 있네요! 바로 yml파일을 수정해줄게요.

#application.yml

...

spring:
   application:
      name: apigateway-service
   cloud:
      gateway:
         default-filters:
            - name: GlobalFilter
              args:
                 baseMessage: Glabal Filter의 BaseMessage 에요!!
                 preLogger: true
                 postLogger : true
         routes:
            - id: fisrt-service
              uri: http://localhost:8081
              predicates:
                 - Path=/first-service/**
              filters:
#                 - AddRequestHeader=first-request, first-request-header2
#                 - AddResponseHeader=first-response, first-response-header2
                 - CustomFilter
                 
...

Global Filter는 기존 필터와 다르게 routes와 같은 dept에 작성이 돼요. 

default-filters를 통해서 Global Filter로 사용할 것을 지정해줘요. 그리고 Name은 당연히 Class이름이에요!

마지막으로 저희가 Config파일에 변수들이 어떻게 담기는지 의문이 들었던 분도 계실텐데 여기서 args를 통해서 

해당 Config파일에 정보들을 전달해줄거에요. 그럼 한번 결과를 확인해볼까요? Global Filter는 말그대로 어떤 서비스든

적용이 되기 때문에,  실행을 해보신 뒤에 아무 서비스에 접근해보세요! 

혹시 콘솔에 다음과 같이 출력이 되고있나요? 그렇다면 정말 잘하셨어요! 

Global Filter에서 보내는 BaseMessage와 ID값 그리고 상태코드가 Console에 출력이 된다면 문제없이 잘 된거에요 :)

다음 시간에는 Logging Filter에 대해서 포스팅을 진행하도록 할게요.  감사합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함