5分钟部署一个Hello World Servlet到CloudFoundry

举报
Jerry Wang 发表于 2021/10/31 13:58:27 2021/10/31
【摘要】 首先从我的Github下载我写好的hello world Servlet到本地。安装Maven,然后执行命令行mvn clean install,确保build成功,在项目根目录的target文件夹内生成了demo.war。将demo.war放到本地tomcat的webapps文件夹下面。启动本地tomcat,确保该servlet本地工作成功。然后切换回项目根目录,执行cf push部署到您...
  1. 首先从我的Github下载我写好的hello world Servlet到本地。
    安装Maven,然后执行命令行mvn clean install,确保build成功,在项目根目录的target文件夹内生成了demo.war。

  2. 将demo.war放到本地tomcat的webapps文件夹下面。启动本地tomcat,确保该servlet本地工作成功。


然后切换回项目根目录,执行cf push部署到您的CloudFoundry上。
manifest.yml我已经编辑好了,内容如下:


部署完毕后,在浏览器访问部署在CloudFoundry上的Servlet:

Netweaver和CloudFoundry是如何运行Web应用的?

Netweaver

在Jerry的微信公众号文章SAP Fiori应用的三种部署方式里提到SAP Fiori应用以BSP应用的方式部署在ABAP Front-End Server上。那么这些BSP应用在运行时为什么能够接受和发送HTTP请求呢?

主要是下图的Internet Communication Manager(ICM)在起作用。

SAP help:

The Internet Communication Manager ensures that communication between the SAP System (SAP NetWeaver Application Server) and the outside world via HTTP, HTTPS and SMTP protocols works properly.

The ICM is a component of the SAP NetWeaver Application Server. It is implemented as a separate process, which is started and monitored by the ABAP dispatcher.

即ICM作为沟通的桥梁,确保Netweaver应用服务器和外界能够通过HTTP,HTTPS等协议交互。ICM是Netweaver应用服务器的一个组件,作为一个单独的工作进程,由ABAP dispatcher启动并监控。

ICM的架构:

  1. ICM本身维护了一个工作线程池。有一个专属的控制线程,负责接收进来的TCP/IP请求,然后从线程池中唤醒一个工作线程来响应该请求。
  2. 每个工作线程包含一个I/O处理器,负责网络输入输出。工作线程通过各种各样的plugin处理HTTP,SMTP等协议。

CloudFoundry

假设我本地开发了一个Java Web应用,里面包含一个Servlet,部署到CloudFoundry后,该应用如何运行起来的?
细心观察cf push的日志,不难自己找出答案。
因为我的manifest.yml里定义的buildpack为java_buildpack:

这对应了cf push日志里高亮的这一行:

下载Open JDK JRE和Tomcat instance。

为什么会自动下载tomcat?
打开java_buildpac的github仓库:
https://github.com/cloudfoundry/java-buildpack
上面提到了原因:

The Tomcat Container allows servlet 2 and 3 web applications to be run. These applications are run as the root web application in a Tomcat container.

一旦buildpack检测到war包中存在WEB-INF,且不存在Java Main(实现了main方法的Java类),则决定使用Tomcat容器。

实际上从cf push的日志里也能观察到tomcat容器启动参数:

“JAVA_OPTS=”-agentpath: P W D / . j a v a b u i l d p a c k / o p e n j d k j r e / b i n / j v m k i l l 1.13. 0 R E L E A S E = p r i n t H e a p H i s t o g r a m = 1 D j a v a . i o . t m p d i r = PWD/.java-buildpack/open_jdk_jre/bin/jvmkill-1.13.0_RELEASE=printHeapHistogram=1 -Djava.io.tmpdir= TMPDIR -Djava.ext.dirs= P W D / . j a v a b u i l d p a c k / c o n t a i n e r s e c u r i t y p r o v i d e r : PWD/.java-buildpack/container_security_provider: PWD/.java-buildpack/open_jdk_jre/lib/ext -Djava.security.properties=$PWD/.java-buildpack/java_security/java.security J A V A O P T S D a c c e s s . l o g g i n g . e n a b l e d = f a l s e D h t t p . p o r t = JAVA_OPTS -Daccess.logging.enabled=false -Dhttp.port= PORT" && CALCULATED_MEMORY= ( ( PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-3.13.0_RELEASE -totMemory=MEMORY_LIMIT -loadedClasses=11021 -poolType=metaspace -stackThreads=250 -vmOptions=\"JAVA_OPTS") && echo JVM Memory Configuration: CALCULATED_MEMORY && JAVA_OPTS=\"JAVA_OPTS CALCULATED_MEMORY\" && MALLOC_ARENA_MAX=2 JAVA_OPTS=JAVA_OPTS JAVA_HOME=$PWD/.java-buildpack/open_jdk_jre exec $PWD/.java-buildpack/tomcat/bin/catalina.sh run",

最后一行的$PWD/.java-buildpack/tomcat/bin/catalina.sh run是我们非常熟悉的tomcat启动脚本。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。