分布式.RPC调用-RMI & Hessian框架

 系列博文:

分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客

分布式.RPC-WebService三要素,三个规范, Soap协议_闲猫的博客-CSDN博客

分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)_闲猫的博客-CSDN博客

分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客

分布式.RPC-WebService CXF框架_闲猫的博客-CSDN博客

分布式.RPC-WebService Restful风格实现_闲猫的博客-CSDN博客


目录

RMI简介

Hessian简介

Hessian入门

服务端

客户端

说明

Hessian与spring整合开发

服务端

客户端


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入门

服务端

步骤:

  1. 创建web工程,添加hessian的jar包
  2. 编写业务接口
  3. 编写业务实现类
  4. 配置web.xml
  5. 测试

实现:

  1. 创建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方法

}

 [ww1]就是一个实现了Serializable [ww1]接口的JavaBean

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>


 [ww1]处理的请求的Servlet

 [ww2]这个字符串是固定的,表示业务接口

 [ww3]配置业务接口

 [ww4]这个字符串也是固定的,表示业务实现类

 [ww5]配置业务实现类

 [ww6]配置一个获取该业务接口的Servlet地址,“/”是必须的,配置同Servlet配置

6. 测试接口

              在浏览器中测试,输入地址方法前面配置的Servlet,格式如下:

              http://ip:port/webname/serlveturl

              如:http://127.0.01:8080/项目名/member

              如果出现如下结果表示服务没问题:

          

客户端

步骤:

  1. 创建java工程,引入hessian的jar包
  2. 添加业务接口到客户端
  3. 编写代码调用远程服务

实现:

  1. 创建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();

    }

}


 [ww1]使用该对象,根据url地址来获取业务接口实现的对象

 [ww2]这个第一就是在浏览器中测试那个地址

说明

       如果是多个接口,那么就配置多个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方法

}


 [ww1]就是一个实现了Serializable [ww1]接口的JavaBean

业务接口:

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>


 [ww1]浏览器测试时的url

 [ww2]配置业务接口

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对象并且强找为业务接口对象

逻辑:

       调用流程:

  1. 添加Spring配置文件applicationContext.xml文件(相比Spring的那个没有特殊要求,只会配置Bean标签)
  2. 在Spring配置文件中配置核心类HessianProxyFactoryBean的Bean
  3. 给核心类注入:serviceUri(获取地址,浏览器测试地址) 和serviceInterface(业务接口)
  4. 在程序中获取该Bean,并转为业务接口
  5. 使用该业务接口调用,就会调用的服务器(远程)

逻辑图示:


END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值