RPC遠程服務調用在分布式項目架構中扮演著不可或缺的角色铆帽,近幾年的運用也越來越廣泛胞枕,主要目的旨在做到高可用的開發(fā)压真,RPC的相關框架有很多娩嚼,比如阿里的Bubbo、HFS滴肿、臉書的Thrift岳悟、谷歌的grcp、推特兒的finagle泼差、新浪的Montan以及avro贵少、ice和屎、rpcx、Harpc春瞬、hessian等柴信。各個框架都有其各自的優(yōu)缺點。
Hessian是一個輕量級的remoting onhttp工具宽气,使用簡單的方法提供了RMI的功能随常。 相比WebService,Hessian更簡單萄涯、快捷绪氛。采用的是二進制RPC協(xié)議,因為采用的是二進制協(xié)議涝影,所以它很適合于發(fā)送二進制數據枣察。
【開發(fā)注意】
服務端:
包含Hessian的jar包
設計一個接口,用來給客戶端調用
實現(xiàn)該接口的功能
配置web.xml燃逻,配置好相應的servlet
由于使用二進制RPC協(xié)議傳輸數據序目,對象必須進行序列化,實現(xiàn)Serializable接口
對于復雜對象可以使用Map的方法傳遞
客戶端:
Java客戶端包含Hessian的jar包
具有和服務器端結構一樣的接口伯襟,包括命名空間都最好一樣
利用HessianProxyFactory調用遠程接口
Hessian的Demo
【客戶端開發(fā)】
結構圖
server.png
創(chuàng)建Web工廠HessianServer,添加hessian-3.0.1.jar包
User類
/**
* Created with lvfang.
* Date: 2017/7/5
* Desc:容器類
*/
public class User implements Serializable {
private String name;
private Integer age;
public User() { }
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
//getter setter方法
}
接口IBasicApi
/**
* Created with lvfang.
* Date: 2017/7/5
* Desc:接口類
*/
public interface IBasicApi {
public boolean setUserName(String name);
public String sayHello();
public User getUser();
}
接口實現(xiàn)類BasicService
/**
* Created with lvfang.
* Date: 2017/7/5
* Desc:接口實現(xiàn)類
*/
public class BasicService implements IBasicApi {
private String name;
public boolean setUserName(String name) {
this.name = name;
return false;
}
public String sayHello() {
return "Hello "+ name+",Welcome to Hessian!";
}
public User getUser() {
return new User(name, 23);
}
}
配置servlet(接口URL的規(guī)定猿涨,通過URL調用接口)
<servlet>
<servlet-name>HessianServlet</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>service-class</param-name>
<param-value>com.lvfang.hessian.service.impl.BasicService</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HessianServlet</servlet-name>
<url-pattern>/api/service</url-pattern>
</servlet-mapping>
啟動server服務
【客戶端開發(fā)】
結構圖:
client.png
同樣創(chuàng)建Java工程HessianClient,添加hessian-3.0.1.jar包
創(chuàng)建與服務端一致的com.lvfang.hessian.domain.User和com.mahc.hessian.service.impl.IBasicApi
測試類Test
public static void main(String[] args) throws MalformedURLException {
String url = "http://localhost:8080/HessianServer/api/service";
HessianProxyFactory factory = new HessianProxyFactory();
IBasicApi api = (IBasicApi) factory.create(IBasicApi.class, url);
api.setUserName("lvfang");
System.out.println(api.sayHello());
System.out.println(api.getUser().getName());
System.out.println(api.getUser().getAge());
}
調用結果
result.png
這樣就完成了一個簡單的跨服務調用