微信号:david-share

介绍:乐于分享,才有进步.

干货分享:基于JBoss的七个Java应用场景

2018-02-23 19:50 魏新宇 舒力


声明

本文主要是针对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目录,需要手工部署。

  1. 压缩的war/ear包

  2. 解压的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

将domain master配置成本地地址:

配置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等相关认证。



 
大卫分享 更多文章 六种开发环境部署大全:基于Openshift 深度分析:Istio替代Spring Cloud的合理性 Openshift的高可用架构设计 基于Openshift部署七种开发环境:第一篇之FUSE、Vert.x、Spring Boot 技术角度看问题:红帽收购CoreOS之我见
猜您喜欢 你看得懂的大数据——携程“订单可视化展示”项目 终于,禅叔创业了 Android样式的开发:drawable汇总篇 研究音频编解码要看什么书 用户画像:基于大数据技术的手机用户画像与征信研究