개발/MSA

[MSA] Spring Cloud Gateway를 통해 서비스간 라우팅 해보기

개발 공부하는 태준 2024. 11. 30. 20:46

FirstService,SecondService

 

 

우선 프로젝트를 하나 생성해준다. FirstService와 SecondService를 생성했으며

dependency

 

의존성은 Lombok, Spring Web, Eureka Discovery Client를 추가해주었다.

 

여기서 각각의 기능은?

Lombok

: 자바 코드에서 반복적으로 작동되는 코드를 줄여주는 라이브러리

 

예를 들어 

 

1. Getter/Setter 자동생성: @Getter, @Setter 애노테이션을 사용해서 클래스 필드에 대해 자동으로 게터와 세터 메서드를 생성함

2. 생성자 자동 생성: @NoArgsConstructor, @AllArgsConstructor 등을 사용해서 다양한 형태의 생성자 자동으로 생성 가능

 

Spring Web

: 스프링 애플리케이션에서 웹 애플리케이션을 개발할 수 있도록 지원하는 모듈. 주로 REST API와 같은 웹 서비스 개발할 때 사용

 

주요 기능

 

1. Spring MVC: @Controller, @RestController 를 통해 HTTP 요청을 처리하고 응답을 반환하는 MVC 패턴 지원함.

2. RESTful 웹 서비스 : @GetMapping, @PostMapping , @PutMapping, @DeleteMapping 등의 애노테이션 사용해 HTTP 메서드와 매핑되는 메서드를 쉽게 정의 

 

Eureka Discovery Client

: 서비스 등록 및 검색을 가능하게 해주는 클라이언트이다. 마이크로서비스 아키텍처에서 개별 서비스가 중앙 레지스트리(Eureka 서버)에 등록하고 서로를 찾는데 사용된다.

 

주요 기능

 

1. 서비스 등록: 각 서버는 Eureka 서버에 자신의 정보를 등록. 이를 통해 Eureka 서버는 어떤 서비스가 실행 중인지 알 수 있음.

2. 서비스 검색: 클라이언트는 Eureka 서버를 통해 다른 서비스의 위치를 검색하고 이를 통해 동적으로 서비스 간 통신을 할 수 있음

3. 로드 밸런싱: Eureka는 여러 인스턴스가 등록된 경우 로드 밸런싱을 통해 요청을 분산시킬 수 있다.

 

 

 

 

Controller 는 First, Second Controller 둘다 위와 같이 작성해주었다. 

 

 

application.yml에 

 

application,yml

 

Spring.application.name

: 애플리케이션의 이름을 설정하는 것이다. 서비스의 식별자로 해당 서비스를 찾기위해 필수적으로 지정해줘야 한다.

 

다른 마이크로서비스가 이 서비스에 요청하려면 your-second-service라는  이름을 사용해서 호출할 수 있음.

 

Server.port

: 로컬에서 테스트를 진행하는 것이기 떄문에 first는 8081, second는 8082로 포트를 나누었다.

 

Eureka.client.register-with-eureka

: 애플리 케이션이 Eureka 서버에 등록할지 여부를 정하는 것이다.

우선은 Eureka에 등록하지 않고 Eureka와의 연동 없이 API Gateway의 라우팅 기능만 테스트하는 것이기 때문에 eureka에 관련된 설정은 모두 false로 해두었다. 

 

위처럼 first service, second service를 설정해두면 된다. 

 

우선 First Service나 Second Service의 HTTP 요청에 대해 각 포트에 대해서 정상적으로 응답을 하는지 확인해보겠다. 

 

HTTP 요청

HTTP 요청에 대해 정상적으로 작동하는 것을 확인할 수 있다. first-service는 마찬가지로 8081 port로 요청을 보내면 된다.

 


 

GatewayService

 

 

새로운 모듈을 하나 GatewayService로 생성해주고 의존성은 Lombok, Spring Web, Spring gateway로 설정해주었다.

 

 

또한 application.yml 

 

위와 같이 설정해주었다. 

 

여기서 Spring-gateway의존성의 기능은?

 

마이크로서비스 아키텍처에서 핵심 열할을 수행하는데, 주로 클라이언트 요청을 수신하고 적절한 백엔드 서비스로 전달하는 역할을 한다.

비동기 I/O를 지원해 높은 성능과 확장성을 제공한다.

 

쉽게 설명하면 어떤 큰 건물의 중앙 안내 데스크와 같은 역할이다. 클라이언트가 요청을 보낼 때, 이 안내 데스크가 요청을 받아 적절한 서비스로 전달하는 역할을 한다. 

 

 

아까 말했듯이 eurka 설정을 전부 false로 해두었기 때문에 서비스 경로를 직접 명시했다.

 

Eureka는 서비스 디스커버리 기능을 제공하는데 클라이언트가 특정 서비스의 URI를 직접 알 필요 없이 서비스 이름으로 찾을 수 잇도록 해준다.

 

하지만 Eureka를 현재는 사용하지 않으므로 서비스의 위치를 직접 명시하였다. 

 

server.port :

 

8000포트에서 Gateway 서버가 실행되도록 하였다. 즉 클라이언트는 이 포트를 통해 요청을 보낼 수 있다.

 

spring.cloud.gateway.routes : 

 

Spring Cloud Gateway에서 특정 경로에 대한 요청을 다른 서비스로 라우팅할 수 있도록 정의한다.

 

id: 고유식별자
uri:
http://localhost :8081로 라우팅 된다는 것이다.

predicates: /api/first-service/로 시작하는 모든 요청이 이 라우트로 매칭된다는 뜻이다. 

filters: /api/ 뒤의 내용을 재작성한다는 뜻인데 여기서 /api/first-service/test 로 들어온 요청을 /first-service/test 로 재작성 해준다. 여기서는 만약 /api/first-service/welcome 이면 /first-service/welcome으로 재작성 해준다는 뜻이다.

 

그러면 실행을 시켜서 제대로 라우팅이 되는지 확인해 보겠습니다.

 

 

Spring Cloud Gateway 설정을 통해 클라이언트 요청이 정상적으로 http://localhost:8081로 라우팅 되는것을 확인할 수 있습니다!