干货分享:基于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目录,需要手工部署。

  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激活应用。

接下来,运行应用:

然后通过浏览器访问应用:

在页面输入一些数值:

原文发布于微信公众号 - 大魏分享(david-share)

原文发表时间:2018-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

Hystrix 自动降级与依赖隔离1.背景2.Hystrix说明

目前对于一些非核心操作,如增减库存后保存操作日志 发送异步消息时(具体业务流程),一旦出现MQ服务异常时,会导致接口响应超时,因此可以考虑对非核心操作引入服务降...

24220
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装Solr 5.2.1

Solr是一个基于Apache Lucene的搜索引擎平台。它是用Java编写的,并使用Lucene库来实现索引。可以使用各种REST API访问它,包括XML...

19360
来自专栏Web项目聚集地

从零学习Spring MVC框架「运行流程及静态资源处理」

第一篇文章「从零学习Spring MVC框架「环境搭建和MVC架构」」中我们初步进行了环境搭建,对Spring MVC框架的运行原理有个大体了解,为了帮助大家理...

10010
来自专栏WindCoder

SpringMVC和Struts2的区别

搜了好多两者相关的区别,感觉这个比较全面而且排版比较有规律,就选中了。最后会发出一些其他的链接可以参考对待。

2.3K20
来自专栏玩转JavaEE

Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享

小伙伴们好久不见!最近略忙,博客写的有点少,嗯,要加把劲。OK,今天给大家带来一个JavaWeb中常用的架构搭建,即Nginx+Tomcat搭建服务集群,然后通...

45560
来自专栏JackieZheng

Spring Boot系列——如何集成Log4j2

上篇《Spring Boot系列——日志配置》介绍了Spring Boot如何进行日志配置,日志系统用的是Spring Boot默认的LogBack。

18220
来自专栏友弟技术工作室

IPFS星际文件系统之-- 环境配置

IPFS(InterPlanetary File System)是一个点对点的分布式超媒体分发协议,它整合了过去几年最好的分布式系统思路,为所有人提供全球统一的...

23440
来自专栏IT笔记

SpringBoot开发案例之配置静态资源文件路径

前言 SpringBoot本质上是为微服务而生的,以JAR的形式启动运行,但是有时候静态资源的访问是必不可少的,比如:image、js、css 等资源的访问。 ...

2.3K100
来自专栏微服务生态

玩转Flume+Kafka原来也就那点事儿

好久没有写分享了,继前一个系列进行了Kafka源码分享之后,接下来进行Flume源码分析系列,望大家继续关注,今天先进行开篇文章Flume+kafka的环境配置...

11820
来自专栏IT笔记

SpringBoot开发案例之配置静态资源文件路径

SpringBoot本质上是为微服务而生的,以JAR的形式启动运行,但是有时候静态资源的访问是必不可少的,比如:image、js、css 等资源的访问。

466100

扫码关注云+社区

领取腾讯云代金券