精华内容
下载资源
问答
  • RPC框架

    2020-09-27 14:33:32
    文章目录前言一、什么是RPC二、完整的RPC 框架三、RPC 框架核心功能 前言 一、什么是RPC 二、完整的RPC 框架 三、RPC 框架核心功能

    前言

    一、什么是RPC

    二、完整的RPC 框架

    三、RPC 框架核心功能

    展开全文
  • RPC 框架

    2018-10-21 07:37:29
    rpc框架解释 谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol) 首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署...

    rpc框架解释

    谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol)

    首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。比如说,一个方法可能是这样定义的: 
    Employee getEmployeeByName(String fullName)那么:

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

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

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

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

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

      这里写图片描述 
      为什么RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如比如不同的系统间的通讯,甚至不同的组织间的通讯。由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用,RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service的RPC风格,Hessian,Thrift,甚至Rest API。关于Netty而Netty框架不局限于RPC,更多的是作为一种网络协议的实现框架,比如HTTP,由于RPC需要高效的网络通信,就可能选择以Netty作为基础。除了网络通信,RPC还需要有比较高效的序列化框架,以及一种寻址方式。如果是带会话(状态)的RPC调用,还需要有会话和状态保持的功能。大体上来说,Netty就是提供一种事件驱动的,责任链式(也可以说是流水线)的网络协议实现方式。网络协议包含很多层次,很多部分组成,如传输层协议,编码解码,压缩解压,身份认证,加密解密,请求的处理逻辑,怎么能够更好的复用,扩展,业界通用的方法就是责任链,一个请求应答网络交互通常包含两条链,一条链(Upstream)是从传输层,经过一系列步骤,如身份认证,解密,日志,流控,最后到达业务层,一条链(DownStream)是业务层返回后,又经过一系列步骤,如加密等,又回到传输层。

    展开全文
  • c# rpc框架

    2018-04-09 14:50:08
    c# rpc框架c# rpc框架c# rpc框架c# rpc框架c# rpc框架
  • rpc:JAVA RPC框架-源码

    2021-02-14 11:20:17
    rpc 基于netty实现的轻量级RPC框架 运用到如下技术和框架: JAVA动态代理spring自定义注释解netty框架zookeeper框架
  • neuro-rpc:Nim RPC框架
  • rpc-tiger:rpc框架-源码

    2021-04-09 17:04:33
    rpc框架主要用于数据中台的离线调度系统,致力与解决动态定向指定集群中的某台机器问题,并且兼容自动轮询策略。曾支持5w+的生产任务的正常运行。 二、项目结构 rpc-tiger rpc-common rpc-thrift rpc-netty rpc-...
  • 说到RPC框架,可能大家能想到一堆RPC开源框架,那么在微服务平台中,微服务间的服务调用,不可避免的会遇到一个问题,该选用哪一个RPC框架好呢?今天我们就请到三位RPC框架,来进行一场选美大赛,看看谁更适合微服务...

    1、RPC 框架谁最美?

    Hello,everybody!说到RPC框架,可能大家能想到一堆RPC开源框架,那么在微服务平台中,微服务间的服务调用,不可避免的会遇到一个问题,该选用哪一个RPC框架好呢?今天我们就请到三位RPC框架,来进行一场选美大赛,看看谁更适合微服务平台中的服务间调用。

    大家好,我是Dubbo!我是阿里开源的分布式服务框架,最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。

    大家好,我是Motan!我是微博开源的一套高性能、易于使用的分布式远程服务调用(RPC)框架。

    大家好,我是gRPC!我是Google开源的一套面向移动和HTTP/2设计的,高性能的、通用的远程调用框架。

    2、RPC框架的形体争美

    配置方式

    Motan:我支持 Xml 配置和 Spring注解配置。

    Dubbo:我支持 Xml 配置 、 注解配置、 属性配置 、 API 配置 !

    gRPC:我,我只支持 API 配置 。

    主持人: Xml 配置是用 xml 文件来配置协议 、 服务 、 注册中心等信息 ,这是 rpc 框架最常用的配置方式,也是最基本的配置方式; 属性配置 是 用 properties 文件来配置协议 、 服务 、 注册中心等信息 , 和Xml 配置使用上异曲同工 ; 注释配置是声明 Annotation 用来指定需要解析的包名 , 使用 spring-boot 启动服务 ,这是很多 RPC 所追求的,简化了我们代码的书写, Maton 也是最新版本才开始支持的; API 配置是 Dubbo 的 API 配置仅用于 OpenAPI, ESB, Test, Mock 等系统集成 , API 属性与配置项一对一。

    服务通信协议

    Motan:我支持 Motan 协议,使用tcp 长连接模式,基于 netty通信。

    Dubbo:我支持 Dubbo 协议、 Rmi 协议、 Hessian 协议、 HTTP 协议、 WebService 协议、Dubbo Thrift 协议、Memcached 协议!

    gRPC:我,我支持 HTTP/2.0 协议,基于 Netty4.1.3 通信。

    序列化

    Motan:我默认使用对 java 更友好的 hessian2 进行序列化,还支持 Json 格式。

    Dubbo:Dubbo 协议缺省序列化为hessian2 , rmi 协议缺省为java , http 协议缺省为 json!

    gRPC:哼!说到序列化,我是独一无二的!我使用 ProtoBuf 来定义服务!

    主持人: gRPC 使用的 ProtoBuf 是由 Google 开发的一种数据序列化协议,用户使用 .proto 文件定义服务,并支持定义多种类型的方法参数。 ProtoBuf 能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。不过,当前 gRPC 仅支持 Protobuf ,且不支持在浏览器中使用。但由于 gRPC 的设计能够支持支持多种数据格式,所以能够很容易实现对其他数据格式(如 XML 、 JSON 等)的支持。这就是我强大的 IDL 特性!

    负载均衡

    Motan:我支持 ActiveWeight 、Random 、 RoundRobin 、LocalFirst 、 Consistent 、ConfigurableWeight 。

    Dubbo:我可以支持 Random 、RoundRobin 、ConsistentHash 、 LeastActive。

    gRPC:我,我提供了可插拔负载均衡器的机制。

    主持人:这里让我来解释下每种负载均衡的模式吧 !

    ActiveWeight / LeastActive :低并发度优先, referer 的某时刻的 call 数越小优先级越高。

    Random :随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

    RoundRobin :轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

    LocalFirst :本地服务优先获取策略。

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

    ConfigurableWeight :权重可配置的负载均衡策略。

    容错

    Motan:我支持 Failover 失效切换、Failfast 快速失败。

    Dubbo:我支持 Failover 、 Failfast 、Failsafe 、 Failback 、 Forking、 Broadcast 。

    gRPC:我,我 具有 Failover 失效切换的容错策略。

    主持人:依旧由我给大家介绍下各种容错机制 !

    Failover :失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。

    Failfast :快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

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

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

    Forking :并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。

    Broadcast :广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。

    注册中心与服务发现

    Motan:我支持使用 Consul 作为注册中心、使用 Zookeeper 作为注册中心、点对点直连。

    Dubbo:我支持使用 Zookeeper 作为注册中心、使用 Redis 注册中心、使用 Multicast 注册中心、使用 Simple 注册中心。

    gRPC:我,我只能让用户自己扩展注册中心 。

    性能

    Motan:在高并发、高负载场景的场景下,我的 平均 TPS 和平均响应时间依旧保持良好,我具备在高压力场景下的高可用能力。

    Dubbo:Dubbo2.0 相比较 Dubbo1.0(默认使用的都是 hessian2序列化)性能均有提升。如对性能有更高要求可以使用dubbo 序列化,由其是在处理复杂对象时。 Dubbo 的设计目的是为了满足高并发小数据量的 rpc 调用,在大数据量下的性能表现并不好,建议使用 rmi 或 http 协议。

    gRPC:我采用的是 ProtoBuf 序列化协议 , ProtoBuf 与其他协议的性能对比 ,非常明显 的ProtoBuf 要远远优于其他 。

    主持人:三者的性能测试在各自官方说明上都可以看到详细的性能测试报告 , 这里我们 并不做 详细说明 。

    3、RPC框架的才艺角逐

    Motan :通过 spring 配置方式集成,无需额外编写代码即可为服务提供分布式调用能力完全不需要任何 xml 配置文件, Dubbo 的注解配置还需要配合 xml 文件的哦 。

    Dubbo :无论从支持的注册中心还是容错机制上看,都是我 Dubbo 的优势更大!

    Motan : 明显支持负载均衡的模式我更多 。 我 拥有自定义动态负载均衡、跨机房流量调整等高级服务调度能力。

    Dubbo :成熟度更高的我在健壮性和伸缩性上还能比你们差么?让我来一一例举。 说到健壮性 ,监控中心宕掉不影响使用,只是丢失部分采样数据;数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务;注册中心对等集群,任意一台宕掉后,将自动切换到另一台;注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯;服务提供者无状态,任意一台宕掉后,不影响使用;服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复。至于伸缩性,注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心;服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者。

    Motan :对,我在功能上或许不是那么全面,但我更注重简单、易用以及在高并发高可用场景的使用。服务发现灵活支持多种配置管理组件,基于高并发高负载场景的高可用策略优化,良好的 SPI(Service Provider Interface) 扩展,详细的调用统计,灵活支持多种 RPC 传输协议。

    Dubbo :说了这么多你能支持泛型调用么?我能! Dubbo 提供 GenericService 泛型调用接口 , 让用户的调用更加灵活 。

    Motan : 我的 工程依赖只涉及核心 5 个模块,且可以按需依赖,不要的说舍弃就舍弃。看看你那么一堆堆的工程,啧啧啧 ……

    gRPC : 哼 ! 本宝宝支持 服务的跨语言调用,目前所支持语言类型有 C++ 、 JAVA 、 GO 、 Python 、 Ruby 、 Node.js 、 Android 、 C# 、 PHP 、 Objective-C ,你们可以么?

    Motan : 额 ,是啊,我们不能,可是你有服务发现相关机制么?

    Dubbo :而且你的负载均衡和容错也太弱了 …..

    gRPC : 嘤嘤嘤 ……

    4、RPC框架的终极PK

    Dubbo作为阿里开源的分布式服务框架,实现高性能的 RPC 调用同时提供了丰富的管理功能,是一款应用广泛的优秀的 RPC 框架,但现在较少维护更新。如果你需要一款高成熟度的服务治理型的RPC框架,不如选我!

    Motan作为微博的 Motan RPC 倾向于服务治理型,与 Dubbo 系列相比在功能上或许不是那么全,扩展实现也没有那么多,但如果你需要一款高性能轻量级易上手的RPC框架,记得选我!

    gRPC作为google2015年才开源的跨语言调用型的RPC框架,侧重于服务的跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合多语言调用场景。如果你需要支持多语言,跨语言调用的RPC框架,选我吧!

    看了以上三位RPC框架的选美比赛不知道大家是否都有了自己的选择。当然,现如今的市场中开源的RPC远远不止这三个,到底哪个才是你现在所需要的,这里也只是个参考,也是我们在微服务中RPC框架选择的一个方向,最终的选择还是要“因地制宜”。

    作为踏入微服务行列的普元,我们的微服务平台采用了 Maton RPC 框架,高并发高负载 、轻量易维护 以及无需任何额外代码和配置的 Spring 注解配置,都是我们所需要的。当然我们也并不是完全满足于当前的Maton 功能,不过 Motan 良好的扩展机制,也给我们提供了便利,我们扩展了 ETCD 注册中心以及我们自己的日志记录方式,当然还有更多的贴合我们实际应用的改造。相信在每个正在寻找微服务交互的 RPC 框架的你们,经过反复的对比研究,也能找到你们心中的那个唯一!

    展开全文
  • 开源 RPC 框架有哪些呢?一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的。跟语言平台绑定的开源 RPC 框架主要有下面几种。Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末...

    开源 RPC 框架有哪些呢?

    一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的。

    跟语言平台绑定的开源 RPC 框架主要有下面几种。

    Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。

    Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。

    Tars:腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。

    Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言

    而跨语言平台的开源 RPC 框架主要有以下几种。

    gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。

    Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。

    如果你的业务场景仅仅局限于一种语言的话,可以选择跟语言绑定的 RPC 框架中的一种;

    如果涉及多个语言平台之间的相互调用,就应该选择跨语言平台的 RPC 框架。

    RPC 框架,它们具体有何区别?

    1. Dubbo

    先来聊聊 Dubbo,Dubbo 可以说是国内开源最早的 RPC 框架了,目前只支持 Java 语言,它的架构可以用下面这张图展示。

    7cbe945cd7e970ab4d2feff7fb066c5d.png

    从图中你能看到,Dubbo 的架构主要包含四个角色,其中 Consumer 是服务消费者,Provider 是服务提供者,Registry 是注册中心,Monitor 是监控系统。

    具体的交互流程是 Consumer 一端通过注册中心获取到 Provider 节点后,通过 Dubbo 的客户端 SDK 与 Provider 建立连接,并发起调用。Provider 一端通过 Dubbo 的服务端 SDK 接收到 Consumer 的请求,处理后再把结果返回给 Consumer。

    正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。有需要的同学可以在公众号【Java知己】,发送【面试】领取最新面试资料攻略!暗号【1024】千万不要发,否则.....

    2. Motan

    Motan 是国内另外一个比较有名的开源的 RPC 框架,同样也只支持 Java 语言实现,它的架构可以用下面这张图描述。

    ff935bee0db5c2f6098357520329da66.png

    Motan 与 Dubbo 的架构类似,都需要在 Client 端(服务消费者)和 Server 端(服务提供者)引入 SDK,其中 Motan 框架主要包含下面几个功能模块。

    register:用来和注册中心交互,包括注册服务、订阅服务、服务变更通知、服务心跳发送等功能。

    protocol:用来进行 RPC 服务的描述和 RPC 服务的配置管理,这一层还可以添加不同功能的 filter 用来完成统计、并发限制等功能。

    serialize:将 RPC 请求中的参数、结果等对象进行序列化与反序列化

    transport:用来进行远程通信,默认使用 Netty NIO 的 TCP 长链接方式。

    cluster:请求时会根据不同的高可用与负载均衡策略选择一个可用的 Server 发起远程调用。

    3. Tars

    Tars 是腾讯根据内部多年使用微服务架构的实践,总结而成的开源项目,仅支持 C++ 语言,它的架构图如下。

    edea514a02cd7313f4333333f4a9789b.png

    Tars 的架构交互主要包括以下几个流程:

    服务发布流程:在 web 系统上传 server 的发布包到 patch,上传成功后,在 web 上提交发布 server 请求,由 registry 服务传达到 node,然后 node 拉取 server 的发布包到本地,拉起 server 服务。

    管理命令流程:web 系统上的可以提交管理 server 服务命令请求,由 registry 服务传达到 node 服务,然后由 node 向 server 发送管理命令。

    心跳上报流程:server 服务运行后,会定期上报心跳到 node,node 然后把服务心跳信息上报到 registry 服务,由 registry 进行统一管理。

    信息上报流程:server 服务运行后,会定期上报统计信息到 stat,打印远程日志到 log,定期上报属性信息到 prop、上报异常信息到 notify、从 config 拉取服务配置信息。

    client 访问 server 流程:client 可以通过 server 的对象名 Obj 间接访问 server,client 会从 registry 上拉取 server 的路由信息(如 IP、Port 信息),然后根据具体的业务特性(同步或者异步,TCP 或者 UDP 方式)访问 server(当然 client 也可以通过 IP/Port 直接访问 server)。

    4. Spring Cloud

    Spring Cloud 利用 Spring Boot 特性整合了开源行业中优秀的组件,整体对外提供了一套在微服务架构中服务治理的解决方案。

    只支持 Java 语言平台,它的架构图可以用下面这张图来描述。

    c36cb30c8ba8b909a4b59986b14be094.png

    由此可见,Spring Cloud 微服务架构是由多个组件一起组成的,各个组件的交互流程如下。

    请求统一通过 API 网关 Zuul 来访问内部服务,先经过 Token 进行安全认证。

    通过安全认证后,网关 Zuul 从注册中心 Eureka 获取可用服务节点列表。

    从可用服务节点中选取一个可用节点,然后把请求分发到这个节点。

    整个请求过程中,Hystrix 组件负责处理服务超时熔断,Turbine 组件负责监控服务间的调用和熔断相关指标,Sleuth 组件负责调用链监控,ELK 负责日志分析。

    5. gRPC

    先来看下 gRPC,它的原理是通过 IDL(Interface Definition Language)文件定义服务接口的参数和返回值类型,然后通过代码生成程序生成服务端和客户端的具体实现代码,这样在 gRPC 里,客户端应用可以像调用本地对象一样调用另一台服务器上对应的方法。

    e9400532a9f959246d8a4dfa16b16b42.png

    它的主要特性包括三个方面。

    通信协议采用了 HTTP/2,因为 HTTP/2 提供了连接复用、双向流、服务器推送、请求优先级、首部压缩等机制

    IDL 使用了 ProtoBuf,ProtoBuf 是由 Google 开发的一种数据序列化协议,它的压缩和传输效率极高,语法也简单

    多语言支持,能够基于多种语言自动生成对应语言的客户端和服务端的代码。

    6. Thrift

    再来看下 Thrift,Thrift 是一种轻量级的跨语言 RPC 通信方案,支持多达 25 种编程语言。为了支持多种语言,跟 gRPC 一样,Thrift 也有一套自己的接口定义语言 IDL,可以通过代码生成器,生成各种编程语言的 Client 端和 Server 端的 SDK 代码,这样就保证了不同语言之间可以相互通信。它的架构图可以用下图来描述。

    e50973670aa5c562d37837e99bc629e1.png

    从这张图上可以看出 Thrift RPC 框架的特性。

    支持多种序列化格式:如 Binary、Compact、JSON、Multiplexed 等。

    支持多种通信方式:如 Socket、Framed、File、Memory、zlib 等。

    服务端支持多种处理方式:如 Simple 、Thread Pool、Non-Blocking 等。

    关于微服务我总结了一个技术路线,分享给大家

    9a42fbfb3d04cd9f84061b7f173946ab.png

    作者:Java架构师追风
    链接:https://www.jianshu.com/p/650ccc81513f
    展开全文
  • 自定义rpc框架

    2018-09-29 16:54:32
    RPC—远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。此项目用的是java+netty+zookeeper构建的自定义rpc框架
  • 一、什么是RPC框架?RPC,全称为Remote Procedure Call,即远程过程调用,是一种计算机通信协议。比如现在有两台机器:A机器和B机器,并且分别部署了应用A和应用B。假设此时位于A机器上的A应用想要调用位于B机器上的...
  • 随着微服务的兴起,PRC成为了微服务中不可缺少的一部分,作为开发人员,我们不仅仅需要掌握RPC框架的使用,更需要去理解RPC框架的底层实现原理。请点击这里,代码已经上传到GitHub,欢迎一起学习探讨。 一、RPC框架...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,088
精华内容 8,435
关键字:

rpc框架