마이크로서비스에 대한 많은 자료가 있습니다. 구글 잇! 몇 년 전 Devoxx 벨기에에서 모놀리스를 마이크로서비스로 리팩토링하는 것에 대한 프레젠테이션을 했는데, 좋은 평가를 받았습니다:
이 블로그에서는 Docker가 마이크로서비스의 생성 및 종료를 간소화하는 방법을 보여드립니다. 이 블로그에서 사용된 모든 코드는 github.com/arun-gupta/couchbase-javaee.
Compose를 사용한 마이크로서비스 정의
도커 1.13은 도커 컴포즈 v3. 구문의 변경 사항은 미미하지만 주요 차이점은 다음을 추가한 것입니다. 배포 어트리뷰트. 이 속성을 사용하면 컨테이너에 대한 복제본, 롤링 업데이트 및 재시작 정책을 지정할 수 있습니다. 마이크로서비스는 Java EE 애플리케이션이 사전 배포된 WldFly 애플리케이션 서버를 시작합니다. 이 애플리케이션은 Couchbase 데이터베이스와 통신하여 애플리케이션 데이터를 CRUD합니다. 다음은 Compose 정의입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
버전: '3' 서비스: 웹: 이미지: arungupta/카우치베이스-javaee:여행 환경: - COUCHBASE_URI=db 포트: - 8080:8080 - 9990:9990 depends_on: - db db: 이미지: arungupta/카우치베이스:여행 포트: - 8091:8091 - 8092:8092 - 8093:8093 - 11210:11210 |
이 작성 파일에서:
- 이 컴포즈의 두 서비스는 다음과 같은 이름으로 정의됩니다.
db
그리고웹
속성 - 다음을 사용하여 정의된 각 서비스의 이미지 이름
이미지
속성 - 그리고
아룽업타/카우치베이스:여행
이미지가 카우치베이스 서버를 시작하고 다음을 사용하여 구성합니다. Couchbase REST API및 로드여행 샘플
버킷에 최대 32,000개의 JSON 문서가 있습니다. - 그리고
아룽업타/카우치베이스-자바예:여행
이미지가 WildFly를 시작하고 다음에서 빌드한 애플리케이션 WAR 파일을 배포합니다. https://github.com/arun-gupta/couchbase-javaee. 자신만의 이미지를 만들려면 해당 프로젝트를 복제하세요. 환경
속성은 WildFly에 배포된 애플리케이션에서 액세스할 수 있는 환경 변수를 정의합니다.COUCHBASE_URI
는 데이터베이스 서비스를 나타냅니다. 이는 애플리케이션 코드에서 다음과 같이 사용됩니다. https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java.- 포트 포워딩은 다음을 사용하여 수행됩니다.
포트
속성 -
depends_on
속성을 사용하면 컨테이너 시작 순서를 보장할 수 있습니다. 그러나 애플리케이션 수준 시작은 컨테이너 내부에서 실행되는 애플리케이션이 보장해야 합니다. 저희의 경우, WildFly는 다소 빠르게 시작되지만 데이터베이스가 시작되는 데는 몇 초가 걸립니다. 이는 WildFly에 배포된 Java EE 애플리케이션이 데이터베이스와 통신할 수 없음을 의미합니다. 따라서 마이크로 서비스 애플리케이션을 구축할 때는 시작 순서를 가정하지 않고 방어적으로 코딩하고 애플리케이션 초기화에서 의존하는 마이크로 서비스가 시작되었는지 확인해야 한다는 모범 사례를 설명합니다. 이는 다음 데이터베이스 초기화 코드에 나와 있습니다. https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java. 다음 검사를 수행합니다:- 버킷이 있음
- 카우치베이스의 쿼리 서비스가 실행 중입니다.
- 샘플 버킷이 완전히 로드되었습니다.
이 애플리케이션은 다음을 사용하여 시작할 수 있습니다. 도커-컴포지트 업 -d
명령을 실행할 수 있습니다. 또는 스웜 모드의 Docker 엔진 클러스터를 사용하여 도커 스택 배포
명령을 사용합니다.
도커 스웜 모드 설정
다음 명령을 사용하여 스웜 모드를 초기화합니다:
1 |
도커 swarm init |
도커 정보
명령을 사용합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
컨테이너: 0 실행 중: 0 일시 중지됨: 0 중지됨: 0 이미지: 17 서버 버전: 1.13.0 스토리지 드라이버: overlay2 후원 파일 시스템: extfs 지원 d_type: true 네이티브 오버레이 Diff: true 로깅 드라이버: json-파일 Cgroup 드라이버: cgroupfs 플러그인: 볼륨: local 네트워크: bridge 호스트 ipvlan 맥블란 null 오버레이 스웜: 활성 NodeID: 92MYDH0E09BA5HX3WTMCMVKTZ Is 관리자: true 클러스터ID: v68ikyaff7rdxpaw1j0c9i60s 관리자: 1 노드: 1 오케스트레이션: 작업 역사 리텐션 제한: 5 래프트: 스냅샷 간격: 10000 번호 의 Old 스냅샷 에 유지: 0 하트비트 Tick: 1 선거 Tick: 3 디스패처: 하트비트 기간: 5 초 CA 구성: 만료 기간: 3 개월 노드 주소: 192.168.65.2 관리자 주소: 192.168.65.2:2377 런타임: runc 기본값 런타임: runc Init 이진: 도커-init 컨테이너 버전: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e runc 버전: 2f7393a47307a16f8cee44a37b262e8b81021e3e init 버전: 949e6fa 보안 옵션: seccomp 프로필: 기본값 커널 버전: 4.9.5-moby 운영 시스템: 알파인 Linux v3.5 OSType: 리눅스 아키텍처: x86_64 CPU: 4 합계 메모리: 1.952 GiB 이름: moby ID: SGCM:KDRD:G3M7:PZHN:J4RL:VFFR:G2SR:EKD5:JV4J:RL3X:LF7T:XF6V Docker 루트 Dir: /var/lib/도커 Debug 모드 (클라이언트): false Debug 모드 (서버): true 파일 설명자: 31 고루틴: 124 시스템 시간: 2017-01-27T08:25:58.032295342Z 이벤트 리스너: 1 아니요 프록시: *.local, 169.254/16 사용자 이름: arungupta 레지스트리: https://index.docker.io/v1/ 실험적: true 안전하지 않음 레지스트리: 127.0.0.0/8 라이브 복원 활성화됨: false |
이 클러스터에는 1개의 노드가 있으며 이 노드가 바로 매니저입니다. 또는 다음을 사용하여 멀티 호스트 클러스터를 쉽게 설정할 수 있습니다. AWS용 Docker.
마이크로서비스 배포
마이크로서비스는 다음 이름으로 시작할 수 있습니다:
1 |
도커 스택 배포 --작성-파일=도커-작성.yml 웹앱 |
출력 결과가 표시됩니다:
1 2 3 |
만들기 네트워크 웹앱_기본값 만들기 서비스 웹앱_웹 만들기 서비스 웹앱_DB |
다음을 사용하여 WildFly 및 Couchbase 서비스가 실행되고 있는지 확인합니다. 도커 서비스 ls
:
1 2 3 |
ID 이름 모드 복제 이미지 a9pkiziw3vgw 웹앱_DB 복제 1/1 arungupta/카우치베이스:여행 HR5S6UE54KWJ 웹앱_웹 복제 1/1 arungupta/카우치베이스-javaee:여행 |
도커 서비스 로그 -f webapp_web
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
웹앱_웹.1.WBY0B04T7BAP@moby | ========================================================================= 웹앱_웹.1.WBY0B04T7BAP@moby | 웹앱_웹.1.WBY0B04T7BAP@moby | JBoss 부트스트랩 환경 웹앱_웹.1.WBY0B04T7BAP@moby | 웹앱_웹.1.WBY0B04T7BAP@moby | JBOSS_HOME: /opt/jboss/wildfly 웹앱_웹.1.WBY0B04T7BAP@moby | 웹앱_웹.1.WBY0B04T7BAP@moby | JAVA: /usr/lib/jvm/자바/bin/자바 웹앱_웹.1.WBY0B04T7BAP@moby | 웹앱_웹.1.WBY0B04T7BAP@moby | JAVA_OPTS: -서버 -Xms64m -Xmx512m -XX:메타스페이스 크기=96M -XX:최대 메타스페이스 크기=256m -Djava.net.preferIPv4Stack=true -Djboss.모듈.시스템.pkgs=org.jboss.바이트맨 -Djava.awt.헤드리스=true 웹앱_웹.1.WBY0B04T7BAP@moby | 웹앱_웹.1.WBY0B04T7BAP@moby | ========================================================================= . . . 웹앱_웹.1.WBY0B04T7BAP@moby | 23:14:15,811 정보 [org.jboss.as.서버] (서버 서비스 스레드 Pool -- 34) WFLYSRV0010: 배포됨 "airlines.war" (런타임-이름 : "airlines.war") 웹앱_웹.1.WBY0B04T7BAP@moby | 23:14:16,076 정보 [org.jboss.as] (컨트롤러 부팅 스레드) WFLYSRV0060: Http 관리 인터페이스 듣기 on http://127.0.0.1:9990/management 웹앱_웹.1.WBY0B04T7BAP@moby | 23:14:16,077 정보 [org.jboss.as] (컨트롤러 부팅 스레드) WFLYSRV0051: 관리자 콘솔 듣기 on http://127.0.0.1:9990 웹앱_웹.1.WBY0B04T7BAP@moby | 23:14:16,077 정보 [org.jboss.as] (컨트롤러 부팅 스레드) WFLYSRV0025: WildFly 전체 10.1.0.Final (WildFly 핵심 2.2.0.Final) 시작 in 98623ms - 시작됨 443 의 691 서비스 (404 서비스 는 게으른, 패시브 또는 on-수요) |
마지막 로그 문이 표시될 때까지 기다리세요.
마이크로서비스 액세스
마이크로 서비스에서 10개의 항공사를 가져옵니다:
1 |
curl -v http://localhost:8080/항공회사/리소스/항공회사 |
결과는 다음과 같이 표시됩니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
* 시도 중 ::1... * 연결됨 에 localhost (::1) 포트 8080 (#0) > GET /항공사/리소스/항공사 HTTP/1.1 > 호스트: localhost:8080 > 사용자-에이전트: curl/7.43.0 > 수락: */* > < HTTP/1.1 200 확인 < 연결: keep-살아있음 < X-전원-으로: 언더로우/1 < 서버: WildFly/10 < 콘텐츠-유형: 애플리케이션/옥텟-스트림 < 콘텐츠-길이: 1402 < 날짜: 금, 03 2월 2017 17:02:45 GMT < * 연결 로컬호스트를 호스트하는 #0은 그대로 유지됨 [{"travel-sample":{"country":"미국","iata":"Q5","콜사인":"MILE-AIR","name":"40마일 에어","icao":"MLA","id":10,"type":"항공사"}}, {"travel-sample":{"country":"미국","iata":"TQ","콜사인":"TXW","name":"텍사스 윙","icao":"TXW","id":10123,"type":"항공사"}}, {"travel-sample":{"country":"미국","iata":"A1","콜사인":"atifly","name":"Atifly","icao":"A1F","id":10226,"type":"항공사"}}, {"travel-sample":{"country":"영국","iata":null,"콜사인":null,"name":"Jc royal.britannica","icao":"JRB","id":10642,"type":"항공사"}}, {"travel-sample":{"country":"미국","iata":"ZQ","콜사인":"LOCAIR","name":"Locair","icao":"LOC","id":10748,"type":"항공사"}}, {"travel-sample":{"country":"미국","iata":"K5","콜사인":"SASQUATCH","name":"씨포트 항공","icao":"SQH","id":10765,"type":"항공사"}}, {"travel-sample":{"country":"미국","iata":"KO","콜사인":"ACE AIR","name":"알래스카 센트럴 익스프레스","icao":"AER","id":109,"type":"항공사"}}, {"travel-sample":{"country":"영국","iata":"5W","콜사인":"FLYSTAR","name":"아스트라에우스","icao":"AEU","id":112,"type":"항공사"}}, {"travel-sample":{"country":"프랑스","iata":"UU","콜사인":"REUNION","name":"Air Austral","icao":"REU","id":1191,"type":"항공사"}}, {"travel-sample":{"country":"프랑스","iata":"A5","콜사인":"AIRLINAIR","name":"Airlinair","icao":"RLA","id":1203,"type":"항공사"}}] |
Java 개발자를 위한 도커 워크샵 는 자기 주도형 실습 실습으로, Docker를 쉽게 시작할 수 있도록 도와줍니다. 단일 리소스 받기:
1 |
curl -v http://localhost:8080/항공/자원/항공/137 |
새 리소스를 만듭니다:
1 |
curl -v -H "콘텐츠 유형: 애플리케이션/json" -X POST -d '{"country":"프랑스","iata":"A5","콜사인":"AIRLINAIR","name":"Airlinair","icao":"RLA","type":"항공사"}' http://localhost:8080/항공회사/리소스/항공회사 |
리소스를 업데이트합니다:
1 |
curl -v -H "콘텐츠 유형: 애플리케이션/json" -X PUT -d '{"country":"프랑스","iata":"A5","콜사인":"AIRLINAIR","name":"에어린 에어","icao":"RLA","type":"항공사","id": "19810"}' http://localhost:8080/항공/자원/항공/19810 |
리소스를 삭제합니다:
1 |
curl -v -X 삭제 http://localhost:8080/항공/자원/항공/19810 |
이러한 각 명령의 자세한 출력은 다음 링크에서 확인할 수 있습니다. github.com/arun-gupta/couchbase-javaee.
마이크로서비스 삭제
마이크로서비스는 다음 명령을 사용하여 제거할 수 있습니다. 도커 스택 RM 웹앱
:
1 2 3 |
제거 서비스 웹앱_웹 제거 서비스 웹앱_DB 제거 네트워크 웹앱_기본값 |
Couchbase를 시작하고 싶으신가요? 다음을 살펴보세요. 카우치베이스 스타터 키트. 컨테이너에서 Couchbase를 실행하는 방법에 대해 자세히 알아보고 싶으신가요?