Netflix Zuul과 Service 연결하기

OH JU HYEON·2022년 7월 11일
1

MSA

목록 보기
2/7
post-thumbnail

Netflix Zuul과 Service 연결하기

시작

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해 왔다.

API Gateway란?

MSA에서 중요한 컴포넌트 중 하나이다. 클라이언트 요청에 대한 End Point를 통합하는 서버라고 보면 된다.

End Point가 여러 개 생기게 되면 변경에 대한 관리가 힘들기도 하고 클라이언트가 접근하는 것에 대한 문제도 생각해 봐야 한다.

때문에 MSA 환경에서 서비스의 도메인을 하나로 통합하는 API Gateway의 역할이 중요하다.

API Gateway의 장점 및 단점

API Gateway의 장점은 아래와 같다.

  • 마이크로 서비스로 분할되는 방식에서 서비스를 격리시킨다.
  • 각 클라이언트에 최적의 API를 제공한다.
  • API Gateway로 여러 서비스를 호출하는 로직을 통해 클라이언트를 단순화 할 수 있다.
  • 표준 API 프로토콜을 내부적으로 사용되는 프로토콜로 변환한다.

단점으로는 API Gateway를 통한 추가 Network hop에 인한 응답 시간 증가가 있다.

그래서 Zuul 이란?

Zuul은 Netflix에서 만든 API Gateway이다.

Netflix에서 만들어서 Spring 재단에 기부(?)했다고 들었다.

Zuul을 앞으로 많이 사용하게 될 지는 모르겠으나 앞으로 버전 지원을 안 한다는 것을 봤을 때 다른 API Gateway를 사용하지 않을까 싶다. 예를 들면 Spring cloud..정도가 떠오른다.

Zuul에 대해 더 알고 싶다면 오픈소스를 참고하자.

Service

first-service & second-service

Zuul에 연결될 서비스 두 개를 생성하고 셋팅해 줄 예정이다.

둘 다 설정하는 방법이 크게 다르지 않기 때문에 한 번에 체크하는 게 좋을 것 같다.

application.yml

server:
  port: 8081

spring:
  application:
    name: my-first-service

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

추후에 설정이 바뀔 수도 있다. 하지만 지금은 단순 Zuul과 연결하는 것이 목표이기 때문에 위 설정대로 진행한다. 여기서 각 서비스 별로 차이를 두어야 하는 지점은 portname 정도가 되겠다.

Controller.java

@RestController
@RequestMapping("/")
public class FirstServiceController {

    @GetMapping("/welcome")
    public String welcome() {
        return "Welcome to the First service.";
    }
}

화면을 띄워보기 위해 Controller를 만들어 주었다. 각 서비스 마다 달라야 하는 점은 Firstsecond로 바꿔주면 된다. End Point를 맞춰주었다.

이렇게 간단하게 각 서비스의 셋팅을 마쳤다.

이 상태로 서버를 돌려 각 포트로 접속해 welcome 경로에 들어가면 리턴 값이 표시가 된다.
하지만 포트를 다르게 들어가야 하는데 Zuul을 통해 이를 통합해 줄 것이다.

Zuul Service

의존성 추가

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

의존성을 추가한다. 위에서 체크한 것 처럼 Spring Boot의 버전을 꼭 확인해야 한다.

application.yml

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 뒤에 오는 모든 경로를 말하는 것이다.

ZullServiceApplication.java

@SpringBootApplication
@EnableZuulProxy
public class ZuulServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServiceApplication.class, args);
    }

}

@EnableZuulProxy를 등록해준다.

이제 모든 셋팅이 끝났다. 서버를 돌려보자

확인

port는 Zuul server의 port8000이다. 8081 8082포트를 넣지 않아도 Zuul에서 통합해 준 것을 확인할 수 있다.

이렇게 Zuul과 각 Service를 연결을 마무리한다.

profile
읽기만 해도 이해가 되는 글을 쓰기 위해 노력합니다.

0개의 댓글