hessian学习笔记

一、hessian是什么

Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。——百度百科

 

学习hessian,必须知道什么是RPC。

实现RPC,必须解决如下几个问题:

1、通讯问题。

2、寻址问题。

3、序列化与反序列化。

带着这三个问题我们一起来探究一下hessian;

 

二、hessian怎么使用

首先,大家去下载源码,并导入到idea中打开;

https://github.com/zhaojiatao/learn_hessian

项目结构:

--learn_hessian

----api  客户端和服务端均共同引用的接口api

----client  客户端调用demo,包括本地直接通过代理对象调用以及使用spring集成方式调用

----webserver  通过传统servlet方式提供服务

----webserver_spring  与spring集成 提供服务

 

2.1服务端搭建:

2.1.1传统serlet方式搭建

在web.xml中配置HessianServlet,

指明服务地址:/hessian

及其实现类:com.zjt.learn.hessian.api.impl.GetUserInfoImpl

<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.zjt.learn.hessian.api.impl.GetUserInfoImpl</param-value></init-param></servlet><servlet-mapping><servlet-name>HessianServlet</servlet-name><url-pattern>/hessian</url-pattern></servlet-mapping>

 

package com.zjt.learn.hessian.api.impl;import com.zjt.learn.hessian.api.GetUserInfo;
import com.zjt.learn.hessian.dto.User;
import org.apache.commons.lang3.StringUtils;/*** Created by zhaojiatao@souche.com on 2018/4/17*/
public class GetUserInfoImpl implements GetUserInfo {@Overridepublic String getuserinfo(String id) {if(StringUtils.isNotBlank(id)){User user=new User();user.setId("1");user.setName("zhaojiatao");user.setAddress("hangzhou");user.setAge(18);user.setGender(1);return user.toString();}return null;}
}

 

2.1.2使用spring方式集成发布服务

首先在web.xml中配置springmvc:

<servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/remote/*</url-pattern></servlet-mapping>

 

配置applicationContext.xml:

使用HessianServiceExporter来处理请求;

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd"default-lazy-init="true"><bean id = "getuserService" class="com.zjt.learn.hessian.api.impl.GetUserInfoImpl"/><bean name="/getuserHessianService" class="org.springframework.remoting.caucho.HessianServiceExporter"><property name="service" ref="getuserService"/><property name="serviceInterface" value="com.zjt.learn.hessian.api.GetUserInfo"/></bean>
</beans>

 

 

 

2.2客户端调用

2.2.1使用传统方式调用远程服务

package test;import com.caucho.hessian.client.HessianProxyFactory;
import com.zjt.learn.hessian.api.GetUserInfo;/*** Created by zhaojiatao@souche.com on 2018/4/17*/
public class BasicClient {public static void main(String[] args) {try {String url = "http://localhost:8080/hessian";HessianProxyFactory factory = new HessianProxyFactory();factory.setOverloadEnabled(true);GetUserInfo getUserInfo = (GetUserInfo) factory.create(GetUserInfo.class, url);System.out.println(getUserInfo.getuserinfo("1"));System.out.println("over");}catch (Exception e){e.printStackTrace();}}}

 

 

2.2.2使用spring方式调用

新建spring.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd"default-lazy-init="true"><bean id="getuserService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"><property name="serviceUrl" value="http://localhost:8080/remote/getuserHessianService"/><property name="serviceInterface" value="com.zjt.learn.hessian.api.GetUserInfo"/></bean>
</beans>

 

 

package test;import com.zjt.learn.hessian.api.GetUserInfo;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Created by zhaojiatao@souche.com on 2018/4/18*/
public class BasicSpringClient {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:spring.xml"});GetUserInfo getUserInfo = (GetUserInfo)context.getBean("getuserService");System.out.println(getUserInfo.getuserinfo("1"));}}

 

 

hessian的使用是很简单的。大家自己照着代码敲一下就可以。

 

三、探究一下hessian的细节

回到文章开始提出的问题,即rpc框架需要解决的问题,看看hessian如何解决的。

3.1.通讯问题:

我们先看看客户端在发起远程请求前都经历了什么:

首先,客户端通过代理工厂对象HessianProxyFactory的create方法创建代理对象;

在create方法里可以看到,该代理对象在执行时的handler是通过HessianProxy代理对象的invoke方法来执行;典型的动态代理;

 

 在invoke方法中:

通过String methodName = method.getName();得到方法名

通过sendRequest方法取得和服务端的连接HessianConnection对象;

跟踪sendRequest方法,我们发现:

发现hessian是使用http协议进行网络通信;

 在is = getInputStream(conn);处等待服务端返回的响应;

 

 3.2 寻址问题

我们跟踪这里:

我们得出结论:hessian使用lookup方法来寻找远程服务;

 

3.3序列化与反序列化

我们继续看刚刚跟踪的客户端调用时执行的HessianProxy对象的invoke方法,

进入其中的

conn = sendRequest(mangleName, args);

再进入

out.call(methodName, args);

再进入

writeObject(args[i]);

 进入其Hessian2Output实现中

最终看到了hessian如何进行序列化:

serializer.writeObject(object, this);

 

 

至此,我们也可以梳理一下hessian客户端动态代理的执行流程:

 

我们再来看看服务端的执行细节:

通过后台的代码,可见我们所有的工作都围绕在HessianServlet在展开。该Servlet中有两个比较重要的方法:init()、service();

init方法初始化服务和服务对象,主要分为3步:

通过home-class或者service-class创建服务端的实现类实例;

init方法还会创建HessianSkeleton对象,这是Hessian服务端的核心功能部分。

HessianSkeleton继承自AbstractSkeleton,其构造方法,将会从实现类中抽取方法和方法的Method对象,并且存储到_methodMap中。

对于一个Servlet来说其service方法是对外提供服务的方法:

最主要的是调用HessianSkeleton对象的invoke方法。注意,Servlet实例中有两个HessianSkeleton变量,分别是:_objectSkeleton和 _homeSkeleton,

invoke方法:

首先从HessianInput对象中获取到Method信息,获取到真正的service对象。

根据反射机制,调用service对象的invoke方法,获取到返回值。

最后调用HessianOutput对象将结果写回到调用方。

 

 

 

 

 本文参考:

https://blog.csdn.net/sunwei_pyw/article/details/74002351

https://www.cnblogs.com/happyday56/p/4268249.html

 

转载于:https://www.cnblogs.com/zhaojiatao/p/8908335.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌浏览器手势_分享一些日常手势[狗头]

本文字数&#xff1a;2222字阅读时间&#xff1a;6分钟2020年05月19日星期二晴快分享一些工作中经常用到的快捷键&#xff0c;能帮助你提升工作效率&#xff0c;还能装13&#xff0c;下班时可以自豪地说一句&#xff1a;底薪到手&#xff0c;关机下班୧(๑•̀◡•́๑)૭Ctrl快…

北斗核心器件100%国产化,已接入大部分智能手机

来源&#xff1a;AI前线整理 | 冬梅、钰莹终于&#xff0c;中国在又一个领域达到核心器件 100% 纯国产。北斗核心器件国产化率 100%&#xff0c;22nm 芯片进入量产近日&#xff0c;在 2020 世界 5G 大会主论坛上&#xff0c;北斗卫星导航系统工程总设计师杨长风在会上分享了题为…

tensorrt轻松部署高性能dnn推理_NVIDIA TensorRT高性能深度学习推理

NVIDIA TensorRT高性能深度学习推理NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK。此 SDK 包含深度学习推理优化器和运行时环境&#xff0c;可为深度学习推理应用提供低延迟和高吞吐量。在推理过程中&#xff0c;基于 TensorRT 的应用程序的执行速度可比 CPU 平台的速度快…

Neuron最新研究:神经科学家测量球迷大脑对比赛的反应,试图挖掘人类的深层天性...

来源&#xff1a;brainnews2020年的1月27日早上&#xff0c;科比去世&#xff0c;父亲想办法安慰睡醒后的儿子&#xff1b;而在2020年11月26日早上&#xff0c;马拉多纳去世&#xff0c;儿子想办法安慰睡醒后的父亲。2020年&#xff0c;带走了全球无数球迷的青春。那么&#xf…

关于表情符号与UTF-8的探讨

4-23 现在无论原生还是网页端&#xff0c;表情符号绝大部分都可以正常显示&#xff0c;但是也有一部分是不能正常显示的。但存入到mysql的时候&#xff0c;不能够正常显示的表情符号&#xff0c;就会让mysql(utf-8)拜拜了。这个不仅仅是显示问题&#xff0c;很重要的一点是&…

删除数据清理oracle表空间,oracle数据库删除无用表空间及数据文件过程

应用场景&#xff1a;html数据库服务器A下的一张数据库表重建过&#xff0c;而且数据已经迁移到新表空间下&#xff0c;现遗留了一些原有的表空间数据文件在服务器上&#xff0c;耗费资源&#xff0c;如图所示&#xff1a;linux 原数据库表对应的数据文件&#xff1a;sql迁移后…

mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换

动态语言切换是很多国际化产品的需求&#xff0c;SOUI之前的版本支持静态多语言翻译&#xff0c;通过在程序启动时设置好语言翻译模块&#xff0c;在程序中打开的UI都会自动调用该翻译模块进行文字翻译&#xff0c;但是不支持运行进语言切换。最近几个网友都提到这个需求&#…

2020年中国面向人工智能“新基建”的知识图谱行业白皮书

全文共计1379字&#xff0c;预计阅读时间8分钟来源 | 艾瑞咨询&#xff08;经授权转载&#xff09;编辑 | 蒲蒲日前&#xff0c;认知智能国家重点实验室&艾瑞咨询联合发布《2020年面向人工智能“新基建”的知识图谱行业白皮书》。白皮书从善政、惠民、兴业、智融四个部分对…

海尔对话 Unity:作为数字转型的高阶形态,数字孪生发展前景不可逆

来源&#xff1a;数字化企业作为信息化发展到一定程度的必然结果&#xff0c;数字孪生正成为人类解构、描述和认识真实世界和虚拟世界的新型工具。从发展态势来看&#xff0c;数字孪生不仅是全新信息技术发展的新焦点&#xff0c;也是各国实现数字化转型的新抓手&#xff0c;还…

js整体缩小网页_SEO网页优化的原则是什么?

SEO网页优化的原则是什么?SEO优化对于网页的排名是非常重要的&#xff0c;排名高低直接影响到流量和转化&#xff0c;那么怎么优化呢&#xff0c;SEO网页优化的原则是什么?下面小编来告诉你SEO网页优化的原则。1、不要抄袭。因为独特的内容是所有搜索引擎都喜欢的&#xff0c…

蒲慕明:今人眼中的大脑之美 | 书评

圣地亚哥拉蒙-卡哈尔&#xff08;Santiago Ramn y Cajal, 1852-1934&#xff09;来源&#xff1a; 知识分子撰文&#xff1a;蒲慕明现代神经科学起源于十九世纪末期&#xff1b;圣地亚哥拉蒙-卡哈尔&#xff08;Santiago Ramn y&#xff09;的神经解剖学研究和他提出的神经元理…

sqlite 0转换为bit_Cisco Talos在SQLite中发现了一个远程代码执行漏洞

思科Talos的研究人员在SQLite中发现了一个use-after-free() 的漏洞&#xff0c;攻击者可利用该漏洞在受影响设备上远程执行代码。攻击者可以通过向受影响的SQLite安装发送恶意SQL命令来触发此漏洞。“Sqlite3 3.26.0的窗口函数&#xff08;Window_Function&#xff09;中存在可…

构建未来情报体系—— AI及大数据时代情报分析人员的战略价值

知远战略与防务研究所 沐俭/编译来自&#xff1a;美国战略与国际问题研究中心网站【知远导读】本篇推送编辑节选自美国战略与国际问题研究中心&#xff08;CSIS&#xff09;技术与情报专项研究小组撰写的一篇利用新兴科技提高情报分析人员的战略情报分析能力的文章&#xff0c;…

中国的自动驾驶到底发展到了什么程度?

来源&#xff1a;面包板社区中国在自动驾驶汽车&#xff08;AV&#xff09;领域投入了大量资金&#xff0c;计划大力发展汽车工业这一新兴领域&#xff0c;包括技术、初创企业、测试、法律法规和部署等各个方面。图1&#xff1a;在百度世界2020大会上&#xff0c;百度展示了其全…

数据挖掘算法_技术分享|大数据挖掘算法之KNNk近邻算法

程一舰数据技术处K最近邻(kNN&#xff0c;k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻&#xff0c;就是k个最近的邻居的意思&#xff0c;说的是每个样本都可以用它最接近的k个邻居来代表。KNN是通过测量不同特征值之间的距离进行分类。其基本…

岩板铺地好吗_别人都说岩板好,我笑他人乐太早

若说岩板是陶瓷行业目前最火爆的产品&#xff0c;相信没有人会睁眼说瞎话表示反对。据统计&#xff0c;目前国内已建成的岩板生产线已有55条&#xff0c;计划在下半年建成/投产的岩板生产线已有17条。照此势头发展下去&#xff0c;国内岩板生产线的条数在2021年将逼近100条&…

人工智能和自然智能能否交汇?李飞飞对话斯坦福神经生物学教授Bill Newsome

作者&#xff1a;SHANA LYNCH机器之心编译编辑&#xff1a;张倩计算在神经科学中扮演了什么角色&#xff1f;在分子水平上理解大脑能否带来更好的神经网络&#xff1f;人工智能和自然智能之间是否存在一道无法逾越的鸿沟&#xff1f;会不会出现一个研究智能的统一框架&#xff…

spring(三)-事务管理

1、 Spring事务管理 事务管理&#xff1a;本质是使用spring管理事务&#xff0c;完成数据库对于事务的支持。 事务&#xff1a;一系列对数据库操作的集合&#xff0c;一个操作错误&#xff0c;所有都必须回滚&#xff0c;其特点是acid。 &#xff08;1&#xff09;事务并发存在…

思科nat配置实例_Cisco ASA 5520(8.2.4)配置企业内网案例

思科防火墙ASA5520 外观网络拓扑图如下内网 网段 192.168.2.0/24公网IP地址 118.25.235.100公网IP地址网关:118.25.235.1.1防火墙内网IP:192.168.2.1/24配置步骤&#xff1a;1、基本配置及配置内外网接口conf thostname ASAFW #设置主机名enable secret pass123 #设置特权密码c…

刘伟:什么是智能人机交互?

本文来自刘伟科学网博客北京邮电大学 刘伟这是一个非常有趣的问题&#xff0c;既涉及智能又牵扯人机交互&#xff0c;更重要的是两者之间的联系。如果把人机交互看成脖子以下&#xff0c;即生理与物理之间的相互作用&#xff08;如视域、听域、可达域、舒适域&#xff09;的话&…