[spring cloud gateway]edge sever 생성기

vector13·2022년 11월 20일
0

0 프로젝트 생성

참고 블로그

https://twofootdog.tistory.com/64

1 설정파일 세팅

gateway에서 각각 서비스들을 호출하게 될건데 지금은 local에서 진행할거기도 하고 차이를 위해서 ae_Springserver는 포트번호를 8081로 ae_communityServer는 포트번호를 8082 로 진행한다.

1-1 ae_Springserver, ae_communityServer 설정에서 포트 번호 변경해주기 (8081, 8082로)

1-2 Gateway 설정파일

Gateway는 2개의 마이크로서비스(ae_Springserver, ae_communityServer )를 라우팅 할 것이다.

server:
  port: 8080

spring:
  application:
    name: ae_GatewayServer
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args:
            baseMessage: Spring Cloud Gateway GlobalFilter
            preLogger: true
            postLogger: true
      routes:
        - id: ae_SpringServer
          uri: http://localhost:8081/
          predicates:
            - Path=/chaebbi/**
          filters:
            - name: ae_SpringFilter
              args:
                baseMessage: Spring Cloud Gateway ae_SpringServerFilter
                preLogger: true
                postLogger: true
        - id: ae_communityServer
          uri: http://localhost:8082/
          predicates:
            - Path=/community/**
          filters:
            - name: ae_communityFilter
              args:
                baseMessage: Spring Cloud Gateway ae_communityServerFilter
                preLogger: true
                postLogger: true

설명 :

  • server.port : gateway가 동작하는 포트번호 (8080)
  • spring.cloud.gateway.default-filters : Spring Cloud Gateway 공통 Filter (GlobalFilter)
  • spring.cloud.gateway.routes : 총 두 개의 마이크로서비스(ae_Springserver, ae_communityServer )를 라우팅
    • localhost:8080/{chaebbi}/** 주소로 서비스 유입되면 ae_Springserver 호출
    • localhost:8080/{community}/** 주소로 서비스 유입되면 ae_communityServer 호출
  • spring.cloud.gateway.routes.filters : 각 서비스들 호출 전 호출되는 필터(filter)

그리고 eureka 페이지에서 등록된 gateway 인스턴스 확인

각 서비스 api에 @RequestMapping("/{뭐시기}") 달기

1 ae_SpringServer

2 ae_CommunityServer

필터 구현

앞에서 GlobalFilter, ae_SpringFilter , ae_communityFilter를 호출하도록 선언해뒀으므로 각 Filter를 구현 (구성 똑같음. 필터를 거쳐서 가는거 확인 가능함)

  • GlobalFilter
    package com.ae.gateway;
    
    import lombok.Data;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
    import org.springframework.stereotype.Component;
    import reactor.core.publisher.Mono;
    
    @Component
    public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
        private static final Logger logger = LogManager.getLogger(GlobalFilter.class);
        public GlobalFilter() {
            super(Config.class);
        }
    
        @Override
        public GatewayFilter apply(Config config) {
            return ((exchange, chain) -> {
                logger.info("GlobalFilter baseMessage>>>>>>" + config.getBaseMessage());
                if (config.isPreLogger()) {
                    logger.info("GlobalFilter Start>>>>>>" + exchange.getRequest());
                }
                return chain.filter(exchange).then(Mono.fromRunnable(()->{
                    if (config.isPostLogger()) {
                        logger.info("GlobalFilter End>>>>>>" + exchange.getResponse());
                    }
                }));
            });
        }
    
        @Data
        public static class Config {
            private String baseMessage;
            private boolean preLogger;
            private boolean postLogger;
        }
    }
  • ae_SpringFilter
    package com.ae.gateway;
    
    import lombok.Data;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
    import org.springframework.stereotype.Component;
    import reactor.core.publisher.Mono;
    
    @Component
    public class ae_SpringFilter extends AbstractGatewayFilterFactory<ae_SpringFilter.Config> {
        private static final Logger logger = LogManager.getLogger(ae_SpringFilter.class);
        public ae_SpringFilter() {
            super(ae_SpringFilter.Config.class);
        }
    
        @Override
        public GatewayFilter apply(ae_SpringFilter.Config config) {
            return ((exchange, chain) -> {
                logger.info("ae_SpringFilter baseMessage>>>>>>" + config.getBaseMessage());
                if (config.isPreLogger()) {
                    logger.info("ae_SpringFilter Start>>>>>>" + exchange.getRequest());
                }
                return chain.filter(exchange).then(Mono.fromRunnable(()->{
                    if (config.isPostLogger()) {
                        logger.info("ae_SpringFilter End>>>>>>" + exchange.getResponse());
                    }
                }));
            });
        }
    
        @Data
        public static class Config {
            private String baseMessage;
            private boolean preLogger;
            private boolean postLogger;
        }
    }
  • ae_communityFilter
package com.ae.gateway;

import lombok.Data;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
public class ae_communityFilter extends AbstractGatewayFilterFactory<ae_communityFilter.Config> {
    private static final Logger logger = LogManager.getLogger(ae_communityFilter.class);
    public ae_communityFilter() {
        super(ae_communityFilter.Config.class);
    }

    @Override
    public GatewayFilter apply(ae_communityFilter.Config config) {
        return ((exchange, chain) -> {
            logger.info("ae_communityFilter baseMessage>>>>>>" + config.getBaseMessage());
            if (config.isPreLogger()) {
                logger.info("ae_communityFilter Start>>>>>>" + exchange.getRequest());
            }
            return chain.filter(exchange).then(Mono.fromRunnable(()->{
                if (config.isPostLogger()) {
                    logger.info("ae_communityFilter End>>>>>>" + exchange.getResponse());
                }
            }));
        });
    }

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

포스트맨 테스트 - 요청 잘받아와짐!

ae_SpringServer

Community 도 잘됨

profile
HelloWorld! 같은 실수를 반복하지 말기위해 적어두자..

0개의 댓글

관련 채용 정보