作者:魔者 | 来源:互联网 | 2023-10-10 20:34
RPC远程服务调用在分布式项目架构中扮演着不可或缺的角色,近几年的运用也越来越广泛,主要目的旨在做到高可用的开发,RPC的相关框架有很多,比如阿里的Bubbo、HFS、脸书的Thr
RPC远程服务调用在分布式项目架构中扮演着不可或缺的角色,近几年的运用也越来越广泛,主要目的旨在做到高可用的开发,RPC的相关框架有很多,比如阿里的Bubbo、HFS、脸书的Thrift、谷歌的grcp、推特儿的finagle、新浪的Montan以及avro、ice、rpcx、Harpc、hessian等。各个框架都有其各自的优缺点。
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
【开发注意】
服务端:
包含Hessian的jar包
设计一个接口,用来给客户端调用
实现该接口的功能
配置web.xml,配置好相应的servlet
由于使用二进制RPC协议传输数据,对象必须进行序列化,实现Serializable接口
对于复杂对象可以使用Map的方法传递
客户端:
Java客户端包含Hessian的jar包
具有和服务器端结构一样的接口,包括命名空间都最好一样
利用HessianProxyFactory调用远程接口
Hessian的Demo
【客户端开发】
结构图
server.png
创建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();
}
接口实现类BasicService
/**
* Created with lvfang.
* Date: 2017/7/5
* Desc:接口实现类
*/
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的规定,通过URL调用接口)
HessianServlet
com.caucho.hessian.server.HessianServlet
service-class
com.lvfang.hessian.service.impl.BasicService
HessianServlet
/api/service
启动server服务
【客户端开发】
结构图:
client.png
同样创建Java工程HessianClient,添加hessian-3.0.1.jar包
创建与服务端一致的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
这样就完成了一个简单的跨服务调用