使用Docker堆栈部署的微服务-WildFly,Java EE和Couchbase

关于微服务的资料很多,只是用谷歌搜索就可以了 ! 几年前,我在比利时的Devoxx上发表了有关将单片重构为微服务的演讲,它得到了很好的评价:

该博客将展示Docker如何简化微服务的创建和关闭。

该博客中使用的所有代码都在github.com/arun-gupta/couchbase-javaee上 。

使用撰写的微服务定义

Docker 1.13引入了Docker Compose v3 。 语法上的更改很小,但主要区别是添加了deploy属性。 此属性允许为容器指定副本,滚动更新和重新启动策略。

我们的微服务将使用预先部署的Java EE应用程序启动WldFly应用程序服务器。 该应用程序将与Couchbase数据库对话以获取CRUD应用程序数据。

这是Compose定义:

version: '3'
services:web:image: arungupta/couchbase-javaee:travelenvironment:- COUCHBASE_URI=dbports:- 8080:8080- 9990:9990depends_on:- dbdb:image: arungupta/couchbase:travelports:- 8091:8091- 8092:8092 - 8093:8093 - 11210:11210

在此撰写文件中:

  1. 此Compose中的两个服务由名称dbweb属性定义
  2. 使用image属性定义的每个服务的图像名称
  3. arungupta/couchbase:travel图像将启动Couchbase服务器,使用Couchbase REST API对其进行配置,并使用〜32k JSON文档加载travel-sample存储桶。
  4. arungupta/couchbase-javaee:travel映像启动WildFly并部署从https://github.com/arun-gupta/couchbase-javaee构建的应用程序WAR文件。 如果要构建自己的映像,请克隆该项目。
  5. envrionment属性定义了WildFly中部署的应用程序可访问的环境变量。 COUCHBASE_URI引用数据库服务。 在https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java所示的应用程序代码中使用了此代码。
  6. 端口转发是使用ports属性实现的
  7. Compose定义文件中的depends_on属性可确保容器启动顺序。 但是应用程序级别的启动需要通过容器内运行的应用程序来确保。 在我们的例子中,WildFly的启动速度非常快,但是要花几秒钟才能启动数据库。 这意味着WildFly中部署的Java EE应用程序无法与数据库进行通信。 这概述了构建微服务应用程序时的最佳实践:您必须进行防御性编码,并在应用程序初始化中确保依赖的微服务已启动,而无需假定启动顺序。 这显示在https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java的数据库初始化代码中。 它执行以下检查:

    1. 铲斗存在
    2. Couchbase的查询服务已启动并正在运行
    3. 样品桶已满载

可以在单个主机上使用docker-compose up -d命令启动该应用程序。 或使用docker stack deploy命令以群集模式运行的Docker引擎集群。

设置Docker Swarm模式

使用以下命令初始化Swarm模式:

docker swarm init

这将启动“群管理器”。 默认情况下,管理者节点也是工作者,但可以配置为仅管理者。

使用命令docker info命令查找有关此单节点集群的一些信息:

Containers: 0Running: 0Paused: 0Stopped: 0
Images: 17
Server Version: 1.13.0
Storage Driver: overlay2Backing Filesystem: extfsSupports d_type: trueNative Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlay
Swarm: activeNodeID: 92mydh0e09ba5hx3wtmcmvktzIs Manager: trueClusterID: v68ikyaff7rdxpaw1j0c9i60sManagers: 1Nodes: 1Orchestration:Task History Retention Limit: 5Raft:Snapshot Interval: 10000Number of Old Snapshots to Retain: 0Heartbeat Tick: 1Election Tick: 3Dispatcher:Heartbeat Period: 5 secondsCA Configuration:Expiry Duration: 3 monthsNode Address: 192.168.65.2Manager 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:seccompProfile: 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): trueFile Descriptors: 31Goroutines: 124System Time: 2017-01-27T08:25:58.032295342ZEventsListeners: 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个节点,即节点。

或者,可以使用Docker for AWS轻松设置多主机集群。

部署微服务

可以通过以下方式启动微服务:

docker stack deploy --compose-file=docker-compose.yml webapp

显示输出:

Creating network webapp_default
Creating service webapp_web
Creating service webapp_db

WildFly和Couchbase服务在此节点上启动。 每个服务都有一个容器。 如果在多个节点上启用了Swarm模式,则容器将分布在多个节点上。

创建一个新的覆盖网络。 这允许不同主机上的多个容器相互通信。
使用docker docker service ls验证WildFly和Couchbase服务是否正在运行:

ID            NAME        MODE        REPLICAS  IMAGE
a9pkiziw3vgw  webapp_db   replicated  1/1       arungupta/couchbase:travel
hr5s6ue54kwj  webapp_web  replicated  1/1       arungupta/couchbase-javaee:travel

可以使用docker service logs -f webapp_web查看该服务的docker service logs -f webapp_web

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 http://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 http://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家航空公司:

curl -v http://localhost:8080/airlines/resources/airline

结果显示为:

*   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"}}]

Docker for Java Developers研讨会是一个自定进度的动手实验,它使您可以轻松地开始使用Docker。

获取单个资源:

curl -v http://localhost:8080/airlines/resources/airline/137

创建一个新资源:

curl -v -H "Content-Type: application/json" -X POST -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","type":"airline"}' http://localhost:8080/airlines/resources/airline

更新资源:

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"}' http://localhost:8080/airlines/resources/airline/19810

删除资源:

curl -v -X DELETE http://localhost:8080/airlines/resources/airline/19810

每个命令的详细输出在github.com/arun-gupta/couchbase-javaee上 。

删除微服务

可以使用命令docker stack rm webapp删除微服务

Removing service webapp_web
Removing service webapp_db
Removing network webapp_default

想要开始使用Couchbase吗? 查看Couchbase入门套件 。

想更多地了解如何在容器中运行Couchbase?

  • 容器上的Couchbase
  • Couchbase论坛
  • Couchbase开发人员门户
  • @couchhasedev和@couchbase

翻译自: https://www.javacodegeeks.com/2017/02/microservice-using-docker-stack-deploy-wildfly-java-ee-couchbase.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于图像灰度的模板匹配

基于图像灰度的模板匹配 设模板图像T&#xff08;m*n&#xff09;&#xff0c;待匹配图像I&#xff08;M*N&#xff09;&#xff0c;两幅图像的原点都在左上角&#xff0c;这里有&#xff08;m<M&#xff0c;n<N&#xff09;。模板匹配的基本原理很简单&#xff1a;模板图…

学习activemq,在spring中activemq的配置信息

提供者&#xff1a; <?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:jms"http://www.springframewor…

pca各个向量之间的相关度_PCA主成分分析

降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征&#xff0c;去除噪声和不重要的特征&#xff0c;从而实现提升数据处理速度的目的。降维的算法有很多&#xff0c;比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA…

matlab 图像坐标系

matlab 图像中图像坐标系与plot、 imrotate坐标系的区别 图像坐标系是以图像左上角为原点&#xff0c;访问图像像素点img&#xff08;m&#xff0c;n&#xff09;&#xff0c;如下图所示&#xff1a; plot的坐标系&#xff0c;以图像左上角为原点&#xff0c;在图像中划线时&am…

matlab impyramid图像金字塔

B impyramid&#xff08;I, direction&#xff09; direction 可取‘reduce’或‘expand’&#xff0c;表示图像的宽度与高度缩小为原来的1/2与变大为原来的2倍

python你会吗_Python这些问题你会吗?

Python这些问题你会吗&#xff1f;final作用域的代码一定会被执行吗&#xff1f;正常的情况下&#xff0c;finally作用域的代码一定会被执行的&#xff0c;不管是否发生异常。哪怕是调用了sys.exit函数&#xff0c;finally也是会被执行的&#xff0c;那怎么样才能让finally代码…

perl大骆驼和小骆驼_你好骆驼:自动文件传输

perl大骆驼和小骆驼Apache Camel在其主页上 &#xff08;以及Camel用户指南中 &#xff09;将其描述为“基于已知企业集成模式的通用开源集成框架”。 Camel框架基于《 企业集成模式 》一书&#xff0c;并提供了该书中描述的模式的实现 。 我看一下这篇文章中使用Camel的“ Hel…

Django实战1-权限管理功能实现-01:搭建开发环境

1 项目开发环境 语言环境&#xff1a; python3.6.2 , django-2.1.2数据库环境&#xff1a;sqlite3(开发环境使用&#xff0c;部署环境使用mysql5.6)开发工具&#xff1a;pycharm2 安装python 说明&#xff1a;已经安装过python3.6环境的可以跳过此步。 python安装包下载地址&a…

matlab imhist灰度直方图

imhist()函数显示图像直方图要求图像是二维的灰度图像。 1.h imhist&#xff08;I&#xff09;:直接显示灰度图像I的直方图 2.h imhist(I,b):b是用来形成直方图的‘容器’的数目,默认256。 3.h imhist(X,map):显示索引图像的直方图&#xff0c;此直方图显示颜色映射图上色…

python语言程序设计计算机二级难不难_全国计算机二级的难度有多大?

计算机二级任选一科目考试及格即可获取计算机二级证书。自2019年3月考试起&#xff0c;二级语言类及数据库类科目(即除MS Office高级应用外的其他二级科目)调整获证条件为&#xff1a;总分达到60分且选择题得分达到50%及以上(即选择题得分要达到20分及以上)的考生方可取得合格证…

Jacobian 和Hessian矩阵

雅克比&#xff08;Jacobian matrix&#xff09;矩阵&#xff1a;目标函数f为一个函数向量&#xff0c;f(f1(x),f2(x),…fm(x))T&#xff0c;自变量x(x1,x2,…,xn)T&#xff1b;函数向量f对x求梯度&#xff0c;结果为一个矩阵&#xff1b;行数为f的维数&#xff1b;列数位x的维…

循环语句 for循环、while循环、do while循环

循环语句可以在满足循环条件的情况下&#xff0c;反复执行某一段代码&#xff0c;这段被重复执行的代码被称为循环体语句&#xff0c;当反复执行这个循环体时&#xff0c;需要在合适的时候把循环判断条件修改为false&#xff0c;从而结束循环&#xff0c;否则循环将一直执行下去…

获取按钮点击次数_无限次数使用,不会吧?不会吧?

就目前来说国内设计教程的网站虎课网还是很不错的里面的教程都很丰富但无奈的是普通用户每天只能学习一个课程想要学习多点就要充值而且会员只能开通年费对于只需偶尔学习一下的小伙伴来说可能太浪费了所以今天来大家分享一个超好用的浏览器插件官网看(适用平台&#xff1a;Chr…

现代化历险记:策略+将COBOL转换为Java的示例

在Keyhole Software&#xff0c;我们在很大程度上是一家现代化公司。 我们拥有一些顾问&#xff0c;他们专门研究将旧的代码迁移到新的&#xff0c;翻新的残旧代码库&#xff0c;并为大多数已经被供应商锁定的企业设计更光明的未来。 作为这些经验的有趣的副作用&#xff0c;我…

String类的特点和使用步骤

概述 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如 "abc" &#xff09;都可以被看作是实现此类的实例 类 String 中包括用于检查各个字符串的方法&#xff0c;比如用于比较字符串&#xff0c;搜索字符串&#xff0c;提取子字符串以及…

Ostu最大类间差方法

Ostu方法又名最大类间差方法&#xff0c;通过统计整个图像的直方图特性来实现全局阈值T的自动选取&#xff0c;其算法步骤为&#xff1a; 1) 先计算图像的直方图&#xff0c;即将图像所有的像素点按照0~255共256个bin&#xff0c;统计落在每个bin的像素点数量 2) 归一化直方图…

pads 文本不能修改_斜框检测经典网络(文本)- R2CNN

论文题目&#xff1a;R2CNN&#xff1a;Rotational Region CNN for Orientation Robust Scene Text Detection论文来源&#xff1a;2017CVPR论文地址&#xff1a;https://arxiv.org/abs/1706.09579论文代码&#xff1a;https://github.com/DetectionTeamUCAS/R2CNN_Faster-RCNN…

【题解】炮兵阵地

【题解】炮兵阵地 luogu 题解 暴力状压记录上一行和上上行信息&#xff0c;暴力判断是否存在不合法的阵地&#xff0c;暴力滚动数组&#xff0c;暴力统计&#xff0c;暴力转移即可。 看了yyb代码&#xff0c;我感觉我不曾写过代码... 加入说不要那么暴力也可以&#xff0c;可以…

matlab reshape矩阵维度变换

B reshape(A,m,n) 将矩阵A的元素返回到一个mn的矩阵B。如果A中没有mn个元素则返回一个错误。 B reshape(A,m,n,p,...) or B reshape(A,[m n p ...]) 把A中元素进行重塑成mnp…的矩阵&#xff0c;特别地&#xff0c;指定的维数mnp…的积必须与prod(size(A))相同。 …

使用Arquillian测试Spring Data + Spring Boot应用程序(第2部分)

在上一篇文章中 &#xff0c;我写了关于如何使用Arquillian Cube和 Docker一起测试Spring Data应用程序的信息。 测试看起来像&#xff1a; RunWith(SpringRunner.class) SpringBootTest(classes PingPongController.class, webEnvironment RANDOM_PORT) ContextConfigurati…