System Compleat.

고가용 서비스 - Spring Cloud - #5 Deploy your applications to the cloud / Cloud Foundry

Techs


(younjin.jeong@gmail.com, 정윤진) 

지금까지 이런저런 스프링 부트/스프링 클라우드에 대한 내용을 살펴보았는데, 사실 더 진행을 위해서는 또 다른 역할을 하는 마이크로 서비스를 만들어 내야 한다. 그런데 사실 로컬 랩탑에서 이런저런 마이크로 서비스들을 서로 다른 포트로 localhost 에서 돌리는것은 꽤나 귀찮은 일이 아닐수 없다. 그리고 아마 스프링 부트를 살펴보시는 분들이 하고계시는 고민중의 하나가 아마도 "어? WAS를 따로 안써도 된다고? 그럼 서비스는 어떻게 돌려?" 일 것이다. 물론 java -jar 의 방법이 아름답지만, 수십 수백기가의 메모리가 달려있는 서버에서 딸랑 저렇게 수행하는 것은 뭔가 맞지 않는 느낌적인 느낌이다. 그래서 docker 를 사용해서 올리거나 하는 방법을 사용할 수 있지만 뭐 요새 docker 는 하도 사방에서 이야기가 많으니까 나는 그걸 하지 않는 것으로 하고... 


이런 도구를 왜 굳이 설치해서 사용해야 하느냐? 클라우드 어쩌고 이런 말은 일단 빼고 간략히 설명하면, 

- 개발된 애플리케이션의 배포를 빠르게 수행하고 싶다. 

- 각각의 애플리케이션을 80/443 포트에서 구동할 필요가 있다. 

- 마이크로 서비스 구현 및 개발을 위해 필요한 애플리케이션 여러개를 동시에 동작해야 할 필요가 있다. 

- Redis, RabbitMQ, MySQL 의 리소스를 사용한 애플리케이션 개발을 해야 할 필요가 있다. (물론 다른 도구들도 리소스가 있다면 연결 가능하지만, 위의 세개 서비스를 즉각 할당 받아 사용할 수 있으므로.) 

- 로컬에서 docker 컨테이너를 여러개 돌렸을때 발생하는 의존성들에서 자유롭고 싶다. 


개발, 테스트 및 학습을 위해 오늘은 Cloud Foundry 를 소개한다. 회사에서 서버 레벨로 구동하지 않는 경우를 제외하고 개발자를 위한 환경을 소개하면 두가지 방법이 있는데, 하나는 PCFDEV 라고 불리는 로컬용 개발 버전을 사용하는 것과 다른 하나는 Pivotal Web Services 라고 불리는 환경을 60일 정도 무료로 제공받아 사용하는 방법이 있다. 로컬 버전을 설치하거나 PWS를 사용하거나 클라이언트 도구가 올라간 이후에 사용 방법은 동일하기 때문에 별 문제될 것은 없다. 다만 PWS를 사용하는 경우 백엔드 서비스의 선택폭이 다양하기 때문에 편리할 수 있다. 


Pivotal Web Services - 신용카드 등록 따위 없이 후리티어를 경험합시다! 

먼저 PWS 를 사용하는 방법은 간단하다. https://run.pivotal.io 의 도메인으로 접근한 뒤, 페이지의 안내에 따라 sign-up for free 버튼을 누르고 로그인 화면이 나오면 아래 "create account" 를 클릭해서 필요한 내용을 기입하면 된다. 

패스워드 복잡성 체크를 예쁘게 해준다. 그러면 Pivotal 로 부터 Verification 메일이 하나 온다. 메일은 요렇게 생겼다. 

이메일 안의 Verify your email address 를 클릭하면 아래와 같은 Free trial 등록 페이지로 넘어간다. 사용을 위해, SMS 를 선택하고 Korea, Republic of 를 선택한다. 그리고 제일 아래에는 모바일 번호를 넣어주면 된다. 그냥 한국 전화 번호 010-xxxx-xxxx 를 넣어도 정상적으로 문자 메세지가 수신 되는데, 만약 잘 안된다면 국가 번호를 더해서 넣어 보아도 된다. 

그러면 페이지가 넘어가면서 문자 메세지를 전화번호로 보냈으니 살펴서 코드를 입력하라 한다. 

개인정보 보호를 위해 선글라스를 씌웠더니 이미지에 검은색 배경이 생긴다능...  

화면이 넘어가면서 Org 라는걸 생성하라고 한다. 얘는 조직 이름인데, 블로그를 보고 따라 하시는 분들 께서는 거의 개인 목적의 사용일 테므로 원하는 이름을 주면 된다. 기본으로 주어지는 이름을 사용해도 되지만 아마 전체 계정에서 유일한 이름을 사용해야 할 필요가 있을지도 모르겠다. 아무튼 기억할건 이 이름이 너무 길면 나중에 타이핑이 좀 힘들 수 있으므로 간략하고도 유니크한 나만의 조직 이름을 선택하도록 하자. 

아울러 페이지의 오른쪽에 보면 어떤 서비스를 얼만큼 무료로 사용할 수 있는지 나온다. 프리 트라이얼 기간이 끝나면 청구되는거 아냐! 하고 겁내지 말자. 일단 신용카드 정보 기입과 같은 단계는 없다. 무료 사용 금액을 넘어가는 리소스는 쿼터로 제한되어 어차피 구동되지 않는다. 하지만 1년이 지나면 동작하던 서비스들이 중단될 수 있으므로 주의할 필요는 있겠다. 아울러 이 PWS 는 현재 미국 동부의 아마존 웹 서비스 위에서 기동되고 있으므로 속도가 찌끔 느리더라도 아 멀어서 그렇겠거니 하시면 된다. 

자, 이제 PWS 사용을 위한 준비가 모두 끝났다. 로컬 버전 설치를 원하지 않는 경우라면 다음의 pcfdev 부분을 건너 뛰고 보시면 되겠다.  


pcfdev - 누가 뭐래도 나는 로컬이 짱이야! / 우리 회사는 방화벽이 빡세거든! / 내가 만든 애플리케이션은 나만 봐야지! 

다음의 링크는 각각 pcfdev 를 로컬에 다운로드 받아 구동에 대한 설명이다. 그다지 어려울 것은 없고, 윈도우든 맥이던 Virtualbox 를 준비한 이후 pcfdev.io 또는 network.pivotal.io 에서 개발 버전을 다운로드 받을 수 있겠다. 물론 코드가 궁금하신 분은 오픈소스이므로 아래의 깃헙 링크를 참조하실 수도 있겠다. https://github.com/pivotal-cf/pcfdev 


윈도우용 설치 : https://docs.pivotal.io/pcf-dev/install-windows.html

OSX 용 설치 : https://docs.pivotal.io/pcf-dev/install-osx.html


pcfdev 를 사용하여 랩탑이나 데스크탑의 개발 환경에서 운용 하는 방법은 의외로 간단하다. cf dev start / cf dev stop 의 커맨드로 필요한 환경을 들었다 놓았다 할 수 있다. 시스템에 기본적으로 20기가 바이트 이상의 디스크 여유 공간과 8기가 바이트의 메모리가 탑재되어 있어야 하며, 사실 이클립스나 IntelliJ 같은 도구를 같이 틀어놓고 작업하려면 16기가바이트의 메모리를 가진 머신에서 사용하는 것을 권고 한다.  

위의 링크에 나온대로 살짝 따라하다 보면 어느새 내 랩탑에도 클라우드 파운더리가 뙇! 

Downloading VM...
Progress: |====================>| 100%
VM downloaded
Importing VM...
Starting VM...
Provisioning VM...
Waiting for services to start...
40 out of 40 running
 _______  _______  _______    ______   _______  __   __
|       ||       ||       |  |      | |       ||  | |  |
|    _  ||       ||    ___|  |  _    ||    ___||  |_|  |
|   |_| ||       ||   |___   | | |   ||   |___ |       |
|    ___||      _||    ___|  | |_|   ||    ___||       |
|   |    |     |_ |   |      |       ||   |___  |     |
|___|    |_______||___|      |______| |_______|  |___|
is now running.
To begin using PCF Dev, please run:
    cf login -a https://api.local.pcfdev.io --skip-ssl-validation
Admin user => Email: admin / Password: admin
Regular user => Email: user / Password: pass

메모리나 코어를 조금 더 할당하고 싶다면 -m 스위치와 -c 스위치를 사용하여 환경을 구동할 수 있다. 

$ cf dev start -m 8192 -c 4

환경이 필요 없다면 아래의 커맨드로 간단히 모든 환경을 종료 할 수 있다. 

cf dev stop 

PWS는 인터넷에 공개된 환경이고, 제한된 쿼터이긴 하지만 소규모로 프로덕션으로 사용할 수도 있기는 하다. 다만 실제 서비스에 유입되는 트래픽 규모가 커진다면 그때는 쿼터를 해제하거나 별도의 방법을 사용할 필요가 있다. 반대로 PCFDEV는 "개발"을 위한 환경이며 절대로 프로덕션용 서버에 배포해서 사용하는 일이 없도록 한다. 

두 도구의 차이는 아래의 이미지에서 살펴볼 수 있다. 

https://pivotal.io/pcf-dev


클라우드 파운더리는 기본적으로 꽤 많은 인스턴스를 만들어 낸다. 로컬이던 프로덕션용이건 간에 암튼 많다. 이게 왜 많냐면, 다음과 같은 것들을 개발자가 신경쓰지 않게 해 주기 때문이라고 생각하면 된다. 

- 동적 로드밸런싱, 도메인 라우팅 

- 헬스 모니터링

- 컨테이너 이미징 

- 로그 어그리게이션 

- 컨테이너 오케스트레이션

- 컨테이너 기동 

- MySQL, RabbitMQ, Redis 인스턴스 

- API 인증 

- 앞에서 소개한 Config server, Circuit breaker, Registry (유레카) 의 3개가 서비스로 이미 뙇! 

- 업로드된 빌드/아티팩트 저장, 보관 

- 기타 등등 오퍼레이션 잡무 


준비 됬다면? 고고고 

위의 도구들 중 하나가 준비 되었다면 cf 라는 클라이언트를 통해 애플리케이션의 배포가 가능하다. PWS를 사용하는 경우라면, 로그인 후 나오는 웹 인터페이스에서 왼쪽을 보면 "Tools" 탭이 있다. 클릭하면 각 운영체제에 맞는 클라우드 파운드리의 클라이언트 도구를 다운로드 받을 수 있다. cf 클라이언트가 준비 되었다면, 다음의 과정을 수행한다. 

PWS의 경우 : 

$ cf login -a https://api.run.pivotal.io 

pcfdev 의 경우 : 

$ cf login -a https://api.local.pcfdev.io --skip-ssl-validation
Email>  admin

Password>
인증 중...
확인

조직 선택(또는 Enter를 눌러 건너뜀):
1. pcfdev-org
2. system

Org> 1
대상 지정된 조직 pcfdev-org

대상 지정된 영역 pcfdev-space

로그인이 완료되면, 이제 다양한 cf 클라이언트를 사용할 수 있다. 먼저 cf apps 를 때려 보면 현재 조직의 "스페이스" 라고 불리는 환경에 동작하는 모든 애플리케이션 리스트를 보여준다. 아마 처음 PWS를 사용하거나 pcfdev 를 사용하면 아무런 애플리케이션이 보이지 않을 것이다. 

$ cf apps
yjeong@pivotal.io(으)로 yjeong-org 조직/development 영역의 앱 가져오는 중...
확인

앱을 찾을 수 없음


최근의 pcfdev 는 아래와 같은 웹 콘솔까지 제공한다.  https://console.local.pcfdev.io 로 접근하면 된다. 임의로 만든 SSL 인증서를 사용하므로 접근시 등장하는 경고는 무시해 주면 된다. 


자, 그럼 이제 이전 시리즈에 만들어 두었던 애플리케이션들을 구동해 보자. 

- Config-server

- Discovery-service

- Zipkin-service 

- helloworld-service 

- helloworld-client 

의 순서대로 푸시한다. 먼저 빌드하고, 

$ ./mvnw clean package

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building config-server 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
...
..
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.762 s
[INFO] Finished at: 2016-10-21T12:37:50+09:00
[INFO] Final Memory: 35M/278M
[INFO] ------------------------------------------------------------------------


push, 즉 배포를 수행한다. 

$ cf push config-server -p target/config-server-0.0.1-SNAPSHOT.jar

admin(으)로 pcfdev-org 조직/pcfdev-space 영역에 config-server 앱 작성 중...
확인

config-server.local.pcfdev.io 라우트 작성 중...
확인

config-server에 config-server.local.pcfdev.io 바인드 중...
확인

config-server 업로드 중...
업로드 중인 앱 파일 원본 위치: /var/folders/j0/vxfr0q8d2mx58xt27jx2dsd80000gn/T/unzipped-app841413472
38.1M, 185 파일 업로드
Done uploading
확인


admin(으)로 pcfdev-org 조직/pcfdev-space 영역에서 config-server 앱 시작 중...
Downloading dotnet_core_buildpack_beta...
Downloading python_buildpack...
Downloading binary_buildpack...
Downloading php_buildpack...
Downloading staticfile_buildpack...
Downloaded binary_buildpack (9.1K)
Downloading go_buildpack...
Downloaded staticfile_buildpack
Downloading java_buildpack...
Downloaded java_buildpack (246M)
Downloading ruby_buildpack...
Downloaded go_buildpack (320.8M)
Downloading nodejs_buildpack...
Downloaded dotnet_core_buildpack_beta (99.4M)
Downloaded python_buildpack (255.2M)
Downloaded nodejs_buildpack (96.7M)
Downloaded ruby_buildpack (261.5M)
Downloaded php_buildpack (274.9M)
Creating container
Successfully created container
Downloading app package...
Downloaded app package (33.9M)
Staging...
-----> Java Buildpack Version: v3.8.1 (offline) | https://github.com/cloudfoundry/java-buildpack.git#29c79f2
-----> Downloading Open Jdk JRE 1.8.0_91-unlimited-crypto from https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_91-unlimited-crypto.tar.gz (found in cache)
Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (0.8s)
-----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (found in cache)
Memory Settings: -Xms104169K -XX:MetaspaceSize=64M -Xmx104169K -XX:MaxMetaspaceSize=64M -Xss228K
-----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar (found in cache)
Exit status 0
Staging complete
Uploading droplet, build artifacts cache...
Uploading build artifacts cache...
Uploading droplet...
Uploaded build artifacts cache (108B)
Uploaded droplet (79.4M)
Uploading complete
Destroying container
Successfully destroyed container

0 / 1 인스턴스 실행 중, 1 시작 중
1 / 1 인스턴스 실행 중

앱 시작됨


확인

`CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-2.0.2_RELEASE -memorySizes=metaspace:64m..,stack:228k.. -memoryWeights=heap:65,metaspace:10,native:15,stack:10 -memoryInitials=heap:100%,metaspace:100% -stackThreads=300 -totMemory=$MEMORY_LIMIT) && JAVA_OPTS="-Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PWD/.java-buildpack/open_jdk_jre/bin/killjava.sh $CALCULATED_MEMORY" && SERVER_PORT=$PORT eval exec $PWD/.java-buildpack/open_jdk_jre/bin/java $JAVA_OPTS -cp $PWD/. org.springframework.boot.loader.JarLauncher` 명령을 사용하여 config-server 앱이 시작되었습니다.

admin(으)로 pcfdev-org 조직/pcfdev-space 영역에서 config-server 앱의 상태 표시 중...
확인

요청된 상태: started
인스턴스: 1/1
사용법: 256M x 1 인스턴스
URL: config-server.local.pcfdev.io
마지막으로 업로드함: Fri Oct 21 03:38:16 UTC 2016
스택: unknown
빌드팩: java-buildpack=v3.8.1-offline-https://github.com/cloudfoundry/java-buildpack.git#29c79f2 java-main open-jdk-like-jre=1.8.0_91-unlimited-crypto open-jdk-like-memory-calculator=2.0.2_RELEASE spring-auto-reconfiguration=1.10.0_RELEASE

상태 이후 CPU 메모리 디스크 세부사항
#0 실행 중 2016-10-21 12:39:07 PM 0.0% 185.2M / 256M 160.7M / 512M

배포후 정보를 보면 URL 부분에 배포된 애플리케이션이 어느 주소로 동작하고 있는지 나온다. config-server 를 배포해 보았으므로 정상적으로 동작하는지 확인해 보자. 

$ curl http://config-server.local.pcfdev.io/account-service/cloud | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 936 100 936 0 0 499 0 0:00:01 0:00:01 --:--:-- 498
{
"name": "account-service",
"profiles": [
"cloud"
],
"label": "master",
"version": "dc82fb551c53e86af22e064eedfb35678e98917e",
"propertySources": [
{
"name": "https://github.com/younjinjeong/demo-config/application.properties",
"source": {
"eureka.instance.hostname": "${vcap.application.uris[0]:localhost}",
"logging.level.com.netflix.discovery": "OFF",
"eureka.client.registryFetchIntervalSeconds": "5",
"spring.sleuth.sampler.percentage": "1.0",
"logging.level.com.netflix.eureka": "OFF",
"server.port": "${PORT:0}",
"endpoints.shutdown.enabled": "true",
"eureka.instance.leaseRenewalIntervalInSeconds": "3",
"eureka.instance.prefer-ip-address": "true",
"eureka.instance.metadataMap.instanceId": "${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${server.port}}}",
"info.id": "${spring.application.name}:${server.port}",
"eureka.client.region": "default",
"spring.jpa.generate-ddl": "true",
"spring.sleuth.log.json.enabled": "true"
}
}
]
}


pcfdev 또는 PWS 에 환경이 준비 되었다면, 이제 다음 포스팅에서 본격적으로 애플리케이션을 구동하고 데이터 소스와 연동하는 방법을 살펴 보겠다. 일단 어디든 올릴데가 생겨야 서킷 브레이커든 다른 스프링 클라우드 관련 리소스를 올려서 테스트 할 수 있을 듯. 오늘은 힘드니까 여기까지. 


(younjin.jeong@gmail.com, 정윤진)