基于hessian和netty的RPC框架设计和实现

标签: hessian netty rpc | 发表时间:2016-08-31 17:07 | 作者:wj596
出处:http://www.iteye.com

基于hessian和netty的RPC框架设计和实现

 

一:概述

        对系统进行服务化改造,或者构建一个分布式系统,RPC是核心的组件,目前主流的RPC框架有hessian\thrift\ avro等,如果不考虑跨语言的话thrift\ avro使用起来稍显复杂,要写IDL序列化配置,hessian又依赖servlet容器,于是使用netty和hessian构建了一个的RPC框 架。

        hessian是一种二进制的序列化工具,支持C++,python,rubyd等跨平台,但主要是面向java平台,其他语言的实现更新很慢。以下是参 考网上的hessian序列化性能测试情况,从测试指标来看,跟Protocol Buffers有些差距,但总体表现还是不错的。

              序列化


 

             反序列化

      Netty 是一个基于NIO的网络通讯、服务器端编程框架,使用Netty 可以快速和简单的开发出一个网络应用,据非权威测试,在请求应答消息相同的情况下,HTTP方式的TPS是500左右,Netty模式是1.5万左右,还 有更极端的优化到了10W TPS。可见其性能,稳定性和伸缩性都是在业界被普遍认可的。

        RPC的核心就是数据序列化和网络传输,一个典型的PRC服务发布和调用过程主要经历三个阶段,服务导出,服务处理,数据传输,如下图:


 

二:服务导出

服务定义

服务元数据


 

导出工具

一般会在服务器启动前进行导出


 

      以上就是服务导出的过程,首先的定义服务属性,包括服务名称,接口,实现类。然后就是服务的元数据,包含接口,方法签名。所谓导出,其实就是将这些元数据解析出来并进行缓存,以便在调用过程中能够根据服务名称找到服务的定义。

三 网络服务

 

      RPC服务器,通过NETTY的ServerBootStrap来定义,可以看到是使用NIO的方式来处理网络读写的 (NioServerSocketChannelFactory)。bossThreadFactory用来接收客户端连 接,workerThreadFactory用来执行具体的IO操作。ChannelPipeline是一个消息通道,对消息进行编码,解码,压缩,处理 的一个处理器链条,应该是Chain of Responsibility。rpcHandler 是进行服务查找,序列化,反序列化,反射调用的处理器,也是整个RPC框架的核心。

     rpcHandler 继承自SimpleChannelUpstreamHandler,ChannelUpstreamHandler处理上行的通道事件,并且在流水线中传 送事件。这个接口最常用的场景是拦截IO工作线程产生的事件,传输消息或者执行相关的业务逻辑。在大部分情况下,我们是使用 SimpleChannelUpstreamHandler 来实现一个具体的upstream handler,因为它为每个事件类型提供了单个的处理方法。大多数情况下ChannelUpstreamHandler 是向上游发送事件。

       rpcHandler 中使用独立的threadpool是用来处理具体业务的操作,尽量不占用IO线程(Server中的workerThreadFactory)。

     doSerivce是处理服务请求的方法,通过URL获取serviceName,再从输入流中用hessian反序列化获取 AbstractHessianInput,能从中获取调用方法的名称,参数列表,参数类型列表等调用方信息。有了这些信息就可以从 SerivceExporter中获取服务定义,找到服务的实现类processorClass,进行反射调用并返回结果。服务处理的过程,其实就是一个 HTTP监听,拿到请求数据,反序列化,反射调用并返回的过程。

 

四 客户端

     客户端可以方便的通过Hessian自带的代理工厂进行实现,用短连接进行同步调用。一般RPC使用异步调用的情况不多,使用HessianProxyFactory可以满足大部分场景。

        如果RPC中处理的方法耗时较长或者对性有极高的要,则需要使用可复用的长连接进行异步调用,在做这个RPC工具的时候没有实现异步客户端,不过在别的项目中用到过异步调用的情况,这里给出实现代码供参考。

           以上是一个异步的netty客户端,大致思路就是,每一次发送请求都会给request一个 ID(atomicLong.getAndIncrement()),并实例化一个ResponseFuture进行缓存,当发送同步请求的时候,调用 Condition中的await方法,让线程阻塞,成功返回后,调用Condition中的signal唤醒阻塞的线程。当发送异步请求的时候,不阻塞 线程,成功返回后,根据ResponseFuture中的request id找到回调函数,进行回调。最后删除ResponseFuture缓存。

五  SPRING 支持

      现在的企业开发spring有一统天下的趋势,如果RPC工具不支持SPRING集成,使用起来非常不方便。Spring提供自定义配置支持,通过扩展Schema,就可以完成标签的配置。

     第一步、在classpath下新建META-INF目录,在目录中定义nhrpc.XSD

      第二部、定义spring.handlers

      第三步、定义spring.schemas

第四步、实现命名空间处理器和标签解析器

      命名空间处理器集成自NamespaceHandlerSupport,作用是告诉spring标签用那个解析器来解析。

       标签解析器实现自BeanDefinitionParser,重写其中的doParse方法对标签进行解析,读取标签中的属性,子标签等,用来构造 BeanDefinition,然后注册到ParserContext,当BeanDefinition 注册完毕以后, Spring Bean 工厂就可以随时根据需要进行实例化该bean 了。

         自定义标签添加完成后,就可以通过spring的配置方式来进行RPC服务的发布和调用了。

        是不是感觉方便很多。

五,总结

        rpc框架的实现过程并不复杂,关键点还是在于怎么选择高效的序列化协议,和高效的网络传输。源码地址: http://git.oschina.net/wj596/nhrpc

 


 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hessian netty rpc] 推荐:

基于hessian和netty的RPC框架设计和实现

- - Java - 编程语言 - ITeye博客
基于hessian和netty的RPC框架设计和实现.         对系统进行服务化改造,或者构建一个分布式系统,RPC是核心的组件,目前主流的RPC框架有hessian\thrift\ avro等,如果不考虑跨语言的话thrift\ avro使用起来稍显复杂,要写IDL序列化配置,hessian又依赖servlet容器,于是使用netty和hessian构建了一个的RPC框 架.

基于Netty的异步Rpc调用的小框架

- - Java - 编程语言 - ITeye博客
基于netty写的一个异步Rpc调用小框架,欢迎拍砖,新手. private String methodName;//调用的方法名称. private Class[] types;//参数类型. private Object[] objects;//参数列表.  框架类,有两个静态方法,regist(在服务器上注册服务)和getobjt(获得接口的代理类).

简单Spring+hessian

- - Web前端 - ITeye博客
简单的Spring+hessian. dist\modules里面的 spring-webmvc.jar . lib\caucho 里面的hessian-3.1.3.jar. 里面有个接口interface:. 建立一个model层:(实现Serializable接口). 在WEB-INF下面创建一个remoting-servlet.xml:.

Hessian原理

- - 互联网 - ITeye博客
Hessian 原理分析. 一.      远程通讯协议的基本原理. 二.      应用级协议 Binary-RPC. Binary-RPC 是一种和 RMI 类似的远程调用的协议,它和 RMI 的不同之处在于它以标准的二进制格式来定义请求的信息 ( 请求的对象、方法、参数等 ) ,这样的好处是什么呢,就是在跨语言通讯的时候也可以使用.

Hessian和Spring整合

- - CSDN博客推荐文章
    上篇文章简单的介绍了Hessian以及它的一些执行原理,现在我们来看看它与强大框架spring的集成吧. 一、服务端使用spring,我们得下载Hessian支持包和Spring的相应的jar包,可以在我的资源库中进行免费下载:. 1、新建web工程,我取名为HessianSpringServer,在web/WEB-INFO/BIN中导入我们相应的jar包,跟上篇文章一样,编写我们的实体类和接口类、以及接口实现类:.

Hadoop RPC机制

- - 企业架构 - ITeye博客
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. Hadoop底层的交互都是通过 rpc进行的. 例如:datanode和namenode 、tasktracker和jobtracker、secondary namenode和namenode之间的通信都是通过rpc实现的.

Hessian, CXF, Spring httpinvoke 对比

- - Java - 编程语言 - ITeye博客
做了一个 Hessian, CXF, Spring httpinvoke 速度对比. 时间消耗  cxf > spring httpinvoke > hessian. 并发为10, 调用1W次所耗时间. 当然, 都知道 cxf 和 hessian 实现以及应用场景不太一样, 但差这么多还是很意外的.

HTTP/2 in Netty

- -
Here, we created a context for the server with a JDK SSL provider, added a couple of ciphers, and configured the Application-Layer Protocol Negotiation for HTTP/2..

Netty系列之Netty高性能之道

- - CSDN博客推荐文章
最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用. 相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多. 事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精心的设计Reactor线程模型,达到上述性能指标是完全有可能的.

Netty代码分析

- LightingMan - 淘宝JAVA中间件团队博客
Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序[官方定义],整体来看其包含了以下内容:1.提供了丰富的协议编解码支持,2.实现自有的buffer系统,减少复制所带来的消耗,3.整套channel的实现,4.基于事件的过程流转以及完整的网络事件响应与扩展,5.丰富的example.