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)); } } }
