1、 hessian 主要结构:客户端 、服务端,中间基于http传输
客户端:对远程接口调用序列化为流,并传输到服务端
服务端:把传输过来的流发序列为服务的请求,调用相应的服务后把结果序列化为流返回给客户端
通过动态代理模式,流(二进制)传输,实现的。
2、客户端:
HessianProxyFactory factory = new HessianProxyFactory();
HelloHessian helloHessian = (HelloHessian)factory.create(HelloHessian.class,url)
helloHessian.sayHello(new User(10, "tiger"))
原生的调用应该这样写,但是我们在使用的时候通过了Spring的进一步的封装
--------->根据ServiceUrl 和 serviceInterface 来创建 HessianProxyFactoryBean 类
--------->(spring 的封装类),这时候我们已经放进去了 url 和 interface(class)
---------> 最终是通过调用hessionClientInterceptor 的createHessianProxy(HessianProxyFactory proxyFactory)方法
--------->通过HessianProxyFactory的create(getServiceInterface(), getServiceUrl(), getBeanClassLoader()) 方法
--------->HessianProxyFactory 的 create(Class<?> api, URL url, ClassLoader loader)方法
其中crete()方法如下:
public Object create(Class<?> api, URL url, ClassLoader loader) {
if (api == null) {
throw new NullPointerException("api must not be null for HessianProxyFactory.create()");
} else {
InvocationHandler handler = null;
handler = new HessianProxy(url, this, api);
return Proxy.newProxyInstance(loader, new Class[]{api, HessianRemoteObject.class}, handler);
}
}
最终还是动态代理模式,调用HessianProxy它的invoke方法
HessianProxy具体代码分析如下
HessianProxy implements InvocationHandler, Serializable { //代码中也可以看出,HessianProxy是一个代理类
所以动态代理最终还是会调用其invoke方法,解析invoke方法如下:
----->获取方法名 String methodName = method.getName();
----->获取传入参数 Object value = args[0];
----->通过方面名和服务端取得链接 conn = this.sendRequest(mangleName, args);
----->发送请求 int code = ((InputStream)is).read();
----->//....等待服务器端返回相应结果
----->获取返回值 value = new HessianProxy.ResultInputStream(conn, (InputStream)is, in, (InputStream)value);
3、服务端的代码
(写代码还是要懂得封装的,一个类把所有的东西都准备好(属性,相关调用的方法),然后再写一个实体类来extends该类,做上层接口的封装。)
org.springframework.remoting.caucho.HessianServiceExporter
----->HessianServiceExporter 的 handleRequest(HttpServletRequest request, HttpServletResponse response) 来接受请求
----->HessianExporter 的 invoke(InputStream inputStream, OutputStream outputStream) 方法来处理请求
----->HessianExporter 中的 doInvoke 方法中将inputStream、outputStream 转换为AbstractHessianInput、AbstractHessianOutput 流的转换
----->HessianSkeleton 的 invoke(AbstractHessianInput in, AbstractHessianOutput out) 方法
----->在上述方法中,获取方法名、方法的参数、参数的类型,最终调用result = method.invoke(service, values);
来反射找到所需要调用的实体类方法,获得返回结果,写到流中
4、HessianSkeleton
HessianSkeleton是Hessian的服务端的核心,后续添加
5、实际应用,两个封装成两个类
网上有很多
6、RPC机制就是客户端发送给服务端想要调用的函数及参数值,服务端通过客户端发送过来的函数和参数值通过反射机制进行函数调用执行,
然后将执行结果返回给客户端,这样一个RPC的调用过程结束了