마이크로서비스에 대한 많은 자료가 있습니다. 구글 잇! 몇 년 전 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 |
version: '3' services: web: image: arungupta/couchbase-javaee:travel environment: - COUCHBASE_URI=db ports: - 8080:8080 - 9990:9990 depends_on: - db db: image: arungupta/couchbase:travel ports: - 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 |
docker 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 |
Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 17 Server Version: 1.13.0 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Swarm: active NodeID: 92mydh0e09ba5hx3wtmcmvktz Is Manager: true ClusterID: v68ikyaff7rdxpaw1j0c9i60s Managers: 1 Nodes: 1 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000 Number of Old Snapshots to Retain: 0 Heartbeat Tick: 1 Election Tick: 3 Dispatcher: Heartbeat Period: 5 seconds CA Configuration: Expiry Duration: 3 months Node Address: 192.168.65.2 Manager Addresses: 192.168.65.2:2377 Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e runc version: 2f7393a47307a16f8cee44a37b262e8b81021e3e init version: 949e6fa Security Options: seccomp Profile: default Kernel Version: 4.9.5-moby Operating System: Alpine Linux v3.5 OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 1.952 GiB Name: moby ID: SGCM:KDRD:G3M7:PZHN:J4RL:VFFR:G2SR:EKD5:JV4J:RL3X:LF7T:XF6V Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): true File Descriptors: 31 Goroutines: 124 System Time: 2017-01-27T08:25:58.032295342Z EventsListeners: 1 No Proxy: *.local, 169.254/16 Username: arungupta Registry: https://index.docker.io/v1/ Experimental: true Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false |
이 클러스터에는 1개의 노드가 있으며 이 노드가 바로 매니저입니다. 또는 다음을 사용하여 멀티 호스트 클러스터를 쉽게 설정할 수 있습니다. AWS용 Docker.
마이크로서비스 배포
마이크로서비스는 다음 이름으로 시작할 수 있습니다:
|
1 |
docker stack deploy --compose-file=docker-compose.yml webapp |
출력 결과가 표시됩니다:
|
1 2 3 |
Creating network webapp_default Creating service webapp_web Creating service webapp_db |
다음을 사용하여 WildFly 및 Couchbase 서비스가 실행되고 있는지 확인합니다. 도커 서비스 ls:
|
1 2 3 |
ID NAME MODE REPLICAS IMAGE a9pkiziw3vgw webapp_db replicated 1/1 arungupta/couchbase:travel hr5s6ue54kwj webapp_web replicated 1/1 arungupta/couchbase-javaee:travel |
도커 서비스 로그 -f webapp_web:|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
webapp_web.1.wby0b04t7bap@moby | ========================================================================= webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JBoss Bootstrap Environment webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JBOSS_HOME: /opt/jboss/wildfly webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JAVA: /usr/lib/jvm/java/bin/java webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | ========================================================================= . . . webapp_web.1.wby0b04t7bap@moby | 23:14:15,811 INFO [org.jboss.as.server] (ServerService Thread Pool -- 34) WFLYSRV0010: Deployed "airlines.war" (runtime-name : "airlines.war") webapp_web.1.wby0b04t7bap@moby | 23:14:16,076 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on https://127.0.0.1:9990/management webapp_web.1.wby0b04t7bap@moby | 23:14:16,077 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on https://127.0.0.1:9990 webapp_web.1.wby0b04t7bap@moby | 23:14:16,077 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 98623ms - Started 443 of 691 services (404 services are lazy, passive or on-demand) |
마지막 로그 문이 표시될 때까지 기다리세요.
마이크로서비스 액세스
마이크로 서비스에서 10개의 항공사를 가져옵니다:
|
1 |
curl -v https://localhost:8080/airlines/resources/airline |
결과는 다음과 같이 표시됩니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
* Trying ::1... * Connected to localhost (::1) port 8080 (#0) > GET /airlines/resources/airline HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.43.0 > Accept: */* > < HTTP/1.1 200 OK < Connection: keep-alive < X-Powered-By: Undertow/1 < Server: WildFly/10 < Content-Type: application/octet-stream < Content-Length: 1402 < Date: Fri, 03 Feb 2017 17:02:45 GMT < * Connection #0 to host localhost left intact [{"travel-sample":{"country":"United States","iata":"Q5","callsign":"MILE-AIR","name":"40-Mile Air","icao":"MLA","id":10,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"TQ","callsign":"TXW","name":"Texas Wings","icao":"TXW","id":10123,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"A1","callsign":"atifly","name":"Atifly","icao":"A1F","id":10226,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":null,"callsign":null,"name":"Jc royal.britannica","icao":"JRB","id":10642,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"ZQ","callsign":"LOCAIR","name":"Locair","icao":"LOC","id":10748,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"K5","callsign":"SASQUATCH","name":"SeaPort Airlines","icao":"SQH","id":10765,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"KO","callsign":"ACE AIR","name":"Alaska Central Express","icao":"AER","id":109,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":"5W","callsign":"FLYSTAR","name":"Astraeus","icao":"AEU","id":112,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"UU","callsign":"REUNION","name":"Air Austral","icao":"REU","id":1191,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","id":1203,"type":"airline"}}] |
Java 개발자를 위한 도커 워크샵 는 자기 주도형 실습 실습으로, Docker를 쉽게 시작할 수 있도록 도와줍니다. 단일 리소스 받기:
|
1 |
curl -v https://localhost:8080/airlines/resources/airline/137 |
새 리소스를 만듭니다:
|
1 |
curl -v -H "Content-Type: application/json" -X POST -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","type":"airline"}' https://localhost:8080/airlines/resources/airline |
리소스를 업데이트합니다:
|
1 |
curl -v -H "Content-Type: application/json" -X PUT -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","type":"airline","id": "19810"}' https://localhost:8080/airlines/resources/airline/19810 |
리소스를 삭제합니다:
|
1 |
curl -v -X DELETE https://localhost:8080/airlines/resources/airline/19810 |
이러한 각 명령의 자세한 출력은 다음 링크에서 확인할 수 있습니다. github.com/arun-gupta/couchbase-javaee.
마이크로서비스 삭제
마이크로서비스는 다음 명령을 사용하여 제거할 수 있습니다. 도커 스택 RM 웹앱:
|
1 2 3 |
Removing service webapp_web Removing service webapp_db Removing network webapp_default |
Couchbase를 시작하고 싶으신가요? 다음을 살펴보세요. 카우치베이스 스타터 키트. 컨테이너에서 Couchbase를 실행하는 방법에 대해 자세히 알아보고 싶으신가요?