干货分享:基于JBoss的七个Java应用场景
Posted 大魏分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货分享:基于JBoss的七个Java应用场景相关的知识,希望对你有一定的参考价值。
声明
本文主要是针对EAP7的相关实验的记录,本文仅供参考。仅代表作者的个人观点。
在实验过程中,笔者得到了舒服力和Kylin的大力帮助,很多代码的review是和舒力一起完成的。
本文包含七个实验:RESTEasy框架构建应用、消息队列实验、web的安全试验、EAP的单机模式部署应用、EAP的高可用模式、通过web console管理EAP、CDI的实战。
前言:什么是EAP?
红帽JBoss企业应用平台 7 (JBoss EAP) 是一款市场领先的开源平台,适用于在任意环境中部署现代化 Java 应用。
JBoss EAP 的架构采用创新型、模块化和云就绪设计。该平台提供了强大的管理和自动化功能,可显著提升开发人员生产率。它基于开源Wildfly项目(之前称为JBoss应用服务器)构建。
JBoss EAP 产品具有以下特性:
• 小——安装介质仅有 160 M
• 快——3 秒即可启动完毕
• 轻——轻量级
• 灵——架构灵活,可以按需“瘦身”
• 简——安装配置简单
JBoss EAP 产品具有以下功能:
• 高可用性群集。
• 分布式缓存。
• 消息服务。
• 事务处理。
• 完整 Web 服务堆栈。
一、RESTEasy框架构建应用
本实验将展现通过RESTEasy构建一个Java应用。
应用最终的页面展示将是:
本实验包含三个项目:
EAPRestDomain:提供一个用JAX-B批注注释的Customer Domain对象,以便于对象和XML相互转换。
RestfulService:包含您部署到JBoss EAP服务器的JAX-RS RESTful服务的代码。
RestfulClient:包含一个将HTTP请求发送到部署到JBoss EAP服务器的RESTful服务的类。 客户端在独立于JBoss EAP服务器的Java VM中运行。
首先查看Customer.java代码,找到@XmlRootElement部分:
cat src/main/java/org/jboss/gpse/eap6ws/domain/Customer.java
JAX-B需要@XmlRootElement注释来标识根XML元素。 其实就是customer的元素:
@XmlAttribute描述的是id的属性
@XmlElement注释用于其他元素,比如FrstName等:
接下来,build并install domain项目:
在RestfulService项目中,使用CustomerDAO.java(该class充当实验中的模拟数据源)来存储和检索Customer对象。
cat src/main/java/org/jboss/gpse/eap6ws/resource/CustomerDAO.java
cat src/main/java/org/jboss/gpse/eap6ws/resource/CustomerResource.java
CustomerResource.java是主应用,运行到EAP中,提供JAX-RS annotations的路径:
@Path用于为用于访问JAX-RS资源的URI设置上下文根。
CDI注入:注入了CustomerDAO和web.xml
@PostConstruct触发在由CDI容器设置CDI注入字段后调用init()方法。 在这种情况下,该方法用于与客户建立模拟数据库。
接下来:查看下insert new customers的机制:
@POST批注指示JAX-RS容器将HTTP POST操作发送到此方法。
@Path(“customers /”)注释提供执行此方法所需的根路径之外的其他路径元素
这里使用的@Consumes指定HTTP POST请求的主体必须使用XML作为格式。
在调用createCustomer方法之前,RESTEasy会自动使用JAX-B将请求的XML格式化主体转换为Customer Java对象。
查看检索Customer对象的机制:
在JAX-RS中,HTTP GET操作用于检索资源。 通常,资源的URI必须提供附加信息,以便该方法知道要检索哪个资源。
这里使用@Path注释来指定在URI中提供id值。
@Path注释中的id变量必须与@PathParam注释中使用的参数值匹配,以将URI中的值映射到int id方法参数。
@Produces通知JAX-RS容器,该方法以XML格式返回结果。 由于RESTEasy已经知道如何执行JAX-B转换,因此此方法可以简单地返回一个Customer对象,并让RESTEasy负责将结果转换为XML。
查看更新客户对象的机制:
使用JAX-RS,HTTP PUT操作用于将更新应用于资源。 在此示例中,要更新的客户的id值由id @Path参数标识。
@Consumes注释用于指定此方法要求HTTP PUT请求的主体包含XML格式的Customer对象。
接下来,激活CDI:
touch src/main/webapp/WEB-INF/beans.xml
编辑web.xml以便激活JAX-RS,增加如下内容:
vi src/main/webapp/WEB-INF/we
在<context-param>部分中,RESTEasy参数选项用于指示容器使用/ rest-service作为URI上的前缀。 此路径元素在资源类指定的客户路径元素之前使用。
核心RESTEasy servlet在<servlet>元素中指定。 这通知JBoss EAP服务器使用RESTEasy容器进行服务。
<servlet-mapping>元素通知JBoss EAP发送匹配给定url模式的请求到RESTEasy servlet进行处理。
<env-entry>元素使容器能够提供max-set-size资源值。 回想一下,在构造对象时,这个资源值被容器注入到CustomerResource.java对象中。
将JAX-RS部署到EAP中。
先启动EAP:
build和部署应用:
查看应用客户端测试的源码:
查看源码中关于测试方法的描述:
接下来,编译客户端测试应用:
我们用浏览器访问customer:
我们看到customers中有三个用户信息。我们再次运行client程序:
查看customer内容,多了一个用户:
二、消息队列实验
Red Hat JBoss A-MQ是一个全功能的消息队列解决方案。JBoss EAP消息传递子系统是一种精简型企业消息传递解决方案,用于支持Java消息传递规范(JMS)的要求,该规范是完整JEE规范的一部分。
本实验主要是该展现JBoss EAP消息子系统的功能。
JBoss EAP在standalone-full.xml置文件中定义了基于Apache ActiveMQ Artemis的消息传递子系统。
为JBoss EAP messaging subsystem创建目录:
$ sudo mkdir -p /srv/messaging $ sudo chown -R jboss:users /srv
vi $JBOSS_HOME/bin/standalone.conf,增加如下内容:
vi $JBOSS_HOME/standalone/configuration/standalone-full.xml增加如下内容:
启动消息队列:
$ cd $JBOSS_HOME
$ ./bin/standalone.sh -c standalone-full.xml -b 0.0.0.0 -bmanagement=0.0.0.0
创建用户:$ ./bin/add-user.sh -a -u gpteUser -g guest -p jb0ssredhat!
查看EAP日志:
接下来,创建并部署一个消息驱动的bean。
vi src/main/java/com/redhat/gpe/eapclass/basicmessaging/SimpleMDB.java
对项目进行构建:
cd $EAP7_EXERCISE_HOME/09_Basic_Messaging
mvn clean package -DskipTests
进行部署:
mvn wildfly:deploy -DskipTests
查看EAP日志:
创建JMS client :
vi src/test/java/com/redhat/gpe/eapclass/basicmessaging/SimpleJMSTest.java
mvn clean test -Dmessaging.user=gpteUser -Dmessaging.password=jb0ssredhat!
通过Console查看A-MQ:
三、web的安全试验
在本实验中,我们配置一个培训机构的web,要求权限如下:
客人无需登录即可访问Web应用程序。他们可以自由浏览网站并查看课程信息。
学生可以访问一个特殊的学生门户网站,学生需要先登录才能访问学生门户。
教师可以访问教练门户。 教师在访问教师门户之前还必须登录。
web应用程序的架构如下:
首先启动EAP:
$JBOSS_HOME/bin/standalone.sh -b=0.0.0.0 -bmanagement=0.0.0.0
然后在EAP中部署应用:
通过浏览器访问应用,点击Student Portal和Instructor Portal都可以直接访问:
点击student portal:
点击Instructor Portal:
接下来,创建用户并赋权:
配置role:
vi $JBOSS_HOME/standalone/configuration/application-roles.properties,增加:
配置web安全:
vi webSubsystemLab/src/main/webapp/WEB-INF/web.xml
为student portal增加:
为instructor portal增加
接下来,将web应用绑定到安全domain:
创建文件: vi webSubsystemLab/src/main/webapp/WEB-INF/jboss-web.xml
然后重启EAP,重新构建应用:
然后再次访问web:
点击Student Portal,出现认证提示,输入用户名和密码:
然后可以访问网页的内容.
同样,点击 Instructor Portal也出现认证提示,也需要输入用户名和密码:
输入用户名密码以后,可以看到信息:
四、EAP的单机模式部署应用
EAP有两种模式:单机模式和domain模式。
EAP单机模式部署、启动、停止都很简单方便。
启动EAP单机模式:
通过浏览器使用8080端口访问EAP:
接下来,我们在EAP中部署应用。
在EAP中部署应用,可以有两种格式。对于压缩的war/ear包,EAP检测到以后,可以直接部署,对于解压的war/ear目录,需要手工部署。
压缩的war/ear包
解压的war/ear目录
接下来,我们看看这两种部署方式。
在没用应用的情况下,$JBOSS_HOME/standalone/deployments/目录下没有内容:
我们将一个war压缩包拷贝到该目录下,应用会自动部署:
我们再次查看deployment目录:
example.war.deployed 就是被部署的应用。
我们通过浏览器访问这个应用:
在成功部署了一个war包以后,我们部署一个解压的war目录。
version.war是一个解压的war文件,是一个目录:
我们将这个目录拷贝到deployment下:
[org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) WFLYDS0004: Found version.war in deployment directory. To trigger deployment create a file called version.war.dodeploy
拷贝解压的war目录不会自动触发应用部署,需要手工触发。
手工创建一个version.war.dodeploy文件:
应用部署会被自动触发。通过浏览器访问部署好的应用:
在EAP中,删除应用的方法很简单,对于第一个应用,删除example.war文件即可。
对于第二个应用,删除version.war.dodeploy文件即可:
五、EAP的高可用模式
Domain模式是EAP的高可用模式,其架构见下图:
Host Controller管理同一台Host(可以是物理机或者虚拟机)上的Server
Domain Controller通过Host Controller管理Domain中的所有Server
同一个Domain中的一个或多个Server组成一个 Server Group
在本实验中,我们模拟三个服务器:host0、host1、host2(通过使用不同的端口,在一个虚拟机上模拟多个host)
host0上部署Domain Controller,Domain Controller不包含任何应用。
host1上部署第一个Host Controller,它包含两个应用服务器(Server11 and Server12)
host2上部署第二个Host Controller,它包含三个应用服务器( Server21, Server22, and Server23)。
Server11 and Server12属于primary-server-group
Server12 and Server22 属于secondary-server-group
Server23属于ingleton-server-group
准备实验环境(在一个虚拟机上模拟三个host):
配置domain controller配置文件:
vi host0/domain/configuration/domain.xml,增加server group的配置信息:
修改host-master.xml配置文件:
vi host0/domain/configuration/host-master.xml
为web console增加账户:
启动domain controller:
然后通过浏览器访问console,已经可以看到server group和host0-master:
接下来,配置host1和host2,先配置host1
vi host1/domain/configuration/host-slave.xml
为了避免端口冲突,将native interface 从9999修改成 10999.
将domain master的IP设置成127.0.0.1(因为domain master在本地)
配置server group信息:
接下来,启动host1 master:
接下来,我们确认一下host1上的server11和server12是否已经启动:
接下来在console上进行查看,host1上的server11和server12已经启动:
接下来,配置host2:
vi host2/domain/configuration/host-slave.xml
将native interface 端口号设置成11999
配置server group:
接下来,启动host2:
可以看到server21和server22、server23在启动:
确认三个server已经启动:
通过web console进行查看,截至到目前,5个server已经运行起来了:
六、通过web console管理EAP
启动EAP单实例:
浏览器访问web console
选择deployment:
点击add,上传war包:
选择部署上传的应用:
可以进行权限管理:
可以查看日志:
七、CDI的实战
CDI的全称是:Contexts and Dependency Injection(CDI)。
本实验是通过CDI的方式,创建一个JSF架构的应用。
JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化了开发。
JSF遵守MVC架构,用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离使JSF应用程序更易于管理。所有与应用程序交互的访问都交由FacesServlet(控制器)来处理。
首先启动EAP:
创建 SimpleProperty目录和class。
SimpleProperty bean的作用是为应用存储键值对。这个class的@Entityannotations,是用于用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,它是通过JPA方式实现。
创建ServiceBean 目录和class。ServiceBean是一个无状态的EJB。代码中的Event<SimpleProperty>的作用是:每当对数据库进行更改时,CDI事件触发一个事件。EntityManager是应用程序操纵持久化数据的接口。
创建BeanManager 目录和class。这个bean的作用是给JSF page提供对应的数据。
创建 GenericProducer 目录和class。
EntityManager是负责管理Entity的对象。对Entity的操作包括添加、删除、修改和查询,都是通过实体管理器来实现的。EntityManager是实际上是对JPA connection的封装。这个bean的本质作用是根据persistence.xml文件的定义做初始化。
创建RepositoryManager 目录和class。
这个bean调用了EntityManager,然后对数据库做select * 查询,并且将结果展示出来:
创建Producer class。该类的作用是:提供PropertyList在JSF视图中显示的源。
vi src/main/java/eapcourse/producer/Producer.java
为了使用JPA,接下来在src/main/resources/META-INF目录下创建文件persistence.xml
创建展示层:
vi src/main/webapp/index.xhtml
增加重定向,将默认的index.jsp重定向成index.xhtml,也就是上一步创建的展示层:
vi src/main/webapp/index.jsp
增加Faces Servlet到web.xml。 FacesServlet是整个应用的前端控制器, 所有的请求都通过FacesServlet来处理。Faces Servlet定义user能够访问到的路径。
vi src/main/webapp/WEB-INF/web.xml
生成文件:
touch src/main/webapp/WEB-INF/beans.xml。
该文件的作用是让 CDI激活应用。
接下来,运行应用:
然后通过浏览器访问应用:
在页面输入一些数值:
大卫分享:
魏新宇
"大卫分享"运营者、红帽资深解决方案架构师
专注开源云计算、容器及自动化运维在金融行业的推广
拥有红帽RHCE/RHCA、VMware VCP-DCV、VCP-DT、VCP-Network、VCP-Cloud、ITIL V3、Cobit5、C-STAR、AIX、HPUX等相关认证。
以上是关于干货分享:基于JBoss的七个Java应用场景的主要内容,如果未能解决你的问题,请参考以下文章