简介

wildfly可以使用Standalone模式或者domain模式启动,standalone模式就很简单了,可以看做是一个单独的服务器。今天我们将会详细讲解一下domain模式。

wildfly模式简介

wildfly可以在两种模式下面工作,他们是standalone和managed domain。

standalone模式表示的是一个独立的服务器,它们可以通过使用standalone.sh来启动。如果使用的是standalone模式,但是又需要使用多服务器的集群模式,那么需要用户自己在应用层去处理。

如果想中心化管理多个多个服务的话,那么可以用到managed domain模式。

在managed domain模式下,wildfly可以通过一个domain controller来控制和管理其他的domain server。

我们看下managed domain下的服务器部署示意图:

上面示意图中,一个host表示的是一个实体或者虚拟机。在一个host中可以部署多个server instances。

我们可以通过domain.sh来启动host controller。

host controller负责启动和停止server服务,并且负责和Domain Controller进行交互。

host controller通过读取domain/configuration/host.xml的配置信息,来进行服务器的配置。

上图中有一个特殊的host controller叫做Domain Controller。Domain Controller负责整个domain的管理工作。

域控制器的主要职责是维护域的中央管理策略,以确保所有主机控制器都知道其当前内容,并协助主机控制器确保根据此策略配置任何正在运行的应用程序服务器实例。 默认情况下,此中央管理策略存储在Domain Controller主机的domain/configuration/domain.xml中。

server group中的一组server都有相同的配置,可以将它们看做是一个。一个 Domain Controller 可以管理多个server group.

我们看一个server group的定义:

<server-group name="main-server-group" profile="default">
<socket-binding-group ref="standard-sockets"/>
<deployments>
<deployment name="foo.war_v1" runtime-name="foo.war" />
<deployment name="bar.ear" runtime-name="bar.ear" />
</deployments>
</server-group>

最后一个概念就是server,server表示的是一个运行的应用程序。server和Host Controller 运行在不同的JVM中的,并且server是由Host Controller 来启动的。

注意,不管是standalone还是managed domain,这都是取决于你内部的服务是怎么管理的,是一个个单独的部署还是使用中心化的管理方式,他们和外部用户的服务方式是无关的,也就是说不管使用standalone还是managed domain,都可以搭建服务集群。

domain controller的配置

domain controller是一个中心化的对domain进行管理的服务。我们需要一个host被配置为domain controller,还需要暴露它的管理接口以供被管理的host进行连接。

我们看下一个domain controller的配置:

<domain-controller>
<local/>
</domain-controller>

上面的例子中,local表示的是本地host。

如果这个机子被当做是domain controller,那么必须配置和暴露管理接口:

<management-interfaces>
<native-interface security-realm="ManagementRealm">
<socket interface="management" port="${jboss.management.native.port:9999}"/>
</native-interface>
<http-interface security-realm="ManagementRealm">
<socket interface="management" port="${jboss.management.http.port:9990}"/>
</http-interface>
</management-interfaces>

其中,interface指向的management是在host.xml中配置的:

<interfaces>
<interface name="management">
<inet-address value="192.168.0.101"/>
</interface>
</interfaces>

默认情况下master domain controller是需要认证才能被访问的,我们需要通过使用add-user来为slave domain controller 创建用户,以连接到master domain controller。

所以,我们在add-user的最后一步,我们需要输入y:

Is this new user going to be used for one AS process to connect to another AS process e.g. slave domain controller?
yes/no? y
To represent the user add the following to the server-identities definition <secret value="cE3EBEkE=" />

我们需要记住上面的xml格式的secret,以便在后续slave的配置中使用。

Host controller的配置文件

有了domain controller,我们就可以通过host controller加入存在的domain了。

在做host controller的配置的时候,需要注意,host的逻辑名在一个domain内部必须是唯一的。并且host controller是通过IP地址来连接到domain controller的。

所以我们需要在host.xml中给host起一个唯一的名字:

<host xmlns="urn:jboss:domain:3.0"
name="slave">
[...]
</host>

如果没有指定host的名字,将会使用jboss.host.name的值作为host的名字。如果这个值也没有设置,那么将会使用HOSTNAME或者COMPUTERNAME作为host的名字。

我们需要在hsot controller中指定domain controller的连接信息:

<domain-controller>
<remote protocol="remote" host="192.168.0.101" port="9999" username="slave" security-realm="SlaveRealm"/>
</domain-controller>

这里我们需要指定一个security realm,用来存放slave的密码:

<security-realm name="SlaveRealm">
<server-identities>
<secret value="cE3EBEkE=" />
</server-identities>
</security-realm>

这个secret,就是在使用user-add工具的时候创建的密码。

忽略域范围的资源

我们知道domain controller的职责就是保证所有正在运行的host controller都拥有和domain controller域范围配置一致的本地副本。

这些域范围的配置指的是不以 /host = * 开头的资源,比如那些保存在domain.xml中的资源。

如果host controller不是想做domain controller的备份,或者说host controller不想重新启动一个新的server group。那么host controller只需要保存已运行server group相关的域范围配置即可,并不需要保存所有的是域范围配置。

这样可以减少数据的传输,提升系统的效率。

如果要忽略域范围的资源我们可以使用ignore-unused-configuration="true"。

<domain-controller>
<remote security-realm="ManagementRealm" ignore-unused-configuration="true">
<discovery-options>
<static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/>
</discovery-options>
</remote>
</domain-controller>

Server groups

Server groups就是服务分组,它是由domain controller来定义的,每个server-group都需要和profile,socket-binding-group进行关联,我们看个例子:

<server-groups>
<server-group name="main-server-group" profile="default">
<jvm name="default">
<heap size="64m" max-size="512m"/>
<permgen size="128m" max-size="128m"/>
</jvm>
<socket-binding-group ref="standard-sockets"/>
</server-group>
<server-group name="other-server-group" profile="bigger">
<jvm name="default">
<heap size="64m" max-size="512m"/>
</jvm>
<socket-binding-group ref="bigger-sockets"/>
</server-group>
</server-groups>

上面配置中的socket-binding-group也是在domain.xml中定义的,指定了网络的interface和端口:

<socket-binding-groups>
<socket-binding-group name="standard-sockets" default-interface="public">
<socket-binding name="http" port="8080"/>
[...]
</socket-binding-group>
<socket-binding-group name="bigger-sockets" include="standard-sockets" default-interface="public">
<socket-binding name="unique-to-bigger" port="8123"/>
</socket-binding-group>
</socket-binding-groups>

socket-binding-group还可以使用include来引用其他的socket-binding-group。

profile是subsystems的集合,subsystem就是应用程序需要的各种功能。

<profiles>
<profile name="default">
<subsystem xmlns="urn:jboss:domain:web:1.0">
<connector name="http" scheme="http" protocol="HTTP/1.1" socket-binding="http"/>
[...]
</subsystem>
<\!-\- The rest of the subsystems here \-->
[...]
</profile>
<profile name="bigger">
<subsystem xmlns="urn:jboss:domain:web:1.0">
<connector name="http" scheme="http" protocol="HTTP/1.1" socket-binding="http"/>
[...]
</subsystem>
<\!-\- The same subsystems as defined by 'default' here \-->
[...]
<subsystem xmlns="urn:jboss:domain:fictional-example:1.0">
<socket-to-use name="unique-to-bigger"/>
</subsystem>
</profile>
</profiles>

Servers

Servers是在host controller中定义的,而Servers group是在domain controller中定义的。

每个server都要属于一个server group,server就是服务,每个server都会启动一个jvm。 我们先看下server的定义:

<servers>
<server name="server-one" group="main-server-group">
<\!-\- server-one inherits the default socket-group declared in the server-group \-->
<jvm name="default"/>
</server> <server name="server-two" group="main-server-group" auto-start="true">
<socket-binding-group ref="standard-sockets" port-offset="150"/>
<jvm name="default">
<heap size="64m" max-size="256m"/>
</jvm>
</server> <server name="server-three" group="other-server-group" auto-start="false">
<socket-binding-group ref="bigger-sockets" port-offset="250"/>
</server>
</servers>

在server中,我们可以重新定义socket-binding-group。

auto-start的意思是server是否回随着host controller的启动而启动。

最后,我们看下在host.xml中的jvm的定义:

<jvms>
<jvm name="default">
<heap size="64m" max-size="128m"/>
</jvm>
</jvms>

我们可以在server中对其进行重写。

总结

以上就是wildfly中,对domain的配置规则,可以看到在domain中,可以启动多个server,配置和管理起来比tomcat要复杂很多,不过功能也相应的强大很多,我们可以借鉴这些优秀软件的设计思想,从而应用到我们的自己的程序中。

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/wildfly-21-domain/

本文来源:flydean的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

wildfly 21的domain配置的更多相关文章

  1. wildfly 21中应用程序的部署

    目录 简介 Managed Domain中的部署 管理展开的部署文件 standalone模式下的部署 standalone模式下的自动部署 Marker Files 受管理的和不受管理的部署 部署覆 ...

  2. wildfly 21的配置文件和资源管理

    目录 简介 wildfly的配置文件 extensions profile path interface socket-binding management 资源管理 总结 简介 在上一篇文章我们介绍 ...

  3. 在wildfly 21中搭建cluster集群

    目录 简介 下载软件和相关组件 配置domain 创建应用程序 部署应用程序 集群配置 总结 简介 wildfly是一个非常强大的工具,我们可以轻松的使用wildfly部署应用程序,更为强大的是,wi ...

  4. mysql-5.7.21安装和配置方法

      到MySQL官网下载MySQL 5.7.21的版本,下载地址:https://dev.mysql.com/downloads/mysql/ .根据自己的系统下载相应的32位或64位的版本. 将下载 ...

  5. wildfly添加JNDI驱动配置

    wildfly-9.0.1.Final/modules目录下新建com文件夹cd com && mkdir mysql && cd mysql && m ...

  6. Fedora 21下lingo14配置

    Install lingo14 during Fedora 21 The first step:Download lingo14Download address:http://www.lindo.co ...

  7. 数据库学习--wildfly配置postgreSQL数据源

    前言 实验室最近在做一个物品管理系统的小项目,其中涉及到postgreSQL的使用,刚开始部署到wildfly服务器上时遇到了若干问题,终于在导师的讲解下大体上明白了 ,特此记录分享学习一下. 配置数 ...

  8. (spring-第4回【IoC基础篇】)spring基于注解的配置

    基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现类上标注注解实现. 也就是说,加了注解,相当于在XML中配置了,一样 ...

  9. Nginx部署tomcat/wildfly集群负载均衡

    1.调度器配置: docker run -p 80:80 --name nginx --restart=always  -v /root/nginx/www/:/usr/share/nginx/htm ...

随机推荐

  1. Netty源码分析之ByteBuf(二)—内存分配器ByteBufAllocator

    Netty中的内存分配是基于ByteBufAllocator这个接口实现的,通过对它的具体实现,可以用来分配我们之前描述过的任意类型的BytebBuf实例:我们先看一下ByteBufAllocator ...

  2. Java反射——读取XML文件,创建对象

    读取XML文件,创建对象 config.xml <?xml version="1.0" encoding="UTF-8"?> <beans&g ...

  3. 真香!Python开发工程师都选择这个数据库:因为它免费

    数据库类别 既然我们要使用关系数据库,就必须选择一个关系数据库. 目前广泛使用的关系数据库也就这么几种: 付费的商用数据库: Oracle,典型的高富帅: SQL Server,微软自家产品,Wind ...

  4. android studio很好用的插件

  5. 保姆级别的RabbitMQ教程!包括Java和Golang两种客户端

    目录 什么是AMQP 和 JMS? 常见的MQ产品 安装RabbitMQ 启动RabbitMQ 什么是Authentication(认证) 指定RabbitMQ的启动配置文件 如何让guest用户远程 ...

  6. OpenCV击中击不中HMTxingt变换最容易理解的解释

    OpenCV击中击不中变换是几个形态变换中相对比较拗口.不容易理解的,给初学者理解带来了很多困难,虽然网上也有许多的公开资料,原理和算法基本上介绍比较清晰,但是是要OpenCV进行形态变换大多还是说得 ...

  7. Fiddle抓包应用概述

    抓包: 抓包(packet capture)就是将网络传输发送与接收的数据包进行截获.重发.编辑.转存等操作,也用来检查网络安全.抓包也经常被用来进行数据截取等.说简单点就是抓取前端发送给服务器的数据 ...

  8. 第 3篇 Scrum 冲刺博客

    一.站立式会议 1.站立式会议照片 2.昨天已完成的工作 登录窗口的构建 3.今天计划完成的工作 ①帮助不会的同学连接数据库 ②登录识别模块 4.工作中遇到的困难 ①出现一些同学使用了不同种类的数据库 ...

  9. 百度前端技术学院-基础-day25-27

    倒数开始 滴答滴 滴答滴 task1 题目: 我们现在来做一个最简单的时钟,通过小练习来学习 Date,复习定时,然后再练习一下函数的封装具体需求如下: 在页面中显示当前日期及时间,按秒更新 格式为 ...

  10. Vue 的响应式原理中 Object.defineProperty 有什么缺陷?为什么在 Vue3.0 采用了 Proxy,抛弃了 Object.defineProperty?

    Object.defineProperty无法监控到数组下标的变化,导致通过数组下标添加元素,不能实时响应: Object.defineProperty只能劫持对象的属性,从而需要对每个对象,每个属性 ...