系列博文:
分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客
分布式.RPC-WebService三要素,三个规范, Soap协议_闲猫的博客-CSDN博客
分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)_闲猫的博客-CSDN博客
分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客
目录
RMI是远程调用的技术,Hessian是RMI思想的具体实现框架。
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
这个是两个java虚拟机之间的调用,所以对程序有要求。客户端调用服务器的接口时必须在本地有个服务器发布的接口(Interface)。
特点:效率较快(比Socket慢),只能有Java实现,传输二级制数据,基于应用层HTTP协议的技术。
Hessian是实现RMI的轻量级框架,采用的是二级制的RPC协议。基于HTTP协议。Hessian服务端核心处理类依赖的是Web容器,所以发布服务器端是需要部署的Tomcat、Jetty或者别的web服务器上。

步骤:
实现:


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. 编写业务接口
public interface IMemberService {
public String get(Integer i);
public Member getMember(String sn);
public String setMember(Member member);
}
4. 编写业务实现类
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>hessianServletservlet-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>hessianServletservlet-name>
<url-pattern>/member[ww6] url-pattern>
servlet-mapping>
web-app>
6. 测试接口
在浏览器中测试,输入地址方法前面配置的Servlet,格式如下:
http://ip:port/webname/serlveturl
如:http://127.0.01:8080/项目名/member
如果出现如下结果表示服务没问题:

步骤:
实现:

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分别表示业务接口和业务实现类。
步骤:
1. 创建web工程 ,引入hessian与spring整合的jar包
基于http请求,且Hessian依赖web容器,这里将使用SpringMVC中的DispatcherServlet作为前端控制器
jar包由Spring的jar包和Hessian的那一个jar组成。
2. 编写业务接口和实现类(同上)
3. 修改web.xml
配置Springmvc的前端控制器 DispatcherServlet
4. 编写spring配置文件
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>hessianservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>hessianservlet-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
效果:

逻辑:
请求流程:
流程图示:

步骤:
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对象并且强找为业务接口对象
逻辑:
调用流程:
逻辑图示:

END