前提:
公司做项目迁移,从Weblogic上将服务迁移至Wildfly(JBoss),在此之前这些个技术都没有深入接触过,今天在这里做一个总结:
非云原生时代分布式部署应用,可以使用EJB,众所周知分布式需要支持不同区域,多台服务器间的交互,整体架构一样是将不同的视图层,业务层,数据持久化层进行模块拆分部署,使用RMI和实现JMS规范的各类中间件技术解决不同服务间的通信问题。EJB也是对业务做了拆分,拆分成不同的模块内部使用RMI和JNDI提供的远程字节码Download能力做了一整套的分布式支持。架构比较老,需要序列化传输一系列的Bean对象所以效率不怎么高。
EJB简要介绍
EJB(Enterprise JavaBean)即企业级的JavaBean相较于传统的JavaBean它支持更多分布式的内容如:
1.JTA分布式事务,支持MDB(Massage Dirver Bean)可以被EJB容器调用管理。
2.EJB使用MDB来处理消费JMS中间件产生的消息,MDB也就是接受消息用的Bean。
3.还有Session Bean处理有状态和无状态的会话Bean
4.O/R框架需要数据持久化,如JPA涉及的Entity Bean常说的实体类!
EJB远程调用原理简介(就是从服务端获取动态代理对象在客户端执行并将结果传给服务端):
1.客户端通过JNDI来实现远程获取相关服务Bean的代理对象字节码,并创建代理对象即存根Stub, 2.客户端调用内存中的代理服务对象(Stub),返回结果后进行序列化,将序列化内容通过RMI、IIOP等远程技术传输回服务端 3.服务端拿到处理结果进行反序列化,调用服务端真正的服务,进行处理,处理结束将结果返回,并在此序列化通过RMI进行远程调用,传回客户端。 4.客户端拿到结果在此反序列化将结果进行处理!
重量级JB容器技术就出来了,它在事务方面仅支持JTA(Java Transaction API即Java事务API)分布式事务,以下是某培训机构的老项目架构图供参考。
JBoss是一款动态应用服务器,目前官网已经无了,8版本以上的不叫Jboss 改名Wildfly了。
Wildfly简介下载: 官网下载点这里
wildfly 26是wildfly系列的最新版本,它是Jakarta Platform规范的轻量级但是强大的实现。wildfly的一个最大的特点就是模块化,可以根据需要为应用服务器提供服务。
Jakarta EE的前称是Java EE,在2017年9月,Oracle将Java EE的源码贡献给了Eclipse Foundation,为了避免各种专利和品牌的问题,将Java EE改名为Jakarta EE。
wildfly可以在两种模式下面工作,他们是standalone和managed domain。
standalone模式表示的是一个独立的服务器,它们可以通过使用standalone.sh来启动。如果使用的是standalone模式,但是又需要使用多服务器的集群模式,那么需要用户自己在应用层去处理。
如果想中心化管理多个多个服务的话,那么可以用到managed domain模式。
在managed domain模式下,wildfly可以通过一个domain controller来控制和管理其他的domain server。
–简介部分源自 》 这位老哥
上面示意图中,一个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,server表示的是一个运行的应用程序。server和Host Controller 运行在不同的JVM中的,并且server是由Host Controller 来启动的。
不管是standalone还是managed domain,这都是取决于你内部的服务是怎么管理的,是一个个单独的部署还是使用中心化的管理方式,他们和外部用户的服务方式是无关的,也就是说不管使用standalone还是managed domain,都可以搭建服务集群。
安装说明1.官网下载zip解压,配置环境变量: JBOSS_HOME = 自己的解压目录
2.目录说明
- appclient – application client 客户端
- bin – 各种脚本的位置
- docs – 各种文档信息和配置例子
- domain – domain mode 的专门目录
- standalone – standalone server 的专门目录
- modules – server中的各种模块
- welcome-content – 默认的欢迎页面
3.这里用单机模式部署所以关注一下standalone 的目录结构即可:
- configuration – 配置文件目录
- data – server运行时的持久化存储信息
- deployments – 要部署的程序目录
- lib – server运行时依赖的lib
- log – 日志目录
- tmp – 临时文件
先创建Wildfly 用户,执行add-user.bat,根据提示创建好用户
创建空项目,添加EJB依赖
勾选Full Platform 规范包含EJB相关依赖
项目创建成功后,点击添加配置选择本地的Jboss 服务器,配置好本地Jboss 的服务器路径后直接启动服务即可进入Jboss 设置界面。进入管理台需要开始设置的管理员用户名和密码!
输入密码后即可登录管理台界面,管理台界面地址:http://localhost:9990/console/index.html
服务端:
创建一个接口-Hello
public interface Hello {
String say();
}
创建一个无状态的Java Bean - HelloSessionBean
import javax.ejb.Remote;
@javax.ejb.Stateless(name = "HelloSessionBean")
@Remote(Hello.class)
public class HelloSessionBean implements Hello {
public HelloSessionBean() {
}
@Override
public String say() {
return "Hello World,First EJB";
}
}
添加项目运行
看到以下提示说明成功部署
客户端:
创建客户端子模块EJB-Client ,创建方式与服务端相同
复制Hello接口到客户端模块的目录中,创建HelloClient主类,主类用Jboss提供的客户端使用JNDI调用远程Hello服务!
调用路径使用服务端启动后返回的路径,在服务端的控制台中可以看到:
访问路径:ejb:/EJB-LOAN-1.0-SNAPSHOT/HelloSessionBean!Hello
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;
public class HelloClient {
public static void main(String[] args) {
final Hashtable jndiProperties = new Hashtable<>();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
try {
final Context context = new InitialContext(jndiProperties);
Hello hello = (Hello) context.lookup("ejb:/EJB-LOAN-1.0-SNAPSHOT/HelloSessionBean!Hello");
System.out.println(hello.say());
} catch (NamingException e) {
e.printStackTrace();
}
}
}
创建配置文件:在resource 资源目录下建立jboss-ejb-client.properties
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port = 8080 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
将Jboss 的客户端模块依赖导入到客户端模块中



