1. 首页 > 经验 >

rpc框架有哪些 rpc框架的实现原理

当前主流的RPC框架有哪些

Thrift 是由 Facebook 开源的一个 RPC 框架,现在已经挂在 下了。主要的几个好处:

rpc框架有哪些 rpc框架的实现原理rpc框架有哪些 rpc框架的实现原理


rpc框架有哪些 rpc框架的实现原理


1. 支持非常多语言,包括在 WEB 开发中很常用的 PHP,以及最重要的 C++/Python/Ja 等 WEB后端常用语言,当然,还包括很 cool 的 Ruby、Erlang。

2. 完整的 RPC 框架实现,用脚本生成通讯相关的框架代码,开发者只需要集中精力处理好 业务逻辑。比如搭建一个 Hello World Serv 只需要几分钟。

3.拥有被 Facebook、Last.fm 等不少大规模互联网应用验证过的性能和可用性。

Hessian是一款基于HTTP协议的RPC框架,采用的是二进制RPC协议,非常轻量级 ,且速度较快。

当然,还有Hetty,它是一款构建于Netty和Hessian基础上的高性能的RPC框架。

高性能rpc服务框架,zookeeper服务注册和发现,配置中心这几个是重点,其他的比如MQ和缓存服务

rpc框架都有哪些rmi dubbo

Dubbo分层

config(配置层 )

proxy(服务层)

registry( 注册中心层)

cluster( 路由层)

monitor( 层)

protocol( 远程调用层)

exchange( 信息交换层)

transport( 网络传输层)

serialize( 数据序列化层)

对外配置接口

以ServConfig, ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类

Jassist ProxyFactory

Jdk ProxyFactory

服务接口透明,生成服务的客户端Stub和端Skeleton

以ServProxy为中心,扩展接口为ProxyFactory

选择

Zookeeper

Redis

Multicast

Simple

支持基于网络的集群方式,有广泛周边开源产品,建议使用dubbo-2.3.3以上版本(使用)

依赖于Zookeeper的稳定性

支持基于客户端双写的集群方式,性能高

要求时间同步,用于检查心跳过期数据

去中心化,不需要安装注册中心

依赖于网络拓普和路由,跨机房有风险

Dogfooding,注册中心本身也是一个标准的RPC服务

没有集群支持,可能单点故障

封装服务地址的注册与发现

以服务URL为中心,扩展接口为RegistryFactory, Registry, RegistryServ

选择

Spring

Jetty

Log4j

自动加载META-INF/spring目录下的所有Spring配置

启动一个内嵌Jetty,用于汇报状态

大量访问页面时,会影响的线程和内存

自动配置log4j的配置,在多进程启动时,自动给日志文件按进程分目录

用户不能控制log4j的配置,不灵活

条件路由

脚本路由

基于条件表达式的路由规则,功能简单易用

有些复杂多分支条件情况,规则很难描述

基于脚本引擎的路由规则,功能强大

没有运行沙箱,脚本能力过于强大,可能成为后门

Random

RoundRobin

LeastActive

ConsistentHash

随机,按权重设置随机概率(使用)

在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均

轮循,按公约后的权重设置轮循比率

存在慢的机器累积请求问题,极端情况可能产生雪崩

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数,使慢的机器收到更少请求

不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量

一致性Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟,平摊到其它提供者,不会引起剧烈变动

压力分摊不均

Failover

Failfast

Failsafe

Failback

Forking

Broadcast

失败自动切换,当出现失败,重试其它,通常用于读作(使用)

重试会带来更长延迟

快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写作

如果有机器正在重启,可能会出现调用失败

失败安全,出现异常时,直接忽略,通常用于写入审计日志等作

调用信息丢失

失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知作

不可靠,重启丢失

并行调用多个,只要一个成功即返回,通常用于实时性要求较高的读作

需要浪费更多服务资源

广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于更新提供方本地状态

速度慢,任意一台报错则报错

封装多个提供者的路由及负载均衡,并桥接注册中心

以Invoker为中心,扩展接口为Cluster, Directory, Router, LoadBalance

Cluster选择

Router选择

路由规则

容器

RPC调用次数和调用时间

以Statistics为中心,扩展接口为MonitorFactory, Monitor, MonitorServ

Dubbo协议

Rmi协议

Hessian协议

连接个数:单连接

连接方式:长连接

传输协议:TCP

传输方式:NIO异步传输

序列化:Hessian二进制序列化

适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。

适用场景:常规远程服务方法调用

采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(使用)

适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况

Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低

Dubbo协议缺省每服务每提供者每消费者使用单一长连接,如果数据量较大,可以使用多个连接

为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护

在大文件传输时,单一连接会成为瓶颈

总结

可与原生RMI互作,基于TCP协议

偶尔会连接失败,需重建Stub

参数及返回值需实现Serializable接口

参数及返回值不能自定义实现List, Map, Number, Date, Calendar等接口,只能用JDK自带的实现,因为hessian会做特殊处理,自定义实现类中的属性值都会丢失

连接个数:多连接

连接方式:短连接

传输协议:HTTP

传输方式:同步传输

序列化:Hessian二进制序列化

适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件

适用场景:页面传输,文件传输,或与原生hessian服务互作

提供者用Dubbo的Hessian协议暴露服务,消费者直接用标准Hessian接口调用

或者提供方用标准Hessian暴露服务,消费方用Dubbo的Hessian协议调用

基于Hessian的远程调用协议

可与原生Hessian互作,基于HTTP协议

需hessian.jar支持,短连接的开销大

Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为实现

可以和原生Hessian服务互作

总结

约束

封装RPC调用

以Invocation, Result为中心,扩展接口为Protocol, Invoker, Exporter

选择

封装请求响应模式,同步转异步

以Request, Response为中心,扩展接口为Exchanger, ExchangeChannel,Exchange, Exchange

Netty

Mina

Grizzly

性能较好(使用)

一次请求派发两种,需屏蔽无用

老牌NIO框架,稳定

待发送消息队列派发不及时,大压力下,会出现FullGC

Sun的NIO框架,应用于GlassFish中

线程池不可扩展,Filter不能拦截下一Filter

抽象mina和netty为统一接口

以Message为中心,扩展接口为Channel, Transporter, , , Codec

选择

Hessian

Dubbo

Json

Ja

性能较好,多语言支持(使用)

Hessian的各版本兼容性不好,可能和应用使用的Hessian冲突,Dubbo内嵌了hessian3.2.1的源码

通过不传送POJO的类元信息,在大量POJO传输时,性能较好

当参数对象增加字段时,需外部文件声明

纯文本,可跨语言解析,缺省采用FastJson解析

性能较

Ja原生支持

性能较

可复用的一些工具

扩展接口为Serialization, ObjectInput, ObjectOutput, ThreadPool

选择

Business

RPC

Remoting

Serv

Config

Proxy

Registry

Cluster

Monitor

Protocol

Exchange

Transport

Serialize

层次结构

层说明

RPC框架(1 - 实现服务端注册一个服务)

基于这样一个设,那就是客户端已经知道了服务端的地址,这部分会由后续的服务发现机制完善。通用接口

hello方法需要传递一个对象,HelloObject对象,定义如下:

注意这个对象需要实现 Serializable 接口,因为它需要在调用过程中从客户端传递给服务端。

接着我们在服务端对这个接口进行实现,实现的方式也很简单,返回一个字符串就行:

服务端需要哪些信息,才能确定服务端需要调用的接口的方法呢?

那么服务端知道以上四个条件,就可以找到这个方法并且调用了。我们把这四个条件写到一个对象里,到时候传输时传输这个对象就行了。即 RpcRequest 对象:

那么调用完这个方法后,需要给客户端返回哪些信息呢?

如果调用成功的话,显然需要返回值,如果调用失败了,就需要失败的信息,这里封装成一个 RpcResponse 对象:

这里还多写了两个静态方法,用于快速生成成功与失败的响应对象。其中,statusCode属性可以自行定义,客户端服务端一致即可。

客户端方面,由于在 客户端这一侧我们并没有接口的具体实现类,就没有办法直接生成实例对象 。这时,我们可以 通过的方式生成实例,并且调用方法时生成需要的RpcRequest对象并且发送给服务端 。

这里我们采用JDK,类是需要实现 InvocationHandler 接口的。

我们需要传递host和port来指明服务端的位置。并且使用getProxy()方法来生成对象。

InvocationHandler 接口需要实现invoke()方法,来指明对象的方法被调用时的动作。 在这里,我们显然就需要生成一个RpcRequest对象,发送出去,然后返回从服务端接收到的结果即可:

生成RpcRequest很简单,我 使用Builder模式来生成这个对象 。发送的逻辑我使用了一个Rpc对象来实现,这个对象的作用, 就是将一个对象发过去,并且接收返回的对象。

我的实现很简单,直接使用Ja的序列化方式,通过Socket传输。 创建一个Socket,获取ObjectOutputStream对象,然后把需要发送的对象传进去即可,接收时获取ObjectInputStream对象,readObject()方法就可以获得一个返回的对象。

服务端的实现就简单多了, 使用一个Socket某个端口,循环接收连接请求,如果发来了请求就创建一个线程,在新线程中处理调用。 这里创建线程采用线程池:

这里简化了一下, Rpc暂时只能注册一个接口,即对外提供一个接口的调用服务,添加register方法,在注册完一个服务后立刻开始:

这里向工作线程WorkerThread传入了socket和用于服务端实例serv。

WorkerThread实现了Runnable接口,用于接收RpcRequest对象,解析并且调用,生成RpcResponse对象并传输回去。 run方法如下:

其中,通过class.getMod方法,传入方法名和方法参数类型即可获得Mod对象。如果你上面RpcRequest中使用String数组来存储方法参数类型的话,这里你就需要通过反射生成对应的Class数组了。通过mod.invoke方法,传入对象实例和参数,即可调用并且获得返回值。

服务端侧,我们已经在上面实现了一个HelloServ的实现类HelloServImpl,我们只需要创建一个Rpc并且把这个实现类注册进去就行了:

服务端开放在9000端口。

客户端方面,我们需要通过,生成对象,并且调用,会自动帮我们向服务端发送请求的:

我们这里生成了一个HelloObject对象作为方法的参数。

首先启动服务端,再启动客户端,测试结果:

主流的RPC框架有哪些?

Thrift 是由 Facebook 开源的一个 RPC 框架,现在已经挂在 下了。主要的几个好处:

1. 支持非常多语言,包括在 WEB 开发中很常用的 PHP,以及最重要的 C++/Python/Ja 等 WEB后端常用语言,当然,还包括很 cool 的 Ruby、Erlang。

2. 完整的 RPC 框架实现,用脚本生成通讯相关的框架代码,开发者只需要集中精力处理好 业务逻辑。比如搭建一个 Hello World Serv 只需要几分钟。

3.拥有被 Facebook、Last.fm 等不少大规模互联网应用验证过的性能和可用性。

Hessian是一款基于HTTP协议的RPC框架,采用的是二进制RPC协议,非常轻量级 ,且速度较快。

当然,还有Hetty,它是一款构建于Netty和Hessian基础上的高性能的RPC框架。

RPC和注册中心的

网络调用RPC 设一个web 调用另外一个serv 就符合RPC协议

在网络传输中的数据是序列化及返回为反序列化传输

什么是RPC:RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务

RPC的原理:RPC协议的底层原理,就是对象的序列化、反序列化以及序列化后数据的传输。

RPC协议的核心组成部分:网络传输协议:,tcp(使用tcp); dubbo序列化和反序列化:可以使用Ja原生的序列化和反序列化,也可以使用高性能序列化/反序列化工具,如Hessian,FST等,还可以使用表单序列化。

常见的RPC框架:Dubbo,SpringCloud, Thrift,Motan,gRPC

注册中心的作用:1:服务端服务的注册和客户端服务的发现 2、提高系统的高可用性 3、提高系统的可伸缩性 4、集中管理服务 ;常见的注册中心:zookeeper,Redis;

服务的发现:引入注册中心

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 12345678@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息