系列博文:
分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客
分布式.RPC-WebService三要素,三个规范, Soap协议_闲猫的博客-CSDN博客
分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)_闲猫的博客-CSDN博客
分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客
目录
RMI是远程调用的技术,Hessian是RMI思想的具体实现框架。
RMI简介
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
这个是两个java虚拟机之间的调用,所以对程序有要求。客户端调用服务器的接口时必须在本地有个服务器发布的接口(Interface)。
特点:效率较快(比Socket慢),只能有Java实现,传输二级制数据,基于应用层HTTP协议的技术。
Hessian简介
Hessian是实现RMI的轻量级框架,采用的是二级制的RPC协议。基于HTTP协议。Hessian服务端核心处理类依赖的是Web容器,所以发布服务器端是需要部署的Tomcat、Jetty或者别的web服务器上。
Hessian入门
服务端
步骤:
- 创建web工程,添加hessian的jar包
- 编写业务接口
- 编写业务实现类
- 配置web.xml
- 测试
实现:
- 创建web工程,添加hessian的jar包
2. 实现模型类
这里的模型类指的是需要传输的类(不讨论跟数据库交互的Domain),因为Hessian传输的是二级制数据,所以这里的类必须序列化(实现Serializable接口),否则在报错:
java.lang.IllegalStateException: Serialized class cn.itcast.model.Member must implement java.io.Serializable.
Model类实现示例:
public class Member implements Serializable[ww1] {
private static final long serialVersionUID = -7197511997605564716L;
private Integer uuid;
private String name;
// 有参/无参构造方法
// setter/getter方法
// toString方法
}
3. 编写业务接口
- 这个接口是为了给客户端调用暴漏的接口,所以没用的接口就不用暴漏了
- 这同时这个接口类是需要复制到客户端的
- 这个接口必须有是实现类
- 这个也需要配置到Servlet中做初始化参数(init-param/param-name=home-api)
public interface IMemberService {
public String get(Integer i);
public Member getMember(String sn);
public String setMember(Member member);
}
4. 编写业务实现类
- 该业务实现类需要在Servlet中配置(init-param/param-name=home-class)
public class MemberService implements IMemberService[ww1] {
public String get(Integer i) {
return "张三";
}
public Member getMember(String sn) {
return new Member(11, "赵芸");
}
public String setMember(Member member) {
return member.toString();
}
}
[ww1]实现业务接口
5. 配置Web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>hessianServlet</servlet-name>
<servlet-class>
com.caucho.hessian.server.HessianServlet[ww1]
</servlet-class>
<init-param>
<param-name>home-api[ww2] </param-name>
<param-value>cn.itcast.servierI.IMemberService[ww3] </param-value>
</init-param>
<init-param>
<param-name>home-class[ww4] </param-name>
<param-value>cn.itcast.Service.MemberService[ww5] </param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hessianServlet</servlet-name>
<url-pattern>/member[ww6] </url-pattern>
</servlet-mapping>
</web-app>
6. 测试接口
在浏览器中测试,输入地址方法前面配置的Servlet,格式如下:
http://ip:port/webname/serlveturl
如:http://127.0.01:8080/项目名/member
如果出现如下结果表示服务没问题:
客户端
步骤:
- 创建java工程,引入hessian的jar包
- 添加业务接口到客户端
- 编写代码调用远程服务
实现:
- 创建java工程,引入hessian的jar包
2. 添加业务接口到客户端
3. 编写代码调用远程服务
public static void main(String[] args) {
HessianProxyFactory hessianFactory [ww1] = new HessianProxyFactory();
try {
IMemberService member = (IMemberService) hessianFactory
.create("http://localhost:8080/server/member[ww2] ");
Member me = member.getMember("");
System.out.println(me.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
说明
如果是多个接口,那么就配置多个Servlet,每个servlet的处理类就是HessianServlet,然后配置两个初始化参数init-param,param-name分别是home-api/home-class分别表示业务接口和业务实现类。
Hessian与spring整合开发
服务端
步骤:
1. 创建web工程 ,引入hessian与spring整合的jar包
基于http请求,且Hessian依赖web容器,这里将使用SpringMVC中的DispatcherServlet作为前端控制器
jar包由Spring的jar包和Hessian的那一个jar组成。
2. 编写业务接口和实现类(同上)
3. 修改web.xml
配置Springmvc的前端控制器 DispatcherServlet
4. 编写spring配置文件
- 头是Spring配置文件(applicationContext.xml)的头
- 只配置Bean节点
- 命名:servlet-name属性值-servlet.xml
- 核心处理类:HessianServiceExporter
- 位置:在WEB-INF目录下
5. 测试
使用浏览器访问配置serlver,如果出现“HTTP Status 405 - HessianServiceExporter only supports POST requests”,表示服务正常。
实现:
1. 创建web工程 ,引入hessian与spring整合的jar包
WEB工程:
Jar包:
2. 编写业务接口和实现类(同上)
模型类:
public class Member implements Serializable[ww1] {
private static final long serialVersionUID = -7197511997605564716L;
private Integer uuid;
private String name;
// 有参/无参构造方法
// setter/getter方法
// toString方法
}
业务接口:
public interface IMemberService {
public String get(Integer i);
public Member getMember(String sn);
public String setMember(Member member);
}
业务实现类:
public class MemberService implements IMemberService {
public String get(Integer i) {
return "张三";
}
public Member getMember(String sn) {
return new Member(11, "赵芸");
}
public String setMember(Member member) {
return member.toString();
}
}
3. 修改web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>hessian</servlet-name>
<!-- Spring WEB MVC 提供的前端控制器 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hessian</servlet-name>
<url-pattern>/hessian/*</url-pattern>
</servlet-mapping>
</web-app>
4. 编写spring配置文件
hessian-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
">
<bean id="member" class="cn.itcast.Service.MemberService" />
<bean name="/member"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="serviceInterface"
value="cn.itcast.servierI.IMemberService" />
<property name="service" ref="member" />
</bean>
</beans>
5. 测试
URL:
http://localhost:8080/server/hessian/member
效果:
逻辑:
请求流程:
- 使用url地址找到Servlet处理类(进行匹配)
- 如果请求信息不符合要求就返回异常
- 如果符合,就根据servlet名称在WEB-INF目录下找“servlet名称-servlet.xml”文件
- 在此文件中根据url-pattern匹配出的字符串“member”
- 使用该字符串找到匹配的Bean
流程图示:
客户端
步骤:
1. 创建java工程 ,引入hessian与spring整合的jar包 applicationContext.xml
客户端就是调用Bean,也用不着Web容器,引入的包同服务端的,配置文件是Spring的配置文件:applicationContext.xml ,文件中只需要bean节点,不需要引入其他的命名空间。
2. 复制业务接口到客户端
3. 编写applicationContext.xml 配置bean
在Spring配置文件中配置核心类HessianProxyFactoryBean的Bean。给核心类注入:serviceUri(获取地址,浏览器测试地址) 和serviceInterface(业务接口)。在程序中获取该Bean,并转为业务接口
4. 编写代码调用bean
使用Spring获取Bean的方式获取,然后将获取的Bean对象强转为serviceInterface注入的接口类。
实现:
1. 创建java工程 ,引入hessian与spring整合的jar包 applicationContext.xml
2. 复制业务接口到客户端
模型类和业务接口,都是复制服务端的,也就是说服务端给哪些接口客户端才能调用哪些功能。 这些类一般都是服务端打成一个jar包给客户端,客户端引入jar包即可。
3. 编写applicationContext.xml 配置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
">
<bean id="member" class=
"org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl"
value="http://localhost:8080/server/hessian/member[ww1] " />
<property name="serviceInterface"
value="cn.itcast.servierI.IMemberService[ww2] "/>
</bean>
</beans>
4. 编写代码调用bean
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
IMemberService service = (IMemberService) context.getBean("member")[ww1] ;
Member member = service.getMember("");
System.out.println(member.toString());
}
[ww1]获取bean对象并且强找为业务接口对象
逻辑:
调用流程:
- 添加Spring配置文件applicationContext.xml文件(相比Spring的那个没有特殊要求,只会配置Bean标签)
- 在Spring配置文件中配置核心类HessianProxyFactoryBean的Bean
- 给核心类注入:serviceUri(获取地址,浏览器测试地址) 和serviceInterface(业务接口)
- 在程序中获取该Bean,并转为业务接口
- 使用该业务接口调用,就会调用的服务器(远程)
逻辑图示:
END