4. SPRING CLOUD 기반 마이크로 서비스 활용
4.2 S PRING C LOUD 의 컴포넌트 활용
4.2.6 Polyglot Support – Sidecar
Spring Cloud 는 Spring 기반으로 작성된 애플리케이션만 동작이 가능하다. 비 JVM 애플리케이션(Python, Go, Ruby, C#, PHP 등 Java 이외의 언어로 작성된
애플리케이션)을 Spring Cloud 와 엮어서 동작하도록 하려면 Spring Cloud Sidecar 를 사용하면 가능하다.
위의 그림에서 non-JVM microservice 와 붙어있는 Sidecar 는 Java 로 작성된 스프링부트 애플리케이션이다. 마이크로서비스는 Eureka 에 등록을 하는 과정을 거쳐야만 Eureka 클라이언트로 인식해 접근이 가능하다.
비 JVM 애플리케이션의 경우 Sidecar 가 기동 시 비 JVM 애플리케이션의 동작여부를 체크한 후 Eureka 서버에 비 JVM 애플리케이션을 등록을 해준다.
Sidecar 는 주기적으로 상태를 체크하여 Eureka 서버에 알려준다.
non-JVM microservice 는 Sidecar 의 존재를 알지 못한다.
Zuul 을 통하여 Request 를 받을 수 있으며, Ribbon 을 통해 로드밸런스 기능이 작동하며, Config 서버로 환경설정을 할 수 있다.
4.2.6.1 Sidecar 작성
전자정부 표준프레임워크의 개발환경을 활용하여 Config 클라이언트 애플리케이션을 아래와 같이 생성한다. (v3.10 기준)
New > Project > Spring Boot > Spring Starter Project 를 선택 후 아래와 같이 입력한 후 Next 를 선택한다.
Service URL : https://start.spring.io Use default location : 체크 (기본 프로젝트 경로 변경을 원하면 해제 후 지정)
Type : Maven Packaging : Jar Java Version : 8 Language : Java
Group : egovframework.msa.sample Artifact : Sidecar
Version : 1.0.0
Description : MSA Sample Project
Group Id : egovframework.msa.sample
다음 단계는 프로젝트의 Dependency 를 추가하는 단계인데 여기서는 선택하지 않는다.
(이 가이드에서는 의존관계를 pom.xml 에 직접 등록하는 방법으로 진행한다.)
Next > Finish 또는 Finish 를 바로 선택하여 프로젝트를 생성한다
pom.xml 을 아래와 같이 설정한다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath />
</parent>
<groupId>egovframework.msa.sample</groupId>
<artifactId>Sidecar</artifactId>
<version>1.0.0</version>
<name>Sidecar</name>
<description>MSA Sample Project</description>
<properties>
<java.version>1.8</java.version>
<spring.cloud.version>2.2.5.RELEASE</spring.cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.2.6.2 SidecarApplication.java 작성
SidecarApplication 클래스에 @SpringBootApplication 과 @EnableSidecar 어노테이션을 추가한다. 이 어노테이션은 내부적으로 @EnableCircuitBreaker,
@EnableDiscoveryClient, 그리고 @EnableZuulProxy 를 포함하고 있다.
package egovframework.msa.sample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.sidecar.EnableSidecar;
@SpringBootApplication
@EnableSidecar
public class SidecarApplication {
public static void main(String[] args) {
SpringApplication.run(SidecarApplication.class, args);
} }
4.2.6.3 Sidecar 의 Application.yml 파일 작성
Sidecar 서버의 포트와 서버이름을 설정한다.
server:
port: 5678
spring:application:
name: sidecar-nonJVM
sidecar:port: 5000
health-uri: http://localhost:5000/health.json
hostname: localhost #sidecar와 비 JVM 애플리케이션은 동일 호스트에 있어야 함
4.2.6.4 비 JVM 애플리케이션에서 상태체크 Endpoint 작성
비 JVM 애플리케이션의 http://localhost:5000/health.json 을 요청하면, 비 JVM 애플리케이션에서 다음과 같은 상태를 반환하여 Sidecar 가 인식할 수 있도록 한다.
{
"status": "UP"
}
예를 들어, 다음과 같은 Python 애플리케이션을 개발한다고 가정하고,
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/") def home():
return "Hello, World!"
@app.route("/health.json") def health():
return jsonify({"status": "UP"}), 200 if __name__ == "__main__":
app.run(debug=True)
위 Python 으로 작성한 프로그램을 다음과 같이 실행한 후,
$ python app.py
아래와 같이 서비스 상태체크 요청을 하면 작동할 것이다.
$ curl -X GET http://127.0.0.1:5000/health.json
비 JVM 애플리케이션을 구동 (health-check 활성) 하고, Sidecar 애플리케이션을 실행하면, Eureka 서버에 아래와 같이 SIDECAR-NONJVM 이라는 애플리케이션이 등록된 것을 확인할 수 있다.