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

通俗的语言解释rpc

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

那么,netty是什么东西呢,跟RPC有什么关系?

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序

RPC要做到用户无感知的调用远程服务必定要经过网络传输,而netty正好是是Java编写的快速开发高性能高可靠性的网络编程框架。


目前使用netty作为传输层的RPC框架很多,国内知名的有dubbo,motan等。


下面以新浪开源的motan为例,说明netty在RPC的位置:

下图中transport即使使用netty实现的。




 总结来说,netty就是解决RPC网络传输的。


分布式RPC需要解决哪些问题呢?

  1. protocol:传输协议
  2. proxy:client代理,服务引用方调用方法通过代理发送远程消息
  3. codec:协议编解码压缩等
  4. transport:协议传输
  5. registry:注册中心,服务注册服务发现
  6. cluster:负载均衡,服务容错策略
  7. 其他:服务降级,服务隔离,服务治理

如何实现一个分布式的RPC框架呢?

现在互联网已经很少单点服务了,一个好的rpc框架能帮我们省掉很多工作,那么如何撸一个自己喜欢的RPC框架呢?

现在写rpc框架已经不难了,我们可以有很多参考,很多成熟的第三方开源项目可以依赖,可以说是站在巨人的肩膀上。

第一步,选择传输协议:

高性能的rpc和良好的编码协议是分不开的。好的协议不仅耗用流量小,而且序列化和反序列化更快。

现在比较流行的协议有thrift,protobuf,json,restful等。其中thrfit和protobuf性能都比较优异,而且占用空间小,最重要的是跨语言,具有语言平台无关性。但,美中不足的是他们都需要预先根据协议文件预先生成好代码。开发极不流畅。

我们也可以自定义协议,像dubbo和motan一样,定制自己的私有协议,

比如motan协议的header部分如下:




 body部分采用hession或者fastjson序列化,

如果不考虑跨语言,这种算是比较完美的解决方案。


定义协议过程中的一些重要且容易忽略的问题:

  • 协议版本号
  • 消息id
  • 协议扩展字段

第二步,协议传输层

一个高性能RPC框架最重要的四个点就是:传输协议,框架线程模型,IO模型,零拷贝。

java程序如果能做好这四点,那么性能应该不会比c++程序差多少。

而作为java开发者,netty正好解决了后三个点,所以使用netty作为RPC框架的传输层会事半功倍。


作者:郑大侠
链接:https://www.zhihu.com/question/25536695/answer/134976748
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第三部,注册中心的选择

现在有很多提供服务注册发现的服务,实现成本比较低就是zookeeper,可以很容易的实现服务注册和服务发现的功能。


解决了这三部,后面的就得脚踏实地码代码了,当然后续会有很多细节,不过都不是问题,现在有好多成熟的开源框架可以参考。


当然也可以参考我最近实现的分布式RPC框架,也欢迎提issue(后续会持续优化)。

自己撸一个RPC还是很不错的,如果有兴趣建议自己撸一遍玩玩。

下面是广告时间>>>>>>>>>

dempeZheng/forestRPC 基于netty, spring,轻量的高性能分布式RPC服务框架

Overview

基于netty, spring,轻量的高性能分布式RPC服务框架。简单,易用,高效。

Features

  • 服务端支持多种序列化方式:fastjson,hession,kryo
  • 服务端支持多种压缩方式:gzip,snappy
  • 服务端可根据group进行线程隔离,支持基于spring对不同的group配置不同的业务线程池
  • 支持注解配置,也支持spring xml配置
  • 支持服务发现服务注册
  • client端支持多种负载均衡策略和容灾策略
  • client内置连接池
  • 基于netty 4.x版本实现,高性能(win 8cpu单机8w+)

TODO

  • 服务降级功能
  • http服务支持
  • 跨语言协议支持
  • 服务治理管理后台
来源:知乎https://www.zhihu.com/question/25536695




  • 大小: 60.3 KB
  • 大小: 16.1 KB
分享到:
评论

相关推荐

    books-《Go语言高级编程》开源图书,涵盖CGO、Go汇编语言、RPC实现、Protobuf-advanced-go

    books_《Go语言高级编程》开源图书,涵盖CGO、Go汇编语言、RPC实现、Protobuf_advanced-go-programming-book.zip books_《Go语言高级编程》开源图书,涵盖CGO、Go汇编语言、RPC实现、Protobuf_advanced-go-...

    C语言头文件 RPC C语言头文件 RPC

    C语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC...RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPC

    go语言 gorpc

    **Thrift**是Facebook开发的另一个著名的跨语言RPC框架,支持广泛的编程语言。它提供了编译器和库来构建跨语言服务,具有很强的灵活性。 **RPCX**是一个高性能、全功能的分布式RPC框架,专为Go语言设计。RPCX的特点...

    servant C++语言框架rpc的源码实现 tools C++语言框架IDL工具的源码实现 util C++语言.7z

    servant C++语言框架rpc的源码实现 tools C++语言框架IDL工具的源码实现 util C++语言框架基础工具库的源码实现 examples C++语言框架的示例代码,包括:快速入门示例、promise编程入门示例、压测程序示例 unittest ...

    oncrpc.rar_RPC. VC++_oncrpc windows_windows RPC_ycnian的博客

    1. 使用`MIDL`(Microsoft Interface Definition Language)工具生成接口定义语言(IDL)文件的C++代码。 2. 创建客户端和服务端代码,分别调用RPC运行时库提供的函数来初始化和注册RPC接口。 3. 实现RPC接口指定的...

    ONCRPC.rar_ONCRPC_code rpc_onc_onc rpc

    这个"ONCRPC.rar_ONCRPC_code rpc_onc_onc rpc"文件包含的是关于ONC RPC协议的实现代码,主要针对的是JAVA平台,旨在实现不同编程语言之间的RPC调用。 在RPC(Remote Procedure Call)机制中,客户端可以透明地调用...

    hprose-golang, Hprose是跨语言的RPC 这里项目为 Hprose 2.0,用于 Golang.zip

    hprose-golang, Hprose是跨语言的RPC 这里项目为 Hprose 2.0,用于 Golang Hprose 2.0用于 Golang Hprose 2.0用于Golang中文文档简介安装使用Http服务器基于 net/http协议的基于 fasthttp的基于的 。基于

    《Go语言高级编程》开源图书,主题CGO、Go独立语言、RPC实现、Protobuf插件实现、Web框架实现、遍布系统等高阶主题(完稿).zip

    https://github.com/wa-lang/waWaBook(Go语言实现的MD电子书构建工具) https: //github.com/wa-lang/wabook两位作者的公众号 本书涵盖CGO、Go语言、RPC实现、Web框架实现、环球系统等高阶主题,针对Go语言有一定...

    jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例

    5. **文档(Documentation)**: 解释库的API和如何使用它们来构建JSON-RPC服务端。 **开发流程** 使用"jsonrpc-c-master"进行开发通常包括以下几个步骤: 1. **理解库API**: 阅读库的头文件和文档,了解如何初始化...

    第36讲 跨语言类RPC协议:交流之前,双方先来个专业术语表1

    本篇将深入探讨跨语言RPC协议,特别是Google的GRPC框架以及其使用的Protocol Buffers协议。 首先,RPC分为两种主要模式:单向RPC和双向流式RPC。单向RPC是客户端发起请求,服务端返回一个单一的响应。而双向流式RPC...

    gRPC基于HTTP2的Go语言实现RPC.zip

    1. **gRPC概念**:gRPC是一个平台无关、语言无关的远程过程调用(RPC)系统,由Google开发。它提供了强大的服务发现、负载均衡、流传输和安全功能,使得跨服务通信变得简单。 2. **HTTP/2协议**:HTTP/2是HTTP协议...

    LabVIEW XML-RPC

    这个技术在跨平台交互和分布式系统开发中发挥着重要作用,使得LabVIEW可以与不同编程语言编写的服务进行数据交换。以下是关于LabVIEW XML-RPC的详细知识点: 1. **XML-RPC简介**: - XML-RPC(XML Remote ...

    RPC-code_rpc_

    然而,RMI相比Thrift等现代RPC框架,在跨语言支持和性能上可能稍逊一筹。 在"RPC-code_rpc_"项目中,我们可以预期看到以下内容: 1. **服务定义**:无论是Thrift还是RMI,都需要定义服务接口。Thrift使用IDL...

    基于Java语言的RPC-Demo设计源码学习与改进实践

    该项目为Java语言的RPC(远程过程调用)框架示例,包含43个文件,其中Java源文件28个,XML配置文件11个,Markdown文件2个,Git忽略文件2个。项目旨在通过学习与改进实践,深入了解RPC-Demo的设计与实现,以提升相关...

    PHPRPC3.0分享

    PHPRPC3.0的README可能解释了框架的核心功能、特点以及如何开始使用它。 5. **asp**、**delphi**、**java**、**as2**、**as3**、**php**:这些文件夹代表了PHPRPC3.0支持的不同编程语言。RPC框架的一个显著特点是其...

    RPC.rar_C++ 远程调用_VC6.0 开发RPC_windows RPC_远程过程调用

    在这个"RPC.rar"压缩包中,主要围绕C++语言在VC6.0环境下开发Windows RPC程序进行深入探讨。 首先,C++是一种强大的面向对象编程语言,广泛用于系统级和应用程序开发。VC6.0,全称Microsoft Visual C++ 6.0,是微软...

    36-跨语言类RPC协议:交流之前,双方先来个专业术语表1

    总结起来,GRPC是现代分布式系统中实现跨语言RPC通信的理想选择,它结合了高效二进制序列化协议Protocol Buffers和强大的服务治理能力。通过定义清晰的.proto文件,GRPC简化了跨语言通信的复杂性,同时也为开发者...

    RPC(远程过程调用)

    - 跨语言交互:不同语言编写的系统间通信,RPC框架提供了统一的接口。 7. **最佳实践**: - 选择适合业务场景的RPC框架。 - 优化序列化和反序列化,减少网络传输开销。 - 设计良好的服务接口,避免过于复杂的...

    RPC的简单实现

    RPC(Remote Procedure Call)是一种计算机通信协议,允许一...- **兼容性**:是否支持多种语言,是否与其他系统集成方便。 通过了解这些基础知识,开发者可以更好地理解和实现RPC,从而构建高效、可靠的分布式系统。

    PHPRPC .Net服务端+客户端

    3. **微服务通信**:在微服务架构中,各服务可能使用不同语言编写,PHPRPC作为跨语言的RPC框架,有助于构建松耦合的服务间通信。 总的来说,PHPRPC .Net服务端+客户端提供了一个强大的工具集,使得PHP和.NET开发者...

Global site tag (gtag.js) - Google Analytics