API Gateway에 대해서는 전에 한 번 작성했었다. 조금 더 풀어서 설명하면 Eureka Client의 주소를 Eureka Server에 등록하고 Client의 요청이 들어오면 Gateway를 통해 각 API를 호출하게 된다.
여기서 곁들이면 API Gateway Service에서 주기적으로 Eureka한테 API Gateway로 등록 및 해제 된 service들의 정보를 전달해주고(기본 값이 30초라고 한다.) API Gateway Service가 받은 정보를 기억하고 있다가 사용하는 시점에서 해당 service로 요청을 전달하게 된다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
Spring cloud에서 제공하는 gateway를 의존성 주입 받는다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Eureka client도 나중에 사용해야 하니 의존성 주입을 받는다.
server:
port: 8000
eureka:
client:
register-with-eureka: false
fetch-registry: false
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/**
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
Eureka 설정이나 Port 설정은 전에 체크한 글을 참고하면 되고, 이번에는 spring.cloud.gateway.routes
를 체크해 본다.
- id
를 통해 연결할 서비스를 등록해주고 uri
에 어디로 이동이 될 것인지 주소를 적어준다. predicates
는 조건절이라고 생각하면 되고 여기에 추가된 - Path
는 사용자가 입력했던 Path 정보가 uri에 붙게 된다.
조금 더 자세히 predicates
를 체크해 보면 이 항목에 작성하는 Path
정보는 대문자 P
로 시작하고 Path=경로
가 하나의 문자열처럼 구분되어 경로 데이터를 분리하고 검색하는데 사용된다.
위 코드를 참고로 예를 들면 http://localhost:8081/first-service/**
이런 식으로 주소가 붙게 된다.
서버를 작동시키면 tomcat
서버가 아닌 Netty
서버가 시작이 된다. 네티 서버는 비동기 서버이다.
@Slf4j
@RestController
@RequestMapping("/")
public class FirstServiceController {
@GetMapping("/welcome")
public String welcome() {
return "Welcome to the First service.";
}
서버를 돌리고 기존에 있던 위 경로로 들어가보면 404오류
가 뜬다. Path에서 작성한 경로와 맞지 않아서 그런데 Controller에 ReqeustMapping을 @RequestMapping("/first-service")
이렇게 잡아줘야 한다.
Gateway End Point : http://localhost:8081/first-service/welcome
@RequestMapping 수정 전 : http://localhost:8081/welcome
(작동 안 함)
@RequestMapping 수정 후 : http://localhost:8081/first-service/welcome
(작동 함)
이렇게 API Gateway service를 각 service와 연결하고 체크하면 된다.