1. Gateway란?
서버 최앞단에 위치하여 모든 API 호출을 받는다. 받은 API 호출을 인증한 후, 적절한 서비스들에 메세지를 전달될 수 있도록 한다
기능 : 인증 및 권한부여, 서비스 검색 통합, 응답 캐싱, 속도 제한, 부하 분산, 로깅, 추적, 상관관계, IP 허용 목록에 추가 등
2. 프로젝트 생성
gateway-service [Lombok, Eureka Discovery Client, Gateway]
first-service [Lombok, Spring Web, Eureka Discovery Client]
second-service [Lombok, Spring Web, Eureka Discovery Client]
3. 예제
1. application.yml
// First-Service
server:
port: 8081
spring:
application:
name: my-first-service
eureka:
client:
fetch-registry: false
register-with-eureka: false
// Gateway-service
server:
port: 8000
eureka:
client:
// 유레카 서버에 자신을 등록하지 않음
register-with-eureka: false
// 유레카 서버로부터 다른 서비스의 레지스트리를 가져오지 않음
fetch-registry: false
// 유레카 서버 주소 지정, /eureka는 유레카 서버의 컨텍스트 경로
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
// 어플리케이션 이름 설정
name: apigateway-service
cloud:
gateway:
routes:
// 첫번째 라우트 설정
- id: first-service
// 첫번째 라우트가 전달할 서비스 주소
// first-service의 경우 localhost:8081/로 전달
uri: http://localhost:8081/
predicates:
// 요청 경로가 /first-service/**로 시작할 경우 이 라우트 사용
- Path=/first-service/**
filters:
// first-request라는 이름, first-request-header2 값을 가진 HTTP 요청 헤더 추가
- AddRequestHeader=first-request, first-request-header2
- AddResponseHeader=first-Response, first-Response-header2
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
filters:
- AddRequestHeader=second-request, second-request-header2
- AddResponseHeader=second-Response, second-Response-header2
2. controller
@RestController
@RequestMapping("/first-service")
@Slf4j
public class FirstServiceController {
@GetMapping("/welcome")
public String welcome() {
return "Welcome to the First Service.";
}
@GetMapping("/message")
public String Message(@RequestHeader("first-request") String header) {
log.info(header);
return "Hello World in First Service.";
}
}
4. 테스트
당연한 말이지만 Gateway-Service - application.yml에 routes 설정을 해제하면
Gateway-Service에서 First-Service, Second-Service의 정보를 받아 올 수 없다.
5. 유레카 확인
모두 true로 변경 뒤 유레카에서 확인해봤다.
6. Gateway와 Eureka의 차이
API Gateway
- 게이트웨이는 클라이언트와 서비스 간의 단일 진입점으로, 모든 클라이언트 요청이 먼저 게이트웨이를 통해서 전달됩니다.
Eureka (서비스 디스커버리)
- 유레카는 서비스의 위치를 자동으로 매칭해주는 서비스 디스커버리 서버입니다.
결론 :
게이트웨이는 클라이언트와 서비스 사이의 하나뿐인 문
유레카는 서비스의 위치(호스트, 포트 등)를 자동으로 매칭시켜주는 도구
7. Gateway와 Eureka의 차이
1. 유레카에서 API 주소를 등록한다
2. 유레카 -> 게이트웨이로 등록/해제된 서비스의 정보를 전달해준다(기본값 30초)
3. 게이트웨이가 정보를 기억하고 있다가 자신이 사용해야 될 시점에 해당 서비스로 요청을 전달함
'Java > Spring Boot' 카테고리의 다른 글
[MSA] Spring Cloud로 MSA를 개발해보자 5편 [Config] (0) | 2024.08.26 |
---|---|
[MSA] Spring Cloud로 MSA를 개발해보자 4편 [JWT 인증] (0) | 2024.08.25 |
[MSA] Spring Cloud로 MSA를 개발해보자 3편 [Gateway Service-2] (0) | 2024.08.16 |
[MSA] Spring Cloud로 MSA를 개발해보자 1편 [Service Discovery] (0) | 2024.08.11 |
[JPA] RESTful API를 만들어보자. (CRUD) (0) | 2023.11.20 |