`
usenrong
  • 浏览: 516585 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

分布式RPC框架

    博客分类:
  • J2EE
 
阅读更多

分布式RPC框架:Polaris 
在长期的业务发展过程中,对于系统间的交互,我们使用了Socket、RMI、Hessian、JSON等技术,针对每种技术,都需要维护一套相应的故障转移、故障恢复、追踪框架,对于商业平台多条业务线的大量系统交互来说,经常面临着硬件故障问题,此种交互方式引起的维护成本及故障迁移成本都是巨大的。另外,多种不同的接口技术也面临着接口兼容性的问题,例如对于RMI来说,我们就遇到了Spring从2.5.6升级到3.1.0所带来的RMI接口不兼容导致的接口调用错误问题。最后,我们内部也有一些跨语言的调用需求,比如用C++查询广告物料信息、Python脚本做统计,这些都会涉及到接口调用,而使用不能跨语言的技术(例如RMI和Hessian)成本会非常高。因此,我们需要统一内部系统接口交互方式,并降低接口的管理和维护成本。 

在实践过程中,我们比较了WebService、ProtocolBuffer、HTTP/JSON、Dubbo以及Thrift等技术。其中,WebService基于XML,兼容性良好,但其序列化/反序列化性能较差;ProtocolBuffer和HTTP/JSON无服务接口/地址描述;Dubbo的框架过于庞大;Thrift在接口定义文档、数据类型支持、跨语言等方面存在优势,然而对服务地址和服务管理方面支持力度不够,并且存在类型侵入问题。在分析比较之后,我们选定了Thrift,并在此基础上开发了服务注册中心,解决服务地址和服务管理方面的问题。对于类型侵入问题,从描述语言来看,长远来看它生成的POJO代码应该可以像WebService一样,消除类型侵入(例如,Facebook提供了开源的Swift框架,已经朝这个方向迈进了一步)。我们目前是提供了一系列的方法和转换类,自主进行类型转换适配工作。 

我们基于Thrift构建的分布式RPC框架Polaris如图5所示。 


 

 

图 5 分布式RPC框架Polaris


我们对Polaris的服务端和客户端都进行了增强。在服务器端,我们提供了标准的HTTP服务器,能够很轻易地将一个Thrift服务发布到一个URL上。同时,也集成了标准的认证和授权框架,有效地保证了业务的安全性;另外,我们在运维监控方面做了很多增强,能够监控每个方法的执行时间以及执行参数,这样的话可以面向整个商业平台,建立标准的监控统计架构。因为我们提供的服务是基于HTTP的,因此部分统计是可以直接沿用线上已有的监控统计软件,也有效减少了重新构建监控框架的成本。 

在客户端,主要添加了失败重试、提供了类RPC的调用方式,并且提供了一种抽象的机制简化了测试成本。通过Spring的依赖注入,可以支持在仅调整配置,不改变客户端代码的情况下进行本地调用和远程HTTP调用的切换。使用本地调用时可以更快地进行单元测试,在完成单元测试之后,可以直接通过调整配置切换成远程HTTP调用,在此过程中无需任何代码的调整。此方案还对接口迁移,比如从RMI接口迁移至Thrift接口提供了很大的帮助。一般情况下,大型复杂依赖系统内部接口间的依赖关系都会特别复杂,在进行接口梳理和迁移时成本和风险都非常高,特别是在系统的服务化改造过程中需要将内部接口提升为API接口的时候。在这种情况下,可以通过引入一个Thrift模块,将此模块依赖于需要提升为API接口的模块,而其他模块则仅依赖于此Thrift模块。在此调整过程中,可以随着业务版本的开发同步进行,而且可以重用大部分单元测试稍作调整即可使用,这样的话能够将成本和风险都降至最低。 

事实上,Thrift有标准的定义语言,能够对服务接口、异常、接口参数和返回值进行描述,同时支持Set、Map之类的数据结构。然而,它没有描述服务地址以及服务依赖关系等。因此,我们也构建了服务中心Aura,它的概念架构图6所示。 


 

 

图6 服务中心Aura概念架构图


图6中的通信框架服务端和通信框架客户端已经在前面介绍了。服务中心的主要功能是对Thrift接口描述语言文件进行管理,管理其发布/订阅关系。实际上,它定义了一种团队间互相协作的方法,此协作遵循面向服务体系结构。在开发实践中,我们不鼓励依赖通过接口描述语言直接生成的代码,鼓励依赖于接口描述语言生成代码,这样能够保证耦合性,减少代码升级所带来的成本。另外,通过管理服务的所有者和服务的订阅者,能够迅速地了解到服务间的依赖关系以及服务演化时所带来的相关影响。 

在商业平台内部有多个业务系统使用分布式RPC框架Polaris,包括资金、计费、客户、财务、合同、物料、报告等,也覆盖了Java、C++、Python等语言,目前已经完成大部分接口的迁移,利用服务中心Aura,构建了完善的服务发布、发现和使用的流程,也针对其安全性、易用性和可维护性做了很多工作,因为有了一致的技术集,连怎么去使用都有了最佳实践,迁移后的服务接口显著减少了重复开发成本,有效地提升了沟通效率,降低了风险。 

分享到:
评论
3 楼 usenrong 2015-06-05  
1.tcp支持双向通信。

2.thrift基于tcp,理论上可以有这个功能,但是apache没做。原因如下。

3.thrift是rpc结构的通信框架,rpc结构默认是 【客户端请求 -> 服务端回应 -> 连接断开】 的这种短连接形式,因此rpc默认是没有服务端回调功能,自然也没有长连接。

4.虽然按照这种规范,rpc只能由客户端向服务端发起一次性的短连接服务请求,不过,一些高级rpc还是支持双向和长连接,但也要客户端先访问服务端,然后服务端才能回调客户端,比如wcf。
2 楼 usenrong 2015-06-05  
Apache Avro 与 Thrift 比较

Avro和Thrift都是跨语言,基于二进制的高性能的通讯中间件. 它们都提供了数据序列化的功能和RPC服务. 总体功能上类似,但是哲学不一样. Thrift出自Facebook用于后台各个服务间的通讯,Thrift的设计强调统一的编程接口的多语言通讯框架. Avro出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下Avro的推出,其目标不仅是提供一套类似Thrift的通讯中间件更是要建立一个新的,标准性的云计算的数据交换和存储的Protocol。 这个和Thrift的理念不同,Thrift认为没有一个完美的方案可以解决所有问题,因此尽量保持一个Neutral框架,插入不同的实现并互相交互。而Avro偏向实用,排斥多种方案带来的 可能的混乱,主张建立一个统一的标准,并不介意采用特定的优化。Avro的创新之处在于融合了显式,declarative的Schema和高效二进制的数据表达,强调数据的自我描述,克服了以往单纯XML或二进制系统的缺陷。Avro对Schema动态加载功能,是Thrift编程接口所不具备的,符合了Hadoop上的Hive/Pig及NOSQL 等既属于ad hoc,又追求性能的应用需求.
1 楼 usenrong 2015-06-05  
Thrift适用于程序对程序静态的数据交换,要求schema预知并相对固定。
Avro在Thrift基础上增加了对schema动态的支持且性能上不输于Thrift。
Avro显式schema设计使它更适用于搭建数据交换及存储的通用工具和平台,特别是在后台。
目前Thrift的优势在于更多的语言支持和相对成熟。

相关推荐

    基于Java的RPC-FromScratch轻量级分布式RPC框架设计源码

    RPC-FromScratch是一个基于Java开发的轻量级分布式RPC框架,包含108个文件,其中包括50个XML文件、23个Java编译文件、20个Java源文件、8个Iml文件、4个Properties文件、1个Idea缓存文件和1个LICENSE文件。...

    基于Java的分布式RPC框架.zip

    基于Java的分布式RPC框架 项目简介 本项目是一个基于Java的分布式RPC(远程过程调用)框架,旨在简化分布式系统中的服务调用。通过该框架,开发者可以轻松定义、发布和调用RPC服务,实现不同服务之间的无缝通信。...

    Zookeeper实现简单的分布式RPC框架

    在分布式RPC框架中,Zookeeper可以用来进行服务发现、负载均衡、配置管理以及锁服务等,确保系统的稳定性和可靠性。 服务发现是构建RPC框架的关键部分。在Zookeeper中,每个服务提供者(Server)会在Zookeeper上...

    手把手教你写 轻量级分布式 RPC 框架

    非常好的 轻量级分布式 RPC 框架 学习资料 根据以上技术需求,我们可使用如下技术选型: Spring:它是最强大的依赖注入框架,也是业界的权威标准。 Netty:它使 NIO 编程更加容易,屏蔽了 Java 底层的 NIO 细节。 ...

    简单的分布式RPC框架blackRpc

    ①blackRpc是一个简单的分布式RPC框架 ② 框架组成:spring,netty,zookeeper 序列化方式支持:fastjson,msgpack,protostuff 集群负载均衡策略:轮训,加权轮训,随机,加权随机,一致性哈希 ③ 支持spring多种作用域...

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

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

    分布式RPC框架Apache Dubbo

    分布式RPC框架Apache Dubbo是阿里巴巴开源的一款高性能、轻量级的Java远程调用框架,它致力于提供简单、高效、可扩展的服务发现与调用机制。本文将深入探讨Dubbo的核心特性,包括服务注册中心Zookeeper的安装使用、...

    分布式 RPC 框架 zerorpc-node.zip

    分布式RPC(Remote Procedure Call)框架zerorpc-node是基于Node.js实现的一种轻量级、高性能的跨进程、跨网络通信工具。它利用了gRPC的基础思想,但更专注于简单性和易用性,允许开发者在不同的服务之间透明地调用...

    分布式RPC系统框架-Dubbo(2.7)教程(4.31G)

    分布式RPC系统框架-Dubbo(2.7)教程涵盖了在现代软件开发中至关重要的技术领域,主要涉及分布式系统、远程过程调用(RPC)以及相关的中间件和服务治理。Dubbo是阿里巴巴开源的一款高性能、轻量级的RPC框架,它极大地...

    架构探险:从零开始写分布式服务框架 程序开发书籍 RPC框架 李业兵

    包括常见的RPC框架、常见的序列化/反序列化方案及选型、分布式服务框架服务的发布引入实现细节、软负载实现、底层通信方案实现、服务注册与发现实现、服务治理常见的功能等。通过对这些知识点的逐步讲解,层层深入,...

    jfrpc:分布式rpc框架--JFRpc

    JFRpc是基于Java语言的分布式rpc框架, 当前版本:1.0.0-SNAPSHOT 发布日期:2018-06-07 目前为发布到maven中央仓库,请自行编译使用 JFRpc 特点 1. 代码量少, 使用简单, 仅180K 2. 使用zk作为注册中心,支持分布式...

    RPC-DDSF:一种基于RPC的分布式数据共享框架.pdf

    文章进一步分析了在ONC RPC框架中影响数据共享性能的因素,并通过实验探究了不同参数设置下的ONC RPC性能表现。这些实验结果为框架的使用者提供了重要的指导信息,帮助他们在使用RPC-DDSF框架时能够调整参数以达到...

    开课吧-06分布式RPC系统框架Dubbo.pdf

    Dubbo作为分布式RPC框架,扮演着连接服务提供者和服务消费者的角色,它提供了服务发现、负载均衡、容错、监控等功能,帮助开发者构建高可用、高性能的分布式系统。通过学习Dubbo,开发者可以更好地理解和实践分布式...

    分布式RPC系统框架实战教程

    Dubbo+Zookeeper分布式RPC系统框架实战教程,课程内容从分布式系统技术知识点教学,Dubbo四大组件,Zookeeper,Dubbo源码解析,分布式系统技术图谱,分布式RPC系统框架全面解读。

    RPC框架底层模拟

    本篇将深入探讨RPC框架的底层模拟,主要围绕以下几个核心概念进行讨论: 1. **服务接口与实现**: 在`HelloService.java`中定义了服务接口,如`sayHello(String name)`方法,而`HelloServiceImpl.java`则是该接口...

    java版飞机大战源码-RPC-FromScratch::rainbow:从零开始设计一个轻量级分布式RPC框架,基于Spring+Netty+Protost

    从零开始设计一个轻量级分布式 RPC 框架 :love_letter: 写在前面 本项目基于 Spring + Netty + Zookeeper + Protostuff 从零开始设计实现一个轻量级的分布式 RPC 框架,内含详细设计思路以及开发教程,通过造轮子的...

    毕业设计&课设_基于 Netty 的轻量高性能分布式 RPC 框架,含特性、使用示例及文档说明.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,...

Global site tag (gtag.js) - Google Analytics