为什么80%的码农都做不了架构师?>>>   

avro-rpc http://code.google.com/p/avro-rpc/

1.开发背景

公司的运营管理平台建立在J2EE平台之上,采用多层分布式的架构体系。分布式服务节点之间需要通讯和交互(业务节点和资源节点之间),服务端和客户端需要交互(终端客户端需要调用服务端的远程服务,客户端有C实现的,也有Java等其他语言实现的)。因此基础平台需要提供一个稳定、高效的、可伸缩的RPC服务性组件。

首先总结下我们对这个RPC服务组件的要求:

1. 稳定,高性能;作为一个基础性的骨架组件,高可用性和高性能是必备的;传输层希望是面向连接的TCP通信。

2. 轻量级,没侵入性,逻辑分层,易维护扩展;

3. 数据序列化方式能支持跨语言(C,C++,Java等)。因为我们有多种语言的客户端版本,能支持多种序列化方式,方便扩展序列化;

4. 希望协议层和传输层逻辑分开。这样方便扩展与重用;方便二次开发,当应用规模变大是,能方便开发“服务的治理“;

5. 序列化后的数据要尽可能小。我们的应用要求尽可能的节省用户的流量,所以这点也比较关键;(不考虑压缩,因为压缩会占用比较多的CPU资源)

2.开源参考

于是开始寻找Java领域中的RPC开源方案:

1. Avro  http://avro.apache.org/ 大名鼎鼎的Hadoop的子项目。它本身即是一个序列化框架,同时也实现RPC的功能;

Avro序列化特点:支持跨语言实现,与 Apache Thrift 和Google的Protocol Buffers相比,Avro的优势在于支持动态模式,即可以不生成代码,避免了侵入性,作为POJO的DTO(数据传输对象)是不适合用代码生成的。还有Avro序列化时由于不需要字段标识符来打标签,所以使用它序列化生成的数据小(应该是现有序列化系统中最精简的了),最后它的性能也非常优秀。

Avro自带的RPC实现有自己的亮点,比如支持同步和异步调用,有握手协议功能,状态监控完善。但是它绑定了Avro序列化,不支持协议的扩展,也不支持扩展序列化方式,在扩展性上有待改进。

2. nfs-rpc http://code.google.com/p/nfs-rpc/ 淘宝牛人开源的一个RPC框架。传输层使用mina/netty,协议层灵活可扩展,支持多种序列化方式目前支持Hessian ,Java,Protocol Buffers,序列化方式可扩展。该框架设计非常优秀,代码质量高,可读性强,结构清晰,层次分明。

nfs-rpc是一个非常优秀的RPC基础框架,在它的基础上进行扩展开发也非常方便。从序列化方式来看Java序列化虽然使用简单,但性能不高,不能跨语言。Hessian,能跨语言,使用也很方便,但性能不占优势。

3. Dubbo http://code.alibabatech.com/wiki/display/dubbo/Home-zh 阿里开源的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。功能非常强大,尤其是提供了完善的服务治理功能,非常适合大型的分布式应用。但是对于中小型应用来说似乎有点太重了。

4、missian也是类似的(转载者补充:http://code.google.com/p/missian/  或者  http://missian.iteye.com/blog/829780)

5、http://summercool-hsf.googlecode.com/svn/trunk/

总结:

1) 从序列化方式来看,Apache Thrift 和Google的Protocol Buffers和Avro应该是属于同一个级别的框架,都能跨语言,性能优秀,数据精简,但是Avro的动态模式(不用生成代码,而且性能很好)这个特点让人非常喜欢,比较适合RPC的数据交换。

2) RPC逻辑上分为二层,一是传输层,负责网络通信;二是协议层,将数据按照一定协议格式打包和解包。 决定参考前面三个开源框架的特点,实现一个轻量级的RPC框架。

3.avro-rpc介绍

avro-rpc 是一个支持跨语言实现的RPC服务框架。非常轻量级,实现简洁,使用方便,同时也方便使用者进行二次开发,逻辑上该框架分为两层:

1:网络传输层。使用Netty的Nio实现。

2:协议层。可扩展目前支持的数据序列化方式有Avro,Json, Hessian,Java序列化。 使用者可以注册自己的协议格式及序列化方式。

主要特点:

1:客户端传输层与应用层逻辑分离,传输层主要职责包括创建连接,连接查找与复用,传输数据,接收服务端回复后回调应用层;

2:客户端支持同步调用和异步调用。服务异步化能很好的提高系统吞吐量,建议使用异步调用。为防止异步发送请求过快,客户端增加了“请求流量限制”功能,调用超时管理。

3:服务端有一个协议注册工厂和序列化注册工厂。这样方便针对不同的应用场景来定制服务方式。RPC应该只是服务方式的一种。在分布式的系统架构中,分布式节点之间的通信会存在多种方式,比如MQ的TOP消息,一个消息可以有多个订阅者。因此avro-rpc不仅仅是一个RPC服务框架,还是一个分布式通信的一个基础骨架,提供了很好的扩展性;

4:非常轻量级,性能好,适合二次开发。

运行性能测试实例

1. 启动服务端 code.google.dsf.test.StartServerTest

2. 运行客户端 code.google.dsf.test.performance.RPSTest

测试对象,客户端采用异步方式发送一个POJO(10个属性字段)对象

两台,一台运行客户端,一台运行服务端,配置如下:

· CPU: E5645 @ 2.40GHz 2 core

· Memory: 2G

· Network: 1000Mb

JVM Options: -server -XX:+UseParallelGC  -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms512M -Xmx1024M

程序执行6分钟,RPS: 70108

转载于:https://my.oschina.net/chaun/blog/398199

支持多序列化的RPC框架avro-rpc相关推荐

  1. 【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】

    一.RPC框架必会的基本知识 1.1 什么是RPC? RPC(Remote Procedure Call --远程过程调用),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络的技术. ...

  2. 从零实现RPC框架1:RPC框架架构设计

    从零实现RPC框架1:RPC框架架构设计 1.什么是 RPC? RPC 的全称是 Remote Procedure Call,即远程过程调用.简单解读字面上的意思,远程肯定是指要跨机器而非本机,所以需 ...

  3. RPC 框架梳理——RPC使用方的调用流程梳理

    背景 myrpc是基于protobuf开发的远程调用框架,对于rpc服务,在proto文件中的定义如下:    经过protoc编译后,会生成两个类:UserServiceRpc 和 UserServ ...

  4. java基础巩固-宇宙第一AiYWM:为了维持生计,手写RPC~Version07(RPC原理、序列化框架们、网络协议框架们 、RPC 能帮助我们做什么呢、RPC异常排查:ctrl+F搜超时)整起

    上次Version06说到了咱们手写迷你版RPC的大体流程, 对咱们的迷你版RPC的大体流程再做几点补充: 为什么要封装网络协议,别人说封装好咱们就要封装?Java有这个特性那咱就要用?好像是这样.看 ...

  5. 远程过程调用RPC 2:RPC思想与RPC框架

    RPC思想与RPC框架 RPC思想 组成部分 RPC框架 完整的RPC框架 RPC调用关键点 RPC框架分类对比 RPC和REST REST主要原则 对比 RPC思想 上一篇笔记:远程过程调用RPC ...

  6. Java实现简单的RPC框架

    一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...

  7. rpc框架都有哪些_这六种微服务RPC框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  8. 支撑微博千亿调用的轻量级RPC框架:Motan

    随着微博容器化部署以及混合云平台的高速发展,RPC 在微服务化的进程中越来越重要,对 RPC 的需求也产生了一些变化.今天主要介绍一下微博 RPC 框架 Motan,以及为了更好的适应混合云部署所做的 ...

  9. 开源 RPC 框架有哪些呢?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  10. 什么是RPC?RPC框架dubbo的核心流程

    一.REST 与 RPC: 1.什么是 REST 和 RPC 协议: 在单体应用中,各模块间的调用是通过编程语言级别的方法函数来实现,但分布式系统运行在多台机器上,一般来说,每个服务实例都是一个进程, ...

最新文章

  1. SAP PP 启用了HU管理下的工单入库
  2. restful接口定义的几种方式
  3. Redis 实现延迟队列?深深被折服!!
  4. asp怎么循环增加字段和字段对应的值_索引该怎么创建?
  5. JavaScript的重载和递归
  6. Django:django.db.utils.OperationalError: (1050, “Table ‘malicious_software_db‘ already exists“)
  7. centos下配置使用Imagick+ghostscript将PDF文件转为图片
  8. 实验任务(四)---恶意代码技术
  9. 小爱同学脱离局域网远程控制开关?
  10. for循环的经典例题
  11. 【问题解决】seckill-秒杀项目 -- 服务端异常
  12. asp.net md5加密
  13. Android Studio 搭建微信界面
  14. windows10系统盘瘦身
  15. 新能源汽车车架号VIN码查询车辆信息
  16. 安装网页书签收藏夹Shiori
  17. 《Android 应用案例开发大全(第二版)》——1.5节第一个Android程序——Hello Android...
  18. crontab每周一到周五
  19. VTK交互系统 2 交互器样式
  20. markdown插图

热门文章

  1. [json]Json 入门
  2. A Zero Flow Entry Expiration Timeout P4 Switch
  3. Selenium-WebDriverApi介绍
  4. 获取pycharm 2016.1.4 注册码 (window系统) 2016.3注册码(Ubuntu系统)
  5. [安卓] 14、安卓HTTP——POST和GET用法分析
  6. 阿里云数据森林人才计划起航
  7. java学习笔记之斐波那契数列
  8. Laravel教程 六:表单 Forms
  9. Web前端开发初学者十问集锦(4)
  10. oracle group by