[MSA] Spring Cloud로 MSA를 개발해보자 3편 [Gateway Service-2]

2024. 8. 16. 00:59· Java/Spring Boot
목차
  1. 1. CustomFilter
  2. 2.GlobalFilter
  3. 3. LoggingFilter
  4.  
  5. 4. Load Balancer
  6. 1). eureka 등록
  7. 2). routes uri 로드밸런서 설정
  8. 3). 랜덤포트 설정
  9. 4). 로드밸런스 테스트

1. CustomFilter

[gateWay-service] 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 code -> {}", response.getStatusCode());
            }));
        };
    }

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

}

 

[gateWay-service]  application.yml

server:
  port: 8000

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

spring:
  application:
    name: apigateway-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
        - id: second-service
          uri: http://localhost:8082/
          predicates:
            - Path=/second-service/**
          filters:
#            - AddRequestHeader=second-request, second-request-header2
#            - AddResponseHeader=second-Response, second-Response-header2
			- CustomFilter

 

[first-service] FirstServiceController.java

@GetMapping("/check")
    public String check(HttpServletRequest request) {
        log.info("Server port={}", request.getServerPort());
        return String.format("Hi, there. This is a message from First Service on PORT %s"
                , env.getProperty("local.server.port"));
    }

 

테스트 :

2.GlobalFilter

[gateWay-Service] 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;
    }

}

 

[gateWay-Service] application.yml

server:
  port: 8000

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

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      default-filters: // 추가
       - name: GlobalFilter
         args:
           baseMessage: Spring Cloud Gateway Global Filter
           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
        - id: second-service
          uri: http://localhost:8082/
          predicates:
            - Path=/second-service/**
          filters:
#            - AddRequestHeader=second-request, second-request-header2
#            - AddResponseHeader=second-Response, second-Response-header2
			- CustomFilter

테스트 :

3. LoggingFilter

[gateWay-Service] LoggingFilter.java

package com.example.apigateway_service.filter;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
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 LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
    public LoggingFilter() {
        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());
//                }
//            }));
//        };

        GatewayFilter filter = new OrderedGatewayFilter((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 id -> {}", request.getId());
            }
            // Custom Post Filter
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                if (config.isPostLogger()) {
                    log.info("Global POST Filter: response code -> {}", response.getStatusCode());
                }
            }));
        }, Ordered.LOWEST_PRECEDENCE);

        return filter;
    }

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

}

 

[gateWay-Service] application.yml

server:
  port: 8000

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

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      default-filters: // 추가
       - name: GlobalFilter
         args:
           baseMessage: Spring Cloud Gateway Global Filter
           preLogger: true
           postLogger: true
      routes:
        - id: first-service
          uri: http://localhost:8081/
          predicates:
            - Path=/first-service/**
          filters:
			- CustomFilter
        - id: second-service
          uri: http://localhost:8082/
          predicates:
            - Path=/second-service/**
          filters:
			- name: CustomFilter
            - name: LoggingFilter
              args:
                baseMessage: Hi, there.
                preLogger: true
                postLogger: true

 

테스트 : 

 

4. Load Balancer

 

1). eureka 등록

first-service, second-service -> application.yml

( first-service, second-service, gateWay-service false -> true 변경)

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

 

2). routes uri 로드밸런서 설정

[gateWay-service] application.yml

server:
  port: 8000

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

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args:
            baseMessage: Spring Cloud Gateway Global Filter
            preLogger: true
            postLogger: true
      routes:
        - id: first-service
         // first-service -> application.yml -> spring:application:name로 변경
          uri: lb://MY-FIRST-SERVICE
          predicates:
            - Path=/first-service/**
          filters:
            - CustomFilter
        - id: second-service
        // second-service -> application.yml -> spring:application:name로 변경
          uri: lb://MY-SECOND-SERVICE
          predicates:
            - Path=/second-service/**
          filters:
            - name: CustomFilter
            - name: LoggingFilter
              args:
                baseMessage: Hi, there.
                preLogger: true
                postLogger: true

 

3). 랜덤포트 설정

[first-service] application.yml

server:
  port: 0 // 0번이 랜덤포트

spring:
  application:
    name: my-first-service

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
  	// 이거 없으면 여러개 실행시켜도 1개로만 표시됨
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}

 

4). 로드밸런스 테스트

[1] first-service application.java 실행
[2] 터미널 : mvn spring-boot:run

 

 

포스트맨에서 실행 할 때마다 4432 포트와 4829 포트가 번갈아 가며 작동된다

'Java > Spring Boot' 카테고리의 다른 글

[MSA] Spring Cloud로 MSA를 개발해보자 5편 [Config]  (1) 2024.08.26
[MSA] Spring Cloud로 MSA를 개발해보자 4편 [JWT 인증]  (0) 2024.08.25
[MSA] Spring Cloud로 MSA를 개발해보자 2편 [Gateway Service]  (1) 2024.08.13
[MSA] Spring Cloud로 MSA를 개발해보자 1편 [Service Discovery]  (0) 2024.08.11
[JPA] RESTful API를 만들어보자. (CRUD)  (0) 2023.11.20
  1. 1. CustomFilter
  2. 2.GlobalFilter
  3. 3. LoggingFilter
  4.  
  5. 4. Load Balancer
  6. 1). eureka 등록
  7. 2). routes uri 로드밸런서 설정
  8. 3). 랜덤포트 설정
  9. 4). 로드밸런스 테스트
'Java/Spring Boot' 카테고리의 다른 글
  • [MSA] Spring Cloud로 MSA를 개발해보자 5편 [Config]
  • [MSA] Spring Cloud로 MSA를 개발해보자 4편 [JWT 인증]
  • [MSA] Spring Cloud로 MSA를 개발해보자 2편 [Gateway Service]
  • [MSA] Spring Cloud로 MSA를 개발해보자 1편 [Service Discovery]
누리는 귀여워
누리는 귀여워
안녕하세요, 누리 사료값을 벌기 위해 앞으로 나아가는 아버지의 개발 블로그입니다.
누리는 귀여워
누리아버지
누리는 귀여워
전체
오늘
어제
  • 분류 전체보기 (76)
    • Java (0)
      • Spring Boot (16)
      • JPA (1)
    • JavaScript (1)
      • React.js (1)
    • DataBase (3)
      • PostgreSQL (2)
    • DevOps (2)
      • MSA (1)
      • Docker (1)
    • OS (9)
    • Network (0)
    • CS 지식 (0)
    • Error 모음집 (0)
    • 코딩테스트 (32)
      • 기초 (31)
      • 알고리즘 (1)
    • 기타 (7)
    • 쉼터 (2)
      • 잡담 (2)
      • 하루 마무리 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • spring cloud
  • postgresql
  • 깃허브연동
  • git bash
  • postman
  • Oracle Cloud
  • eureka
  • spring boot
  • MSA
  • GATEWAY
  • centos
  • war 배포
  • kafka sink connect
  • Kafka
  • JPA
  • 인텔리제이
  • Docker
  • Boot
  • kafka connect
  • Dockerfile

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
누리는 귀여워
[MSA] Spring Cloud로 MSA를 개발해보자 3편 [Gateway Service-2]
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.