- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
因为最近有点时间,所以就想读一些技术的源码,最近选择hessian。废话不多说,进入正题:
hessian客户端时序图:
hessian服务端时序图:
因为hessian源码相对于spring算很简单了。所以不浪费大家宝贵的时间来分析源码。想说说怎么实现远程调用(rpc)。
远程调用,顾名思义就是通过远程调用别的机器(JVM or ...)中的方法。要想实现远程调用,思路是怎样呢?
常用的模式代理,工厂。为啥怎么说呢?
远程调用通过网络,肯定需要工厂产出不同的类,不然一个类写,会死人的。
代理模式,因为调用前你是不知道实际的调用,肯定是通过代理调用到远程方法。
下面给大家说说远程调用的原理(PS:不懂代理的同学,先上百度搜索:java代理)。
实现自定义的远程调用,就是序列化成字节流后,发送到服务端,服务端根据调用的api、方法、参数去具体调用一个方法,调用方法后把结果输入到输出流里面,最后结果展示在代理的return中。
ok,开始贴代码:
客户端(HttpRpcClient):
1
String url =?http://localhost:8080/hessian-study-server/helloworld1;
2
????????HttpProxyFactory factory =?new?HttpProxyFactory();
3
????????Class? clazz = Class.forName(com.jzx.hessian.server.SayHelloService);
4
????????SayHelloService sayHelloService = (SayHelloService) factory.create(clazz, url);
5
????????System.out.println(sayHelloService.sayHello(小明,?男));
6
????????UserVo vo = sayHelloService.sayHello1(小明,?男);
7
????????System.out.println(姓名:?+ vo.getName() +? 性别:?+ vo.getSex());
从代码中分析,首先创建了一个工厂类HttpProxyFactory,其次创建了一个类的描述。
HttpProxyFactory代码(主要目的是得到一个代理):
1
if?(api ==?null) {
2
????????????throw?new?NullPointerException(api must not be null for HttpProxyFactory.create());
3
????????}
4
????????InvocationHandler handler =?null;
5
?
6
????????handler =?new?HttpProxy(url,?this, api);
7
?
8
????????return?Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),?new?Class[] { api }, handler);
HttpProxy代理干了啥 (得到调用接口类、方法名、参数值):
1
HttpTransportation transportation =?new?HttpTransportation();
2
????????transportation.setClazz(api);
3
????????transportation.setMethod(method.getName());
4
????????transportation.setParams(args);
5
????????byte[] bytes = ObjectUtils.objectToByte(transportation);
6
????????Object result = sendPost(url, bytes);
7
????????return?result;
序列化对象发送POST请求:
01
PrintWriter out =?null;
02
????????BufferedReader in =?null;
03
????????Object result =?null;
04
????????try?{
05
????????????URL realUrl =?new?URL(url);
06
????????????// 打开和URL之间的连接
07
????????????URLCo
文档评论(0)