Hessian远程调用框架进阶教程(一) Hessian介绍JAVA使用Hessian进行编程实例

Hessian介绍

hessian是一个采用二进制格式传输的服务框架,相对传统的SOAP web service,更轻捷。官网地址:http://hessian.caucho.com/,该公司还有一个比较有意思的web服务框架:http://baratine.io/,感兴趣的可以尝试玩下见入门教程http://doc.baratine.io/v1.0/tutorials/hello-eclipse-maven/

(本文章分享在CSDN平台,更多精彩请阅读 东陆之滇的csdn博客:http://blog.csdn.net/zixiao217 ,如在其他平台看到此文可能会出现内容不完整的现象,请移至东陆之滇http://blog.csdn.NET/zixiao217查看原文)

Dubbo提供了RPC服务、服务治理,而Spring Cloud则涵盖了微服务的方方面面,服务治理只是其中的一个方面,关于二者的比较,可以参看程序猿DD的一篇博客–微服务架构的基础框架选择:Spring Cloud还是Dubbo?。尽管国内大部分互初创联网公司几乎是用Zookeeper+Dubbo搭建的架构,而Spring Cloud商用成熟产品少之又少,但是笔者个人觉得未来短时间之内Spring Cloud必火,各位不要错过了。转入正题,我们已经有了Dubbo、Spring Cloud为什么还要了解Hessian呢?因为

  • Hessian很简单,理解其使用和机制之后,有助于你理解其他微服务框架(这是重点,本教程理解的越深越细,对学习微服务框架帮助越大这也是我们所期望的)
  • Hessian是基于 Http 协议进行传输的,初中级程序猿都很熟悉的通信协议
  • Hessian是一种RPC框架,就是远程方法调用,一个服务中某个类可以调用其他服务的某个类的某个方法

那么接下来就好理解了,Hessian是一个使用Http协议进行远程方法调用的框架。
使用Http协议,必须有一个Web服务(Hessian服务端或者叫提供者–dubbo的叫法);
应用端亦即消费端通过方法调用的形式获得代理对象,调用服务端的接口实现方法;
应用端和服务端都需要持有公共服务的接口信息;

使用hessian需要引入依赖:

<!-- 引入hessian依赖 -->
    <dependency>
      <groupId>com.caucho</groupId>
      <artifactId>hessian</artifactId>
      <version>4.0.38</version>
    </dependency>

我们以一个简单的例子入门:获取一个用户的信息。

  • 公共服务接口类:中间工程jar包middleProject,仅仅包含hello方法和一个重新设置用户年龄的方法。
  • 服务端:构建成一个web服务,只有一个接口实现类需要依赖middleProject,需要配置成hessian服务。
  • 客户端:同样依赖middleProject,使用hessian代理工厂实例化公共接口服务类,然后调用该实例的方法。

公共接口服务(打包成jar,让服务端、client端都需要依赖)

该接口定义了两个简单方法:

  • helloWorld方法,返回一个简单字符串
  • getMyInfo方法,传入一个复杂对象,并重新设置其age属性,再将新的user对象返回给client端。

HelloService.java

package org.byron4j.hessian.service;

import org.byron4j.hessian.entity.User;

/**
 *  @author     Byron.Y.Y
 *  @optDate    2016年12月6日
 *  This class is for ...
 */
public interface HelloService {

    public String helloWorld(String message);

    public User getMyInfo(User user);

}

用户类是一个简单的POJO,需要实现Serializable接口以序列化
User.java

package org.byron4j.hessian.entity;

import java.io.Serializable;
import java.util.Map;

/**
 *  @author     Byron.Y.Y
 *  @optDate    2016年12月6日
 *  This class is for ...
 */
public class User implements Serializable{


    /**
     * 
     */
    private static final long serialVersionUID = -1352128884522619903L;

    private String userName;

    private int age;

    private Map<String, Object> detailData;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Map<String, Object> getDetailData() {
        return detailData;
    }

    public void setDetailData(Map<String, Object> detailData) {
        this.detailData = detailData;
    }

}

公共服务需要打包成jar包,hessian服务端、client端都需要依赖该jar;或者使用maven构建的话将公共服务需要打包成jardeploy到私服中,hessian服务端、client端都通过maven坐标引入依赖(本系列文章采取的方式)。

Hessian服务端

服务端必须暴露服务,我们将其发构建成一个web服务,在web.xml中配置指定hessian服务的接口以及具体的实现服务、servlet;该工程只有一个实现HelloService接口的类HelloServiceImpl并且继承自HessianServlet。

HelloServiceImpl.java

package org.byron4j.hessian.service.impl;

import org.byron4j.hessian.entity.User;
import org.byron4j.hessian.service.HelloService;

import com.caucho.hessian.server.HessianServlet;

/**
 *  @author     Byron.Y.Y
 *  @optDate    2016年12月6日
 *  
 */
public class HelloServiceImpl extends HessianServlet  implements HelloService{

    /**
     * 
     */
    private static final long serialVersionUID = -3537274030227675984L;

    @Override
    public String helloWorld(String message) {
        return "Hello, " + message;
    }

    @Override
    public User getMyInfo(User user) {
        if(null == user){ return new User(); }

        user.setAge(99);
        return user;
    }


}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd"> 
    <display-name>hessian-showcase</display-name>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>hessian-service</servlet-name>

        <servlet-class>
            com.caucho.hessian.server.HessianServlet
        </servlet-class>

        <init-param>            
            <param-name>home-class</param-name>            
            <param-value>
                <!-- 服务实现类 -->
                org.byron4j.hessian.service.impl.HelloServiceImpl
            </param-value>
        </init-param>

        <init-param>            
            <param-name>home-api</param-name>
            <!-- 服务接口 -->
            <param-value>
                org.byron4j.hessian.service.HelloService
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>hessian-service</servlet-name>
        <url-pattern>/hessian</url-pattern>
    </servlet-mapping>

</web-app>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.byron4j</groupId>
  <artifactId>hessian</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>hessian</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>

    <!-- 引入hessian依赖 -->
    <dependency>
      <groupId>com.caucho</groupId>
      <artifactId>hessian</artifactId>
      <version>4.0.38</version>
    </dependency>

    <!-- 引入接口服务定义(公共服务接口jar包) -->
    <dependency>
     <groupId>org.byron4j</groupId>
     <artifactId>hessianMiddleJar</artifactId>
     <version>0.0.1-SNAPSHOT</version>
   </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!-- 引入servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>hessionDemo</finalName>


    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
  </build>
</project>

Hessian Client端

client端同样需要依赖公共服务jar,该项目只有一个单元测试类HessianClient。使用HessianProxyFactory创建接口服务

HessianProxyFactory factory = new HessianProxyFactory();
HelloService helloService = (HelloService) factory.create(HelloService.class, url);
helloService.helloWorld("kitty!")

HessianClient.java

package org.byron4j.hessionClient;

import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.byron4j.hessian.entity.User;
import org.byron4j.hessian.service.HelloService;
import org.junit.Test;

import com.caucho.hessian.client.HessianProxyFactory;

/**
 * Hello world!
 *
 */
public class HessianClient 
{
    static ExecutorService es =  Executors.newFixedThreadPool(10);
    /**
     * 测试hessian服务是否可用,并要求在2秒内获得响应
     * @throws MalformedURLException
     */
    @Test//(timeout = 2000)
    public void testService4Success() throws MalformedURLException {        

        String url = "http://localhost:8080/hessionDemo/hessian";
        System.out.println("请求的服务端地址:" + url);

        HessianProxyFactory factory = new HessianProxyFactory();
        HelloService helloService = (HelloService) factory.create(HelloService.class, url);
        System.out.println("服务端返回结果为:" + helloService.helloWorld("kitty!"));


        HashMap<String, Object> detailData = new HashMap<String, Object>();
        detailData.put("isMarried", "N");
        detailData.put("gender", "F");

        User user = new User();
        user.setAge(18);
        user.setUserName("OYY");
        user.setDetailData(detailData);

        int time = 100000;
        long startTime = System.currentTimeMillis();
        for(int i = 0; i< time; i++){
            es.execute(new Runnable() {

                @Override
                public void run() {
                    helloService.getMyInfo(user);
                }
            });

        }

        System.out.println(time + "次调用耗时:" + (System.currentTimeMillis() - startTime));
        System.out.println("+--获得复杂对象:" );
        System.out.println("      +--新年龄:" + helloService.getMyInfo(user).getAge());
        System.out.println("      +--隐私信息:" + helloService.getMyInfo(user).getDetailData());

    }
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.byron4j</groupId>
  <artifactId>hessionClient</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>hessionClient</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <!-- 引入hessian依赖 -->
    <dependency>
      <groupId>com.caucho</groupId>
      <artifactId>hessian</artifactId>
      <version>4.0.38</version>
    </dependency>

    <!-- 引入接口服务定义(公共服务接口jar包) -->
    <dependency>
     <groupId>org.byron4j</groupId>
     <artifactId>hessianMiddleJar</artifactId>
     <version>0.0.1-SNAPSHOT</version>
   </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>hessionClientDemo</finalName>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
  </build>
</project>

实例运行结果

运行client单元测试结果如下,本实例还增加了一个线程实例用于测试单线程高访问量、多线程多访问量使用hessian RMI调用的时间。

请求的服务端地址:http://localhost:8080/hessionDemo/hessian
服务端返回结果为:Hello, kitty!
100000次调用耗时:33
+--获得复杂对象:
      +--新年龄:99
      +--隐私信息:{isMarried=N, gender=F}

源代码下载

Hessian远程调用框架学习一,第一个JAVA使用hessian的入门demo,简单实用易理解 http://download.csdn.net/detail/zixiao217/9709949

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值