课程咨询 :0871-63112636      qq:2066486918

昆明Java培训 > 达内新闻 > 基于netty轻量的高性能分布式RPC服务框架forest
  • 基于netty轻量的高性能分布式RPC服务框架forest

    发布:昆明Java培训      来源:达内新闻      时间:2016-12-27

  • 昆明Java培训机构的老师这一期给大家讲基于netty轻量的高性能分布式RPC服务框架forest。

    既然是RPC框架,那么首先都弄清楚RPC是什么?

    1.如何用通俗的语言解释一下RPC呢?

    RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

    RPC简单的来说就是像调用本地服务一样调用远程服务。

    RPC要解决哪些问题呢?

    首先,要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

    第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。

    第三,当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。

    第四,B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。

    第五,返回值还要发送回服务器A上的应用,也要经过序列化的方式发送,服务器A接到后,再反序列化,恢复为内存中的表达方式,交给A服务器上的应用

    2.高性能RPC的设计要点

    1)传输:用什么样的通道将数据发送给对方,BIO、NIO或者AIO,IO模型在很大程度上决定了框架的性能。

    2)协议:采用什么样的通信协议,HTTP或者内部私有协议。协议的选择不同,性能模型也不同。相比于公有协议,内部私有协议的性能通常可以被设计的更优。

    3)线程:数据报如何读取?读取之后的编解码在哪个线程进行,编解码后的消息如何派发,Reactor线程模型的不同,对性能的影响也非常大。

    forest基于netty 4实现(netty 5官方已下架),netty已经帮我们搞定了1)传输,3)线程两点,至于协议也实现了很好的编解码支持。当然netty还有鼎鼎大名的零拷贝,R大在知乎里面说过基于JVM实现socket如果能利用好零拷贝和c++实现的server差别是不大的。

    下面我们看看forest的协议设计:

    通讯协议包括header和body部分,header部分如下:

    基于以上的可以保证基本上forest在性能上有一些可靠的理论保障,只要代码实现的不会太糟,性能应该不成问题。

    后面的压测也证实了forest的性能还算可以,在hession2序列化的模式下,win64 8g可以有8w+ tps。

    3.forest实现了哪些特性

    工作中,我们机会处处离不开RPC。现在要实现一个RPC框架已经不是什么难事了,网上已经有大把的开源项目供我们参考(比如淘宝的dubbo,新浪的motan,百度的protobufRPC等),有很多成熟的第三方开源项目可以依赖,可以说是站在巨人的肩膀上。

    一个RPC框架可大可小,比如dubbo,大而全,甚至还可以更大,实现更多的功能;同时也可以很轻量,仅仅做远程调用的功能。至于究竟要把RPC实现成一个什么样子,是一件很私人的事情。

    比如我希望的RPC要实现如下功能:

    支持通过spring配置方式集成,支持注解。

    支持集成zookeeper等配置服务组件,提供集群环境的服务发现及治理能力。

    支持动态自定义负载均衡、跨机房流量调整等高级服务调度能力。

    支持自定义隔离策略,容灾策略

    通过jersey支持同时暴露restful服务

    通讯协议层面支持多种序列化方式和压缩方式,

    基于netty 4.x版本实现

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:昆明Java培训机构老师分享java函数

下一篇:Java修饰符

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:02/28

Java--零基础业余班

Java--零基础业余班

开班日期:02/28

Java--周末提升班

Java--周末提升班

开班日期:02/28

Java--零基础周末班

Java--零基础周末班

开班日期:02/28

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:0871-63112636      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56