MSA에서 중요한 컴포넌트 중 하나인 API Gateway의 종류 중 하나인 Netflix Zuul을 사용했다. Netflix Zuul이 비동기 처리가 안 되기 때문에 지금은 잘 사용을 안 한다는 것 같다.
추가) Zuul 1.x 버전엔 비동기 처리가 지원하지 않았지만 2.x 버전으로 올라오면서 지원은 했으나 Spring의 각종 라이브러리와 호환성 문제가 있어서 Spring Cloud Gateway를 지원하게 되었다.
간단한(?) 주의사항이 있다. Spring Boot 2.4.X
버전까지만 지원이 되기 때문에 주의해야 한다.
여기서 추가로 더 언급하자면 최신 버전의 IntelliJ에서는 Spring Boot 2.4.x
버전의 생성을 지원하지 않기 때문에 따로 2.4.x
버전의 프로젝트를 가져와 빌드해 줘야 한다.
나는 그 대안으로 선생님의 Git Hub를 Fork해 왔다.
MSA에서 중요한 컴포넌트 중 하나이다. 클라이언트 요청에 대한 End Point를 통합하는 서버라고 보면 된다.
End Point가 여러 개 생기게 되면 변경에 대한 관리가 힘들기도 하고 클라이언트가 접근하는 것에 대한 문제도 생각해 봐야 한다.
때문에 MSA 환경에서 서비스의 도메인을 하나로 통합하는 API Gateway의 역할이 중요하다.
API Gateway의 장점은 아래와 같다.
단점으로는 API Gateway를 통한 추가 Network hop에 인한 응답 시간 증가가 있다.
Zuul은 Netflix에서 만든 API Gateway이다.
Netflix에서 만들어서 Spring 재단에 기부(?)했다고 들었다.
Zuul을 앞으로 많이 사용하게 될 지는 모르겠으나 앞으로 버전 지원을 안 한다는 것을 봤을 때 다른 API Gateway를 사용하지 않을까 싶다. 예를 들면 Spring cloud..정도가 떠오른다.
Zuul에 대해 더 알고 싶다면 오픈소스를 참고하자.
Zuul에 연결될 서비스 두 개를 생성하고 셋팅해 줄 예정이다.
둘 다 설정하는 방법이 크게 다르지 않기 때문에 한 번에 체크하는 게 좋을 것 같다.
server:
port: 8081
spring:
application:
name: my-first-service
eureka:
client:
register-with-eureka: false
fetch-registry: false
추후에 설정이 바뀔 수도 있다. 하지만 지금은 단순 Zuul과 연결하는 것이 목표이기 때문에 위 설정대로 진행한다. 여기서 각 서비스 별로 차이를 두어야 하는 지점은 port
와 name
정도가 되겠다.
@RestController
@RequestMapping("/")
public class FirstServiceController {
@GetMapping("/welcome")
public String welcome() {
return "Welcome to the First service.";
}
}
화면을 띄워보기 위해 Controller를 만들어 주었다. 각 서비스 마다 달라야 하는 점은 First
를 second
로 바꿔주면 된다. End Point를 맞춰주었다.
이렇게 간단하게 각 서비스의 셋팅을 마쳤다.
이 상태로 서버를 돌려 각 포트로 접속해 welcome
경로에 들어가면 리턴 값이 표시가 된다.
하지만 포트를 다르게 들어가야 하는데 Zuul을 통해 이를 통합해 줄 것이다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
의존성을 추가한다. 위에서 체크한 것 처럼 Spring Boot의 버전을 꼭 확인해야 한다.
server:
port: 8000
spring:
application:
name: my-zuul-service
zuul:
routes:
first-service:
path: /first-service/**
url: http://localhost:8081
second-service:
path: /second-service/**
url: http://localhost:8082
Zuul 서비스의 포트와 네임을 지정하고 연결할 서비스의 path와 url을 정해준다. 아까 위에서 각 service의 포트를 8081
8082
로 지정했는데 그것을 맞춰준다. path에서 뒤에 /**
는 /first-service
뒤에 오는 모든 경로를 말하는 것이다.
@SpringBootApplication
@EnableZuulProxy
public class ZuulServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServiceApplication.class, args);
}
}
@EnableZuulProxy
를 등록해준다.
이제 모든 셋팅이 끝났다. 서버를 돌려보자
port
는 Zuul server의 port
인 8000
이다. 8081
8082
포트를 넣지 않아도 Zuul에서 통합해 준 것을 확인할 수 있다.
이렇게 Zuul과 각 Service를 연결을 마무리한다.