dubbo_實現Hessian的遠程調用協議


1.優點

  • 連接個數:多連接
  • 連接方式:短連接
  • 傳輸協議:HTTP
  • 傳輸方式:同步傳輸
  • 序列化:Hessian二進制序列化
  • 適用范圍:傳入傳出參數數據包較大,提供者比消費者個數多,提供者壓力較大,可傳文件。
  • 適用場景:頁面傳輸,文件傳輸,或與原生hessian服務互操作

  約束
  參數及返回值需實現Serializable接口
  參數及返回值不能自定義實現List, Map, Number, Date, Calendar等接口,只能用JDK自帶的實現,因為hessian會做特殊處理,自定義實現類中的屬性值都會丟失。

2.Hessian

Hessian是Caucho開源的一個RPC框架:http://hessian.caucho.com,其通訊效率高於WebService和Java自帶的序列化。
Hessian協議用於集成Hessian的服務,Hessian底層采用Http通訊,采用Servlet暴露服務,Dubbo缺省內嵌Jetty作為服務器實現。
依賴:
<dependency>
  <groupId>com.caucho</groupId>
  <artifactId>hessian</artifactId>
  <version>4.0.7</version>
</dependency>

  <dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty</artifactId>
    <version>6.1.26</version>
  </dependency>

3.provider

3.1.Jetty Server: (default): 

  <dubbo:protocol name="hessian" port="8080" server="jetty" />
  <dubbo:service interface="cn.com.hello.UserService" ref="userService" path="dubbo/users" />
  <bean id="userService" class="cn.com.hello.provider.impl.UserServiceImpl" />

  public static void main(String[] args) throws Exception {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "hello-provider.xml" });
    context.start();
    System.in.read();
  }

 

3.2.Servlet Bridge Server: (recommend)

<dubbo:protocol ... server="servlet" />


web.xml:
  <servlet>
    <servlet-name>dubbo</servlet-name>
    <servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dubbo</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
注意,如果使用servlet派發請求:
  協議的端口<dubbo:protocol port="8080" />必須與servlet容器的端口相同,
  協議的上下文路徑<dubbo:protocol contextpath="foo" />必須與servlet應用的上下文路徑相同。

4.consumer

4.1.提供方用標准Hessian暴露服務,消費方用Dubbo的Hessian協議調用

  <dubbo:reference id="userService" interface="cn.com.hello.UserService" url="hessian://10.20.153.10:8080/dubbo/users" />

 方法一:

package cn.com.hello;

import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:dubbo-consumer.xml")
public class HelloTest {

    @Autowired
    private UserService userService;

    @Test
    public void sayHello() throws Exception {

        String hello = userService.sayHello("guoxue");
        System.out.println(hello);

    }
    @Test
    public void getUsers() {

        List<?> list = userService.getUsers();
        if (list != null && list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
        }
    }
}

  方法二:

package cn.com.hello.consumer;

import java.util.concurrent.Callable;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.com.hello.UserService;
public class HelloConsumer {
    private AbstractXmlApplicationContext context;
    private UserService userService;

    public HelloConsumer(Callable<AbstractXmlApplicationContext> call) {
        super();
        try {
            context = call.call();
            context.start();
            userService = (UserService) context.getBean("userService");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private String sayHello(final String name) {
        return userService.sayHello(name);
    }

    public static void main(String[] args) {
        final String beanXML = "dubbo-consumer.xml"; 
        final String config =  beanXML;
        HelloConsumer consumer = new HelloConsumer(new Callable<AbstractXmlApplicationContext>() {
            public AbstractXmlApplicationContext call() throws Exception {
                final AbstractXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
                return context;
            }
        });
        String result = consumer.sayHello("dengzy");
        System.out.println(result);

    }

}

4.2.提供者用Dubbo的Hessian協議暴露服務,消費者直接用標准Hessian接口調用

    public static void main(String[] args) throws Throwable {

        String serviceUrl = "http://192.168.0.5:8080/dubbo/users";
        HessianProxyFactory factory = new HessianProxyFactory();

        UserService userService = (UserService) factory.create(UserService.class, serviceUrl);
        String result = userService.sayHello("dengzhiying");
        System.out.println(result);

        List<?> list = userService.getUsers();
        if (list != null && list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
        }
    }

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM