• 검색 결과가 없습니다.

Polyglot Support – Sidecar

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 이라는 애플리케이션이 등록된 것을 확인할 수 있다.