`
wj596
  • 浏览: 26615 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

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

阅读更多

基于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

 


 
分享到:
评论
2 楼 阳光泛滥的日子 2017-04-07  
讲的很透彻,受教了
1 楼 hua951719 2017-01-13  
说的都很好,但是看到最后一张图时,画风突变....

相关推荐

    Netty Rpc框架

    Netty Rpc框架是一种基于Java的高性能网络通信库——Netty实现的远程过程调用(RPC)框架。Netty以其高效、稳定和灵活的设计在Java世界中广受赞誉,而Netty Rpc则是利用Netty的强大能力,构建了一种使得分布式系统间...

    基于netty的手写rpc框架

    在本项目中,我们将基于Netty实现一个手写的RPC框架。Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于构建高效的服务器和客户端。 首先,我们需要理解RPC框架的基本组成部分: 1. **服务...

    如何用Netty写一个自己的RPC框架

    构建RPC框架是一个复杂的系统工程,涉及到的知识点和实现细节非常丰富。上述内容仅作为一个大致的概述,每一步背后都有大量的细节需要解决。实现一个高性能、高可用的RPC框架需要对网络通信、多线程编程、服务治理等...

    基于Java实现的基于netty轻量的高性能分布式RPC服务框架

    【作品名称】:基于Java实现的基于netty轻量的高性能分布式RPC服务框架 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】...

    基于Java的Thunder分布式RPC框架设计源码

    Nepxion Thunder是一个基于Java的分布式RPC框架,集成了Netty、Hessian、Kafka、ActiveMQ、Tibco、Zookeeper、Redis、Spring Web MVC、Spring Boot和Docker等技术。它支持多协议、多组件和多序列化,为开发者提供了...

    netty实现自定义rpc.zip

    本项目"Netty实现自定义RPC"旨在教你如何利用Netty构建自己的RPC框架。 首先,我们需要理解RPC的基本原理。RPC的核心是将远程服务调用的过程透明化,使它看起来就像是本地方法调用一样。这涉及到序列化、网络通信和...

    基于netty轻量的高性能分布式RPC服务框架.zip

    Netty由于其高效的NIO模型和丰富的功能,成为构建RPC框架的理想选择。下面,我们将会讨论以下几个关键知识点: 1. **Netty的NIO基础**: Netty采用Java的非阻塞I/O模型(NIO,New I/O),提供了更高效的数据传输...

    基于Java的源码-高性能RPC框架 nfs-rpc.zip

    这里我们将深入探讨基于Java的RPC框架设计与实现的关键技术点。 1. **序列化与反序列化**:在RPC调用中,参数和返回值需要在网络间传输,这就涉及到对象的序列化和反序列化。Java中常见的序列化库有JSON(如Jackson...

    自定义rpc框架

    通过这个自定义的RPC框架项目,你可以深入理解Netty的底层I/O原理,掌握Zookeeper的使用,以及如何设计和实现一个完整的RPC框架。同时,这也会帮助你更全面地理解Dubbo的工作方式,为你的分布式系统开发提供宝贵的...

    RPC 框架学习 好的参考学习

    这将有助于你深入理解RPC的工作原理,同时也能提升你在分布式系统设计和实现上的能力。 四、实战应用与优化 了解了QiuRPC的基本原理后,你可以尝试将其应用于实际项目中,根据项目需求进行定制和优化。例如,你...

    40_如何设计一个类似dubbo的rpc框架?架构上该如何考虑?.zip

    在IT行业中,设计一个类似于Dubbo的RPC(远程过程...以上是设计一个类似Dubbo的RPC框架所需考虑的核心知识点。在实际开发中,还需要结合具体的业务场景和技术栈,不断迭代和优化,以提供高效、稳定的远程调用解决方案。

    最简单的RPC框架源码.zip

    通过对"最简单的RPC框架源码"的分析,我们可以学习到如何设计和实现一个基本的RPC框架,理解其工作流程和核心组件。这将有助于我们更好地理解和使用复杂的RPC框架,如Dubbo、gRPC、Spring Cloud等。

    SOFABolt 是蚂蚁集团开发的一套基于 Netty 实现的网络通信框架

    SOFABolt是蚂蚁集团为了解决高并发、低延迟的网络通信问题而设计和开发的一款高效、可扩展的通信框架。它建立在Netty这一高性能的异步事件驱动网络应用框架之上,充分利用了Netty的非阻塞I/O机制,以实现更高效的...

    手写RPC框架1

    常见的网络传输库有BIO(Blocking I/O)和NIO(Non-blocking I/O),而Netty作为高性能的异步事件驱动网络应用框架,是现代RPC框架的理想选择。 其次,数据序列化是RPC中的重要环节,它涉及将Java对象转换为字节流...

    SOFARPC框架 v5.12.0.zip

    2. **高性能通信**:基于Netty网络库,SOFARPC实现了高效的异步非阻塞I/O模型,提高了并发处理能力。同时,它支持多种序列化协议,如FastJSON、Hessian2、Protobuf等,为数据传输提供了高速度和低内存占用。 3. **...

    rpc 远程调用

    RPC(Remote Procedure Call)远程过程调用是一种计算机通信协议,允许程序在一台计算机上执行另一台计算机上的代码,而...通过学习这个教程,你可以深入理解RPC的工作原理,并掌握基于Netty构建高效RPC框架的技术。

    RPC框架原理与实现

    RPC框架原理与实现详解 RPC(Remote Procedure Call)是一种分布式计算技术,允许程序在一台机器上调用另一台机器上的函数或方法,就像调用本地函数...理解这些组件的工作原理对于设计和优化自己的RPC框架至关重要。

    guide-rpc-framework-master.zip

    本项目"guide-rpc-framework-master"是一个自研的RPC框架实现,旨在帮助开发者理解RPC的核心原理以及如何构建这样的框架。通过这个项目,我们可以深入学习RPC的实现细节,包括服务发现、负载均衡、协议编解码、网络...

    RPC设计思路图

    **自定义RPC框架的设计**: 1. **接口定义**:明确服务提供者和消费者之间的API。 2. **服务注册与发现**:设计服务注册表,使消费者能动态获取服务提供者的信息。 3. **网络通信**:实现高效稳定的网络通信层,如...

    抠脚的RPC实现

    在Java中,RPC框架如Hessian、Dubbo、gRPC等广泛应用于微服务架构中,以实现服务间的高效通信。本文将探讨在Java环境下,如何通过代理和反射来实现一个基础的RPC框架。 1. **代理模式**: 在RPC实现中,代理模式起...

Global site tag (gtag.js) - Google Analytics