컨테이너, 마이크로서비스, NoSQL은 최신 애플리케이션을 구축하기 위한 멋진 3인방을 제공합니다. 이러한 애플리케이션은 민첩해야 하고, 끊임없이 진화하는 고객의 요구를 충족해야 하며, 널리 퍼져 있어야 하고, 모바일, 웹 및 IoT 플랫폼 전반에서 작동해야 합니다.
이 블로그에서는 다음을 사용하여 간단한 마이크로서비스 스택에 대해 설명합니다. 와일드플라이 군단, Docker및 카우치베이스. 이 블로그의 전체 코드와 지침은 에 문서화되어 있습니다: github.com/arun-gupta/wildfly-swarm-couchbase.
먼저 이 스택의 주요 구성 요소를 이해해 보겠습니다!
와일드플라이 군단 를 사용하면 JavaEE 애플리케이션을 다음과 같은 서버 런타임에 필요한 만큼만 패키징하여 실행할 수 있습니다.
java -jar
애플리케이션을 검색할 수 있습니다. 서비스 검색 기능이 내장되어 있습니다, 키클로크를 사용한 싱글 사인온, Hawkular를 사용한 모니터링등 다양한 기능을 갖춘 WildFly Swarm은 마이크로서비스를 개발하는 데 필요한 모든 구성 요소를 제공합니다.
Mac용 Docker 는 Mac OSX에서 Docker 컨테이너를 실행하기 위한 기본 지원을 제공합니다. 이는 다음을 기반으로 합니다. Hypervisor.framework
를 지원합니다. 도커 엔진은 알파인 리눅스 배포판에서 실행됩니다. xhyve
가상 머신을 관리할 수 있으며, 가상 머신도 Docker에서 관리합니다. Docker Machine이나 VirtualBox가 필요하지 않으며, OSX 보안 샌드박스 모델과 통합됩니다. DockerCon 2016에서는 Mac용 Docker의 비공개 베타 제한이 제거되어 이제 누구나 사용할 수 있습니다.
NoSQL 는 스키마가 없는 데이터베이스의 민첩성과 유연성을 제공합니다. 따라서 번거로운 데이터베이스 마이그레이션을 거치지 않고도 애플리케이션을 독립적으로 빠르게 발전시킬 수 있습니다. Couchbase는 다음을 통해 진정한 수평적 확장을 제공합니다. 동질적인 아키텍처확장 불가능한 마스터/슬레이브 아키텍처와는 대조적입니다. 또한 자동 샤딩을 제공합니다, JSON을 위한 SQL과 유사한 쿼리 언어 (N1QL), 모바일 데이터베이스 백엔드 서버와의 동기화 등 다양한 기능을 제공합니다. 이 블로그의 전체 샘플 애플리케이션은 여기에서 확인할 수 있습니다: github.com/arun-gupta/wildfly-swarm-couchbase.
WildFly 스웜 애플리케이션
Java EE REST 엔드포인트를 살펴보겠습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
패키지 com.카우치베이스.wildfly.swarm; . . . @경로("항공사") public 클래스 항공사 리소스 { @주입 데이터베이스 데이터베이스; @GET public 문자열 getAll() { N1qlQuery 쿼리 = N1qlQuery.simple("SELECT * FROM `travel-sample` LIMIT 10"); N1qlQueryResult 결과 = 데이터베이스.getBucket().쿼리(쿼리); 반환 결과.모든 행().toString(); } . . . } |
표준 JAX-RS 어노테이션을 사용하여 POJO를 REST 엔드포인트로 변환합니다. 카우치베이스 자바 API 는 유창한 API를 제공하고 N1QL 문을 사용하여 문서를 쿼리하고 결과를 반환합니다. N1QL 문은 쿼리 결과에서 처음 10개의 요소를 반환합니다. 이 문서에서 N1QL 구문에 대해 자세히 알아보세요. 대화형 튜토리얼. 데이터베이스 추상화는 다음과 같이 정의됩니다:
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 |
패키지 com.카우치베이스.wildfly.swarm; . . . @싱글톤 @시작 public 클래스 데이터베이스 { 카우치베이스클러스터 클러스터; 버킷 버킷; public 카우치베이스클러스터 getCluster() { 만약 (null == 클러스터) { 문자열 couchbaseURI = 시스템.getenv("couchbase_uri"); 만약 (null == couchbaseURI) { 시스템.err.println("WARING: COUCHBASE_URI가 지정되지 않았으며, 기본값은 localhost입니다."); couchbaseURI = "localhost:8093"; } 시스템.out.println("카우치베이스 엔드포인트: " + 시스템.getenv("couchbase_uri")); 클러스터 = 카우치베이스클러스터.create(couchbaseURI); } 반환 클러스터; } public 버킷 getBucket() { 만약 (null == 버킷) { 버킷 = getCluster().오픈버킷("travel-sample"); } 반환 버킷; } } |
이것은 열심히 초기화되는 싱글톤 EJB입니다. 이것은 카우치베이스 자바 SDK 를 클릭하여 Couchbase에 연결합니다. 데이터베이스 엔드포인트는 다음을 사용하여 지정할 수 있습니다. COUCHBASE_URI
환경 변수입니다. 다음은 pom.xml
와 와일드플라이 스웜을 구성하기 위한 카우치베이스 자바 클라이언트:
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 |
org.wildfly.swarm bom ${버전.wildfly-swarm} pom 가져오기 javax javaee-웹-api 7.0 제공 org.wildfly.swarm jaxrs-cdi org.wildfly.swarm ejb com.카우치베이스.클라이언트 자바-클라이언트 2.2.5 |
모든 종속성을 가져오기 위해 WildFly Swarm "자재 명세서"를 사용합니다. 빌드에 필요한 특정 종속성만 빌드에 필요한 종속성만 . 그런 다음 "뚱뚱한 항아리"에 패키징됩니다. 애플리케이션을 패키징하고 실행하는 데는 WildFly Swarm Maven 플러그인이 사용됩니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
org.wildfly.swarm wildfly-swarm-플러그인 ${버전.wildfly-swarm} 패키지 ${COUCHBASE_URI} |
COUCHBASE_URI
는 카우치베이스 데이터베이스 서버가 실행되고 있는 호스트를 읽는 데 사용됩니다.
카우치베이스 서버 실행
Mac용 Docker를 사용하여 Couchbase 서버를 실행합니다:
1 |
도커 실행 -d --이름 db -p 8091-8093:8091-8093 -p 11210:11210 arungupta/카우치베이스 |
그리고 아룽업타/카우치베이스
는 표준 카우치베이스 이미지 및 용도 Couchbase REST API 를 클릭해 서버를 구성합니다. 샘플 버킷이 JSON 문서로 채워질 때까지 몇 분 정도 기다립니다. 샘플 버킷에서 카우치베이스 CLI 도구 cbq 샘플 버킷에 기본 인덱스를 생성합니다:
1 |
도커 실행 -it --링크 db:db arungupta/카우치베이스 cbq -u 관리자 -p 비밀번호 -엔진 http://db:8093 -s "`여행 샘플`에 주 인덱스 `travel-sample-primary-index`를 생성합니다." |
출력은 다음과 같이 표시됩니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
연결됨 에 : http://db:8093/. 종료하려면 Ctrl-D 또는 QUIT를 입력합니다. 경로 에 역사 파일 에 대한 의 shell : /root/.cbq_역사 { "요청ID": "d0b2e4dd-b702-49e2-971c-a4c640ddb498", "서명": null, "결과": [ ], "status": "성공", "metrics": { "elapsedTime": "3.154540272s", "실행 시간": "3.154493281s", "resultCount": 0, "결과 크기": 0 } } |
이 출력은 인덱스 생성 결과가 성공했음을 보여줍니다. Mac용 Docker를 실행할 때의 장점 중 하나는 모든 컨테이너를 다음 위치에서 액세스할 수 있다는 것입니다. localhost
. 이는 다음을 의미합니다. 카우치베이스 웹 콘솔 에서 액세스할 수 있습니다. localhost:8091.
이 화면에서는 Couchbase가 올바르게 구성되었는지 확인합니다.
WildFly 스웜 마이크로서비스 실행
독립형 마이크로서비스를 패키징하고 실행합니다:
1 |
mvn wildfly-swarm:실행 |
Couchbase가 다른 호스트에서 실행 중인 경우 명령이 다음과 같이 변경됩니다:
1 |
mvn -DCOUCHBASE_URI= wildfly-swarm:실행 |
출력은 다음과 같이 표시됩니다:
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 |
[정보] 스캔 에 대한 프로젝트... [정보] [정보] ------------------------------------------------------------------------ [정보] 빌딩 nosql-마이크로서비스 1.0-스냅샷 [정보] ------------------------------------------------------------------------ [정보] . . . 2016-06-27 22:21:47,170 경고 [org.jboss.as.종속성.비공개] (MSC 서비스 스레드 1-6) WFLYSRV0018: 배포 "deployment.nosql-microservices.war" 는 사용 a 비공개 모듈 ("org.jboss.jts:main") 어느 may be 변경됨 또는 제거됨 in 미래 버전 없이 공지사항. 2016-06-27 22:21:47,203 정보 [org.jboss.용접.배포자] (MSC 서비스 스레드 1-1) WFLYWELD0003: 처리 용접 배포 nosql-마이크로서비스.전쟁 2016-06-27 22:21:47,542 정보 [org.최대 절전 모드.유효성 검사기.내부.활용.버전] (MSC 서비스 스레드 1-1) HV000001: 최대 절전 모드 유효성 검사기 5.2.3.최종 2016-06-27 22:21:47,600 정보 [org.jboss.as.ejb3.배포] (MSC 서비스 스레드 1-1) WFLYEJB0473: JNDI 바인딩 에 대한 세션 bean 명명된 '데이터베이스' in 배포 단위 '배포 "nosql-microservices.war"' 는 as 다음과 같습니다.: 자바:글로벌/nosql-마이크로서비스/데이터베이스!com.카우치베이스.wildfly.swarm.데이터베이스 자바:앱/nosql-마이크로서비스/데이터베이스!com.카우치베이스.wildfly.swarm.데이터베이스 자바:모듈/데이터베이스!com.카우치베이스.wildfly.swarm.데이터베이스 자바:글로벌/nosql-마이크로서비스/데이터베이스 자바:앱/nosql-마이크로서비스/데이터베이스 자바:모듈/데이터베이스 2016-06-27 22:21:47,731 정보 [org.jboss.용접.배포자] (MSC 서비스 스레드 1-3) WFLYWELD0006: 시작 서비스 에 대한 CDI 배포: nosql-마이크로서비스.전쟁 2016-06-27 22:21:47,758 정보 [org.jboss.용접.버전] (MSC 서비스 스레드 1-3) WELD-000900: 2.3.2 (최종) 2016-06-27 22:21:47,780 정보 [org.wildfly.확장.언더로우] (MSC 서비스 스레드 1-1) WFLYUT0018: 호스트 기본값-호스트 시작 2016-06-27 22:21:47,788 정보 [org.jboss.용접.배포자] (MSC 서비스 스레드 1-8) WFLYWELD0009: 시작 용접 서비스 에 대한 배포 nosql-마이크로서비스.전쟁 2016-06-27 22:21:48,180 정보 [stdout] (서버 서비스 스레드 Pool -- 10) 카우치베이스 엔드포인트: 2016-06-27 22:21:48,275 정보 [com.카우치베이스.클라이언트.핵심.카우치베이스코어] (서버 서비스 스레드 Pool -- 10) 카우치베이스 환경: {sslEnabled=false, ssl키스토어파일='null', ssl키스토어 비밀번호='null', 쿼리 사용=false, 쿼리포트=8093, 부트스트랩HttpEnabled=true, 부트스트랩 캐리어 활성화=true, 부트스트랩HttpDirectPort=8091, 부트스트랩HttpSslPort=18091, 부트스트랩 캐리어 다이렉트 포트=11210, 부트스트랩캐리어Ssl포트=11207, ioPoolSize=8, 계산풀사이즈=8, 응답 버퍼 크기=16384, 요청 버퍼 크기=16384, kv서비스엔드포인트=1, 뷰서비스엔드포인트=1, 쿼리 서비스 엔드포인트=1, 검색서비스 엔드포인트=1, ioPool=니오이벤트루프그룹, 핵심 스케줄러=코어 스케줄러, 이벤트버스=DefaultEventBus, 패키지 이름 및 버전=카우치베이스-jvm-핵심/1.2.5 (git: 1.2.5), dcpEnabled=false, 재시도 전략=최고의 노력, 최대 요청 수명=75000, 재시도 지연=지수 지연{growBy 1.0 마이크로세컨드, 힘 의 2; lower=100, upper=100000}, 재연결 지연=지수 지연{growBy 1.0 밀리세컨드, 힘 의 2; lower=32, upper=4096}, 관찰 간격 지연=지수 지연{growBy 1.0 마이크로세컨드, 힘 의 2; lower=10, upper=100000}, keepAliveInterval=30000, 자동 릴리스 후=2000, 버퍼 풀링 활성화=true, tcpNodelayEnabled=true, 변이 토큰 활성화=false, 소켓 연결 시간 초과=1000, dcpConnectionBufferSize=20971520, dcpConnectionBufferAckThreshold=0.2, 쿼리 타임아웃=75000, 뷰타임아웃=75000, kv타임아웃=2500, connectTimeout=5000, disconnectTimeout=25000, dnsSrvEnabled=false} 2016-06-27 22:21:48,829 정보 [com.카우치베이스.클라이언트.핵심.노드.노드] (cb-io-1-1) 연결됨 에 노드 localhost 2016-06-27 22:21:49,035 정보 [com.카우치베이스.클라이언트.핵심.구성.구성 공급자] (cb-계산-1) 열림 버킷 여행-샘플 2016-06-27 22:21:49,415 정보 [org.jboss.resteasy.resteasy_jaxrs.i18n] (서버 서비스 스레드 Pool -- 10) RESTEASY002225: 배포 javax.ws.rs.핵심.애플리케이션: 클래스 com.카우치베이스.wildfly.swarm.마이애플리케이션 2016-06-27 22:21:49,438 정보 [org.wildfly.확장.언더로우] (서버 서비스 스레드 Pool -- 10) WFLYUT0021: 등록됨 웹 컨텍스트: / 2016-06-27 22:21:49,457 정보 [org.jboss.as.서버] (메인) WFLYSRV0010: 배포됨 "nosql-microservices.war" (런타임-이름 : "nosql-microservices.war") |
이제 애플리케이션에 다음 계정으로 액세스할 수 있습니다:
1 |
curl http://로컬호스트:8080/웹리소스/항공사 |
형식이 지정된 출력은 다음과 같습니다:
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 |
[ { "travel-sample": { "country": "미국", "iata": "Q5", "콜사인": "MILE-AIR", "name": "40마일 에어", "icao": "MLA", "id": 10, "type": "항공사" } }, . . . { "travel-sample": { "country": "프랑스", "iata": "A5", "콜사인": "AIRLINAIR", "name": "Airlinair", "icao": "RLA", "id": 1203, "type": "항공사" } } ] |
따라서 Docker 컨테이너로 실행되는 Couchbase 데이터베이스에 액세스하는 WildFly Swarm을 사용하여 간단한 마이크로서비스를 구축했습니다. 이제 이상적으로는 이 WildFly Swarm 서비스를 Docker 이미지로 패키징한 다음 해당 Docker 이미지가 서비스 역할을 하도록 해야 합니다. 이름이 도커
에 이미 추가되어 있습니다. pom.xml
하지만 이슈 #3 이 시나리오를 실패하게 만들고 있습니다.