Software/Spring Cloud

Spring Cloud Eureka&OpenFeign Docker로 구성하기

망고v 2024. 3. 27. 15:46

Kubernetes를 활용하다보니 Software를 활용한 환경 구성과의 차이점이 궁금하여 뒤늦게 Spring Cloud를 활용한 실행환경을 구성하게 되었다. 나중에 Kubernetes에 올릴 생각으로 Docker로 모든 서비스를 구성해보자.

 

전에는 Netflix의 Hystrix, Zuul, Eureka가 거의 표준처럼 자리 잡았던 것으로 기억하는데, Hystrix같은 경우 현재 더 이상 지원하지 않는다고 한다. 그 사이 또 많은 변화가 있었던 것 같다.

[참고] https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now

 

Eureka Server 구성

GitHub에서 아래 repository를 clone하여 몇 가지 수정을 통해 간단히 Local Docker로 서비스를 기동한다.

[참고] https://github.com/spring-cloud-samples/eureka

 

GitHub - spring-cloud-samples/eureka

Contribute to spring-cloud-samples/eureka development by creating an account on GitHub.

github.com

 

pom.xml의 baseImage만 JDK17로 올려서 띄워보자. docker-maven-plugin이 설정되어있어 개발도구(ex. IntelliJ)의 Build Tool(Maven)과 Docker만 제대로 설정되어있다면 쉽게 기동 가능하다. 

위 설정이 제대로 되어있다면 아래 화면 우측 선택된 Plugin(docker:build)를 실행하여 Docker Image를 생성한다. Image 생성 전, 실행 파일 준비를 위해 mvn package를 실행하여 jar 파일을 생성해두는 것을 잊지말자.

 

Local Docker환경에 Image가 생성되었다면 아래와 같이 설정을 한 후, Run을 실행한다. Local에서 붙기위해 Port(8761)를 기입해주었다. 

 

정상적으로 실행되었다면 Container에서 아래와 같이 Running 상태의 eureka가 확인 가능하다. 

 

Eureka 서비스 확인

위 화면의 Port 영역을 Click하면 아래와 같이 Eureka가 브라우저에 출력.

 

 

OpenFeign Sample 구성

Spring Cloud OpenFeign의 Sample인 아래 링크의 repository를 clone하여 서비스를 구성한다. repository는 Client와 Server로 이뤄져있는데, Server를 여러 대 띄워 정상적으로 Client에서 호출이 분산되는지 확인한다.

https://github.com/spring-cloud-samples/feign-eureka

 

GitHub - spring-cloud-samples/feign-eureka: Example of using feign with eureka

Example of using feign with eureka. Contribute to spring-cloud-samples/feign-eureka development by creating an account on GitHub.

github.com

 

Local Java환경으로 기동하는 것은 별 다른 수정 사항이 없어도 되는데, Container 환경에서 기동될 때 몇 가지 편의(?)를 위해 아래와 같이 수정을 하게 되었다. 

client[feign-eureka-hello-client] 수정

application.yml 파일의 defaultZone에 EUREKA.SERVER.IP를 추가하였다. Docker 환경에서 Container간 호출을 위해 localhost라고 지정된 부분을 변경. 향후 client 서비스 기동시 Environment variable(EUREKA.SERVER.IP=10.250.143.147)에 설정 추가가 필요하다.

eureka:
  client:
    serviceUrl:
      defaultZone: http://user:${eureka.password}@${EUREKA.SERVER.IP}:8761/eureka/

 

server[feign-eureka-hello-server] 수정

server도 동일하게 Eureka Server IP를 지정할 수 있게 하였으며, UnknownHostException 으로 고통받지 않기 위해 preferIpAddress(true) 설정을 추가하였다. (해당 설정 전에는 Eureka에 등록된 service의 hostname을 찾지 못하는 오류가 발생)

eureka:
  client:
    serviceUrl:
      defaultZone: http://user:${eureka.password}@${EUREKA.SERVER.IP}:8761/eureka/
  instance:
    preferIpAddress: true

[참고] https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-eureka-server.html#spring-cloud-eureka-server-prefer-ip-address

 

2. Service Discovery: Eureka Server

This section describes how to set up a Eureka server. 2.1 How to Include Eureka Server To include Eureka Server in your project, use the starter with a group ID of org.springframework.cloud and an artifact ID of spring-cloud-starter-netflix-eureka-server.

cloud.spring.io

 

그 외 공통

  1. 해당 repository에는 pom.xml build 영역에 docker-maven-plugin이 설정되어있지 않는데, eureka repository와 동일하게 편의를 위한 Plugin 추가를 해주었다.
  2. 그 외 Root의 pom.xml 에서는 java.version을 1.8에서 17로 변경

 

Docker Image 생성 및 Container 기동

위에 eureka Docker Image를 생성했던 절차와 같이 client와 server에 대해 각각 Image를 생성해준다. 

 

'client' Container의 경우 Local 브라우저에서의 접근을 위해 eureka와 동일하게 Port를 지정하였고, 그 외 설정은 큰 차이 없다. 'server' Container의 경우, 편의상 Container name에 구분을 위해 숫자를 추가로 붙이고 Port는 지정하지 않고 2대의 container를 기동했다.

 

정상적으로 기동되었다면 아래와 같이 Running 상태의 Container가 확인 가능하다.

 

 

서비스 확인

Eureka에 등록된 서비스는 아래와 같이 HelloClient 1대, HelloServer 2대로 출력된다.

 

http://localhost:7211/ 을 호출하면 Eureka에 등록된 HELLOSERVER 2개의 서비스로 아래와 같이 정상적으로 분산 호출되는 것을 확인할 수 있다.

 

결론

MSA 환경에서 내부 서비스간 호출 방식은 kubernetes의 service를 활용하여 간단히 구성할 수도 있다. 위와 같이 Spring Cloud를 활용하여 Application 영역에서도 가능하고. 각각의 장단점이 있을 수 있을 것 같은데, 우선 여기까지.