• 分布式.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>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>


     [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>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

    效果:

         

     逻辑:

           请求流程:

    • 使用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

  • 相关阅读:
    【React-hooks篇幅】自定义hooks
    JVM八股文
    Oracle SQL执行计划操作(4)——连接相关操作
    YOLOv8环境搭建
    JavaBean文字格斗游戏(面向对象编程)的个人重写以及个人解释
    Vue3 defineProps使用
    RK1126平台项目总结
    goland fold and unfold code fragment
    能否手写vue3响应式原理-面试进阶
    TensorFlow 2.10.0 已发布
  • 原文地址:https://blog.csdn.net/weixin_42754896/article/details/126447729