为什么要从domain模式启动wildfly

为什么要从domain模式启动wildfly,第1张

JBoss 7/WildFly 以 domain 模式启动时会启动多个 JVM,例如如下通过启动脚本启动 domain 模式:

./domain.sh

启动后我们查看进程:

[kylin@localhost tdump]$ jps -l

23655 /home/kylin/work/eap/jboss-eap-6.1/jboss-modules.jar

23671 /home/kylin/work/eap/jboss-eap-6.1/jboss-modules.jar

23736 /home/kylin/work/eap/jboss-eap-6.1/jboss-modules.jar

我们可以发现 domain 模式启动时会启动后,有三个进程(对应三个JVM)运行。本文主要研究 domain 模式下是如何启动多个 JVM 的。另外,`jboss-modules.jar` 是 JBoss 底层类加载机制,用于类加载和启动一个 JVM。

从启动脚本开始

domain.sh 脚本中如下信息:

eval \"$JAVA\" -D\"[Process Controller]\" $PROCESS_CONTROLLER_JAVA_OPTS \

\"-Dorg.jboss.boot.log.file=$JBOSS_LOG_DIR/process-controller.log\" \

\"-Dlogging.configuration=file:$JBOSS_CONFIG_DIR/logging.properties\" \

-jar \"$JBOSS_HOME/jboss-modules.jar\" \

-mp \"${JBOSS_MODULEPATH}\" \

org.jboss.as.process-controller \

-jboss-home \"$JBOSS_HOME\" \

-jvm \"$JAVA_FROM_JVM\" \

-mp \"${JBOSS_MODULEPATH}\" \

-- \

\"-Dorg.jboss.boot.log.file=$JBOSS_LOG_DIR/host-controller.log\" \

\"-Dlogging.configuration=file:$JBOSS_CONFIG_DIR/logging.properties\" \

$HOST_CONTROLLER_JAVA_OPTS \

-- \

-default-jvm \"$JAVA_FROM_JVM\" \

'"$@"'

JBOSS_STATUS=$?

基于 JBoss Module 类加载机制,我们查看 org.jboss.as.process-controller,在 `module.xml` 的描述中启动 Main 方法如下:

<module xmlns="urn:jboss:module:1.1" name="org.jboss.as.process-controller">

<properties>

<property name="jboss.api" value="private"/>

</properties>

<main-class name="org.jboss.as.process.Main"/>

所以我们可以从 `org.jboss.as.process.Main` 类开始,JBoss 是完全开源的,这样很容易开始调试代码,通过如下步骤可以开始调试启动代码:

在 pom.xml 中添加如下依赖

<dependency>

<groupId>org.jboss.as</groupId>

<artifactId>jboss-as-process-controller</artifactId>

<version>7.2.0.Final-redhat-8</version>

</dependency>

编辑 domain.conf,添加如下配置

PROCESS_CONTROLLER_JAVA_OPTS="$PROCESS_CONTROLLER_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8788,server=y,suspend=y"

HOST_CONTROLLER_JAVA_OPTS="$HOST_CONTROLLER_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=y"

以 domain 模式启动 JBoss,在 `org.jboss.as.process.Main` 的 main 方法中添加断点,开始代码调试,如下图所示:

对照之前的启动脚本,main 方法传入的参数如下:

-jboss-home, /home/kylin/work/eap/jboss-eap-6.1,

-jvm, /usr/java/jdk1.7.0_21/bin/java,

-mp, /home/kylin/work/eap/jboss-eap-6.1/modules,

--,

-Dorg.jboss.boot.log.file=/home/kylin/work/eap/jboss-eap-6.1/domain/log/host-controller.log,

-Dlogging.configuration=file:/home/kylin/work/eap/jboss-eap-6.1/domain/configuration/logging.properties,

-server, -Xms63m, -Xmx512m, -XX:MaxPermSize=256m, -Djava.net.preferIPv4Stack=true, -Djboss.modules.system.pkgs=org.jboss.byteman,

-Djava.awt.headless=true, -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=y,

--,

-default-jvm, /usr/java/jdk1.7.0_21/bin/java

domain 模式启动

下图描述 domain 模式启动的过程:

根据上图描述,我们将 domain 模式启动描述为以下步骤:

通过启动脚本 `domain.sh` 启动 *Process Controller* JVM,*Process Controller* 启动后监听于端口 0,该段口等待 Host Controller JVM 连接

Process Controller 启动 Host Controller,我们随后详细介绍 Process Controller 如何启动 Host Controller, Host Controller 启动后,首先解析 `host.xml` 文件,获取要启动 Server 信息,并与 Process Controller 建立 TCP 连接,将启动 Server 的信息发送给 Process Controller

Process Controller 根据 Host Controller 发送的 Server 信息,启动相关的 Server

如上图,我们可以看到三个 JVM 启动的 Main 方法分别位于三个不同的 module 中: `org.jboss.as.process-controller` (对应的 Main 方法为 `org.jboss.as.process.Main`), `org.jboss.as.host-controller ` (对应的 Main 方法为 `org.jboss.as.host.controller.Main`), `org.jboss.as.server` (对应的 Main 方法为 `org.jboss.as.server.DomainServerMain`)。

他是自动调用的Java命令吧。

可按下面的思路来切换JDK版本。linux类似

假设我现在安装的是旧版本的JDK1.5,那么在系统环境变量里我们设置了java_home和classpath,对应存放的注册表项是(HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment),JDK在安装的过程当中将在注册表会生成如下3个项目:

HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Development Kit

HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Plug-in

HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment

同时,JDK安装程序将会把java.exe,javaw.exe,javaws.exe这3个可执行文件拷贝到%SystemRoot%\system32目录下,由于%SystemRoot%\system32被 *** 作系统缺省的设置为最高优先权的PATH搜索路径,因此可保证用户在命令行任何目录下可运行java.exe来启动JVM。

所以,

第一步是备份上面提到的四个注册表项和那三个可执行文件;

第二步,安装高版本的JDK 1.7,修改环境变量,然后备份上面提到的四个注册表项和那三个可执行文件;

第三步:把第一步得到的所有文件放到一个命名“1.5”文件夹中,把第二步得到的所有文件放到一个命名“1.7”文件夹中;

微服务有助于开发人员用更低的成本和更少的错误来开发程序。

常用的微服务框架:

1、Spring Boot

Spring Boot是Spring的一个特定版本,它通过对配置细节的处理,使微服务构建更加简便。创建Spring Boot旨在自启动任何类型的Spring项目,而不仅仅是微服务。应用程序完成后,Spring Boot将在Web服务器中混合,并输出一个JAR文件,JVM除外。你可以将其视为原始Docker容器,这也是许多负责构建微服务的开发者都非常喜欢Spring Boot的原因。

2、Dropwizard

Dropwizard框架为开发者提供了一个非常简单的模型,里面包含了许多重要的模块,你可以根据需求添加一些业务逻辑,或者配置其他内容,最后你会发现JAR文件非常小,并且能够快速启动。

Dropwizard最大的限制可能是缺乏依赖注入。如果你希望使用依赖项注入来保持代码的整洁和松散耦合,则需要自己添加库,这点和Spring不同,但是现在Dropwizard也支持大多数功能,包括日志记录、健康检查和提供d性代码。

3、Cricket

是一个用于快速API开发框架。Cricket很小,尽管它包括许多额外的功能,如键值数据存储,以避免连接数据库和调度程序来控制后台重复处理。没有添加复杂性或其他依赖项,因此很容易将代码添加到Cricket并启动独立的微服务。

4、Jersey

开发web服务的标准方法之一是RESTful web服务的Java API(又名JAX-RS),这是Jersey框架中实现的通用规范。这种方法主要依赖于使用注释来指定路径映射和返回细节。从参数解析到JSON打包的所有其他内容都由Jersey处理。

Jersey的主要优点是它实现了JAX-RS标准,这个特性非常受欢迎,一些开发人员习惯将Jersey与Spring Boot结合在一起使用。

5、Play

体验JVM跨语言能力的最佳方式之一是使用Play框架,这是可以与Java或任何其他JVM语言兼容的。它的基础非常现代,具有异步、无状态的模型,不会让试图跟踪用户及其会话数据的线程使服务器过载。还有许多额外的特性可以用来充实网站,比如OpenID、验证和文件上传支持。Play代码库已经发展了十多年,因此你还会发现类似于对XML的支持的这种古老的功能。play既成熟又轻盈,这种组合还是比较有特色的。

当然,常用的Java微服务框架还有Swagger、Helidon、WildFly Thorntail等,在此就不多赘述了。

希望能帮到你,望采纳!!!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11358677.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存