Spring/MSA

[스프링 MSA] MSA_S2 : API Gateway Service (2)

ajeong7038 2023. 11. 1. 16:39

 

`Spring Cloud로 개발하는 마이크로서비스 애플리케이션 (MSA)` 강의를 듣고 정리한 자료입니다

✨ Spring Cloud Gateway - Custom Filter

- JWT = Json Web Token

- ServerHttpRequest, ServerHttpResponse 활용

 

오류 발생 이유

1. 내부 클래스로 Config 존재 X

2. 구현시켜야 할 메소드 존재 X

메소드 구현 (apply)

@Override                                  
public GatewayFilter apply(Config config) {
    return null;                           
}
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;

- 가져올 때 reactive가 포함되어 있어야 한다

Mono 객체

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

 - Spring5에 추가되어 있는 기능

- 비동기 방식의 서버 지원 시 사용


✨ Spring Cloud Gateway - Global Filter

- 어떠한 라우터 정보가 실행된다 하더라도 공통적으로 시행되는 필터라는 점에서 Custom Filter과 차이점이 두드러진다.

    -> Custom Filter : 라우터에 개별적으로 등록해야함 (yml 파일에 개별적으로 지정)

- Global Filter : 일반 필터와 동일하게 만들지만 개별적이 아닌 공통적으로 등록됨

- Config에 환경 설정 정보 등록 가능 <- (application.yml 파일) : 전달하고자 하는 파라미터 등록

    -> baseMessage

    -> preLogger

    -> postLogger

Test

- 모든 필터의 가장 첫 번째에 시작되고, 가장 마지막에 종료

- ex_Global Filter Start -> Custom filter -> Global Filter End

- 외부 데이터를 가져와 Microservice가 갱신되지 않도록 작업도 가능하다


✨ Spring Cloud Gateway -  Custom Filter (Logging)

- AbstarctGatewayFilterFactory 상속

- apply 메소드 구현

- 순서 : Gateway Client -> Gateway Handler -> Global Filter -> Custom Filter -> Logging Filter -> Proxied Service (끝나면 역순)

    -> CustomFilter 밑에 Logging Filter 해둠 (application.yml)

- OrderedGatewayFilter filter 메소드 재정의

 

- Logging이 먼저 온 이유는?

    -> 필터의 우선순위를 변경했기 때문

        -> 1순위 실행 : Ordered.HIGHEST_PRECEDENCE

        -> 1순위 실행 : Ordered.LOWEST_PRECEDENCE


✨ Spring Clou Gateway - Load Balancer

Eureka 연동

1. Eureka Client 추가 (pom.xml, application.yml에 설정 정보 넣기)

-> lb://~ uri 변경 (네이밍 서버로 포워딩시켜준다)

2. Eureka Server - Service 등록 확인

두 개의 서비스 기동

1. VM Options -> -Dserver.port=[다른포트]

2. $mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'

-> 랜덤 포트인 경우 포트번호를 작성할 필요가 없다

-> mvn spring-boot:run

3. $mvn clean compile package

$ java -jar -Dserver.port=9004 ./target/user-servic-0.0.1-SNAPSHOT.jar

cmd 창에서 띄우기

1. 디렉토리 이동

2. dir: target 폴더 있는지 확인


✨ E-commerce 애플리케이션

애플리케이션 구성요소

1. Git Repository : 마이크로서비스 소스 관리 및 프로파일 관리

2. Config Server : Git 저장소에 등록된 프로파일 정보 및 설정 정보

3. Eureka Server : 마이크로서비스 등록 및 검색

4. API Gateway Server : 마이크로서비스 부하 분산 및 서비스 라우팅

5. Microservices : 회원 MS, 주문 MS, 상품(카테고리) MS

6. Queuing System : 마이크로서비스 간 메시지 발행 및 구독