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

docker 部署java

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

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

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

使用撰写的微服务定义

Docker 1.13引入了v3的Docker Compose 。 语法上的更改很小,但主要区别是添加了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

docker 部署java

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

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

相关文章

django settings 定义的变量不存在_使用Django部署机器学习模型(1)

介绍机器学习(ML)应用的需求正在不断增长。许多资料显示了如何训练ML算法。然而&#xff0c;ML算法分为两个阶段:训练阶段——在这个阶段&#xff0c;基于历史数据训练ML算法&#xff0c;推理阶段——ML算法被用于计算对未知结果的新数据的预测。商业利益就处于推理阶段&#x…

php系统函数区分大小写,php函数名区分大小写吗?

PHP对大小写敏感问题的处理比较乱&#xff0c;写代码时可能偶尔出问题&#xff0c;所以下面本篇文章就来总结一下。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。但我不是鼓励大家去用这些规则。推荐大家始终坚持“大小写敏感”&#x…

提取javadoc_使用JavaParser从源文件中提取JavaDoc文档

提取javadoc很多人正在使用JavaParser实现最不同的目标。 其中之一是提取文档。 在这篇简短的文章中&#xff0c;我们将看到如何打印与类或接口关联的所有JavaDoc注释。 可以在GitHub上找到代码&#xff1a; https : //github.com/ftomassetti/javadoc-extractor 获取类的所有…

python条形堆积图_python – 使用DataFrame.plot显示堆积条形图中...

您可以使用plt.text根据数据将信息放在位置. 但是,如果你有非常小的条形,可能需要一些调整才能看起来很完美. df_total df[Total Cost] df df.iloc[:, 0:4] df.plot(x Airport, kindbarh,stacked True, title Breakdown of Costs, mark_right True) df_rel df[df.column…

dmc matlab程序,matlab编的DMC程序.doc

matlab编的DMC程序clear all;% close all;%系统模型建立num[0.8];den[225 1];[a,b,c,d]tf2ss(num,den);% step(num,den);Ts30;lambda60;[ad,bd,cd,dd]c2dt(a,b,c,Ts,lambda);[numd,dend]ss2tf(ad,bd,cd,dd);[a,x]dstep(ad,bd,cd,dd);P10;M5;N50;%动态矩阵Afor i1:Pfor j1:Mif j…

mega2560单片机开发_[MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)

mega2560单片机开发通过介绍世界上最受欢迎的编程语言之一掌握Java编程概念 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的《 Ultimate Java Development and Certification Guide 》 仅售2…

MySQL使用规范_心得总结

文章目录命名规范数据库基本设计规范数据库字段设计规范索引设计规范常见索引列建议数据库开发规范数据库操作行为规范命名规范 1.所有数据库对象名称必须使用小写字母并用下划线分割 2.禁止使用 MySQL 保留关键字&#xff0c;如果表名中包含关键字查询时&#xff0c;需要使用…

java界面 文件选择器_掌握java技术 必备java工具应用知识

在现如今的互联网时代里&#xff0c;Java无疑是一种极为流行的开发语言&#xff0c;无论是程序界还是整个互联网行业势必带来很大的影响。不管是人才需求还是薪资水平上&#xff0c;Java的发展前景都是很乐观的。关于Java的一些常用的工具&#xff0c;也是需要我们不断去掌握和…

php制作404,利用thinkphp怎么制作一个404跳转页面

利用thinkphp怎么制作一个404跳转页面发布时间&#xff1a;2020-12-14 15:46:55来源&#xff1a;亿速云阅读&#xff1a;97作者&#xff1a;Leah本篇文章给大家分享的是有关利用thinkphp怎么制作一个404跳转页面&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家学习&am…

junit 验证日志输出_JUnit规则–引发异常时执行附加验证

junit 验证日志输出在本文中&#xff0c;我将快速向您展示如果您需要解决以下挑战&#xff0c;那么JUnit规则有多方便 一个方法可以捕获异常&#xff0c;并且必须在抛出或引发包装异常之前执行一些额外的任务。 调用额外任务和引发的异常应通过单元测试进行验证。 这意味着你…

禅道项目管理系统里面的「产品」与「项目」的区别和关系

产品与项目的区别和关系 产品主要是管理需求、计划和发布。一个产品可能分解成多个小项目&#xff0c;由一个或多个项目组去完成。 项目主要是管理任务开发需求。禅道里&#xff0c;项目对应的是敏捷开发里的迭代。项目可以看做产品的迭代管理&#xff0c;一个项目更新产品的…

triplet loss后面不收敛_你的神经网络真的收敛了么?

1、为什么小模型的作为backbone效果会差&#xff1f;在深度学习目标检测(图像分割)领域&#xff0c;我们发现当我们使用层数越深&#xff0c;并且在imagenet上表现越好的分类网络作为backbone时&#xff0c;它的检测和分割效果越好效果越好。比如我们使用resnet101作为backbone…

php文件上传漏洞waf,文件上传绕过WAF

文件上传文件上传实质上还是客户端的POST请求&#xff0c;消息主体是一些上传信息。前端上传页面需要指定enctype为multipart/from-data才能正常上传文件。此处不讲各种中间件解析漏洞只列举集几种safe_dog对脚本文件上传拦截的绕过靶机环境&#xff1a;win2003safe_dog4.0.239…

java性能监视_Java 9和应用程序性能监视的激动人心之处

java性能监视通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用&#xff01; 在当今的现代计算时代&#xff0c;软件创新的不断增强使我们更接近软件革命的时代。 也许在遥远的未来&#xff0c;这可能是对21世纪记忆…

Windows 系统如何查看本机的 IP 地址

查询本机外网IP地址 1.百度直接搜索“IP地址”&#xff0c;就可以看到了 2.输入命令curl -L tool.lu/ip 查询本机内网IP地址 1.控制面板-网络连接-查看属性 2.输入命令命令ipconfig或者ipconfig/all

C# 监控字段_有哪些好的C#开源项目推荐?

作者&#xff1a;码云 Gitee链接&#xff1a;https://www.zhihu.com/question/27993498/answer/1014561869

matlab 传输速率,处理速率转换 - MATLAB Simulink - MathWorks 中国

示例模型打开示例模型 rtwdemo_ratetrans。这种多速率、多任务模型包含几个在不同模式下运行的 Rate Transition 模块。open_system(rtwdemo_ratetrans);set_param(rtwdemo_ratetrans,SystemTargetFile,ert.tlc);set_param(rtwdemo_ratetrans,GenerateComments, Off);将 Rate T…

并行流 线程池_使用自定义线程池处理并行数据库流

并行流 线程池并行数据库流 在上一篇文章中 &#xff0c;我写了关于使用并行流和Speedment并行处理数据库内容的文章。 在许多情况下&#xff0c;并行流可能比通常的顺序数据库流快得多。 线程池 Speedment是一个开源的Stream ORM Java工具包和Runtime Java工具&#xff0c;它…

MySQL关于check约束无效的解决办法

首先看下面这段MySQL的操作&#xff0c;新建一个含有a和b的表&#xff0c;其中a用check约束必须大于0&#xff0c;然而插入了一条(-2,1,1)的数据&#xff0c;其中a-2&#xff0c;也是成功插入的。 所以MySQL只是check&#xff0c;但是不强制check。 mysql> create table c…

hibernate框架 最新_java框架,使用最频繁的9个程序!

Java在多年的发展历程中&#xff0c;已证明自己是为软件开发而生的顶级通用编程语言。Java 广泛用于科学和教育&#xff0c;金融&#xff0c;法律和政府等许多行业。Java 是开源和面向对象的&#xff0c;其开发目的是使应用程序开发人员可以编写一次然后在任何地方运行。编译后…