前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >干货分享:基于JBoss的七个Java应用场景

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

作者头像
魏新宇
发布2018-03-22 17:05:13
2.1K0
发布2018-03-22 17:05:13
举报

声明

本文主要是针对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激活应用。

接下来,运行应用:

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

在页面输入一些数值:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大魏分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档