rpc协议

从零开始手写 dubbo rpc 框架

给你一囗甜甜゛ 提交于 2019-12-03 05:33:50
rpc rpc 是基于 netty 实现的 java rpc 框架,类似于 dubbo。 主要用于个人学习,由渐入深,理解 rpc 的底层实现原理。 前言 工作至今,接触 rpc 框架已经有很长时间。 但是对于其原理一直只是知道个大概,从来没有深入学习过。 以前一直想写,但由于各种原因被耽搁。 技术准备 Java 并发实战学习 TCP/IP 协议学习笔记 Netty 权威指南学习 这些技术的准备阶段,花费了比较长的时间。 也建议想写 rpc 框架的有相关的知识储备。 其他 rpc 框架使用的经验此处不再赘述。 快速迭代 原来一直想写 rpc,却不行动的原因就是想的太多,做的太少。 想一下把全部写完,结果就是啥都没写。 所以本次的开发,每个代码分支做的事情实际很少,只做一个功能点。 陆陆续续经过近一个月的完善,对 rpc 框架有了自己的体会和进一步的认知。 代码实现功能,主要参考 Apache Dubbo 文档 文档 文档将使用 markdown 文本的形式,补充 code 层面没有的东西。 代码注释 代码有详细的注释,便于阅读和后期维护。 测试 目前测试代码算不上完善。后续将陆续补全。 rpc 模块 rpc-common 公共代码 rpc-server 服务端 rpc-client 客户端 rpc-register 注册中心 rpc-test 测试模块 代码分支 release_0

分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较

匿名 (未验证) 提交于 2019-12-03 00:30:01
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散(参见 http://www.oschina.net/news/55059/druid-1-0-9 Motan是新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。 rpcx是Go语言生态圈的Dubbo, 比Dubbo更轻量,实现了Dubbo的许多特性,借助于Go语言优秀的并发特性和简洁语法,可以使用较少的代码实现分布式的RPC服务。 gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。 thrift是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。 后续还会增加更多的 RPC 框架的比较,敬请收藏本文网址 以下是它们的功能比较: 对于RPC的考察,

Golang 微服务框架 - Micro 介绍

匿名 (未验证) 提交于 2019-12-03 00:29:01
官方网站: micro.mu 官方文档: micro.mu/docs 源码仓库: github.com/micro/micro Micro 是一个工具集合, 通过将微服务架构抽象成一组工具。隐藏了分布式系统的复杂性,为开发人员提供了更简洁的概念。 Micro 主要有三部分组成: go-micro - 开发 sdk, 包含了 RPC 框架,服务发现, 消息订阅/ 发布 等功能. go-plugins - micro 插件 micro - Micro 提供的管理工具, 包含了 API 网关, 仪表盘, RPC 代理等功能. go-micro Micro 的主要开发 SDK, 里面包含了开发所用到的常用功能模块, 主要模块之间关系如下: 模块 说明 services 微服务, 提供了对微服务功能开发的封装, 通过它可以快速创建一个微服务. client RPC 客户端, 提供了诸如 服务发现 / 负载均衡 / RPC 代理和调用。以及失败时的重试 / 超时 / 上下文等功能。 server RPC 服务端, 提供了如何实现 RPC 请求的方法, 功能逻辑主要使用这个实现. codec 数据编码 模块, 提供将程序调用数据转换成 RPC 调用数据的功能. 目前支持: json / protobuf broker pub/sub 模块, 提供事件 发布 / 订阅 功能, 目前支持: nats

大型分布式网站架构设计--第1章 面向服务体系的架构

匿名 (未验证) 提交于 2019-12-03 00:27:02
本章目录: 分布式Java应用图: 分布式Java应用:大型系统会被拆分成多个子系统来实现,对于Java来说,这些子系统可能部署在同一台机器上不同的JVM,或者部署在不同机器上,但是这些子系统之间要进行相互通信来共同实现业务功能。 分布式应用架构的演变 分布式应用架构面临的首要问题,便是如何实现应用之间的远程调用(RPC)。有两种方式:一种是基于HTTP的RPC,一种是基于TCP的RPC。 RPC也就是远程调用,RPC的实现包括客户端和服务端,也就是服务提供方和服务调用方,服务调用方发送RPC请求到服务提供方,服务提供方根据服务调用方的参数执行请求方法,将执行结果返回给调用方,这就是一次RPC请求。 要注意 无论是什么类型的数据,最终都是要转成二进制在网络上传输。 对象的序列化:就是将对象转成二进制流的过程。 对象的反序列化:就是将二进制流转成对象的过程。 Java中的序列化代码: //定义一个字节数组的输出流 ByteArrayOutputStream os= new ByteArrayOutputStream(); //对象的输出流 ObjectOutputStream out = new ObjectOutputStream(os); //将对象写入字节数组输出,进行序列化 out .writeObject(zhangsan); byte [] zhangsanByte=os

Glusterfs的rpc模块实现(第四部分)

匿名 (未验证) 提交于 2019-12-03 00:27:02
前面两个小节分别对rpc服务端和客户端的建立流程做了详细的分析,也就是说rpc客户端和服务器端已经能够进行正常的通信了(rpc客户端已经通过connect链接上rpc服务器了),那么这一小节主要根据一个实际的例子来分析一个完整的rpc通信过程。 下面以客户端创建逻辑卷(volume)为例来分析rpc的通信过程,就以下面这个客户端的命令开始: gluster volume create test-volume server3:/exp3 server4:/exp4 先简单看看glusterfs的客户端是怎样开始提交rpc请求的,提交准备过程流程图如下: 从上面的流程图可以看出真正开始提交 rpc 请求调用还是从具体命令的回调函数开始发起的,上面的流程图主要展示的是准备工作,下面从具体命令的回调函数开始分析,这里分析的实例是创建逻辑卷的命令,执行的函数是 cli_cmd_volume_create_cbk ,主要实现代码如下: 1 proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CREATE_VOLUME]; // 从rpc程序表中选择对应函数 2 3 frame = create_frame (THIS, THIS->ctx->pool); // 创建帧 4 5 ret = cli_cmd_volume_create_parse (words,

RPC协议底层原理与实现

匿名 (未验证) 提交于 2019-12-03 00:26:01
RPC协议基本组成 在一个典型RPC的使用场景中,包含了服务发现、负载、容错、 网络传输 、 序列化 等组件,其中RPC协议就指明了程序如何进行网络传输和序列化 。也就是说一个RPC协议的实现就等于一个非透明的RPC调用,如何做到的的呢? Client 客户端 Server 服务端 协议基本组成: 1. 地址:服务提供者地址; 2. 端口:协议指定开放的端口; 3. 运行服务: 1. netty(默认) 2. mina 3. RMI 服务 4. servlet 容器(jetty、Tomcat、Jboss) 4. 报文编码(编解码):协议报文编码 。 注①:http 报文编码 。注②:Dubbo 报文编码 5. 序列化方式: 1. Hessian2Serialization 、(默认) 2. DubboSerialization 、 3. JavaSerialization 4. JsonSerialization RPC协议报文编码与实现详解 注①:http 报文编码 注②Dubbo 协议报文编码: (注:相关源码参见 c om.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec ) 协议的编解码过程: Dubbo 协议编解码实现过程 (源码来源于 dubbo2.5.8 ) 1、DubboCodec.encodeRequestData()

rest和rpc的区别

匿名 (未验证) 提交于 2019-12-03 00:22:01
一、rest: REST 不是一种协议,它是一种架构, 大部分的REST的实现中使用了RPC的机制,大致与有 三部分组成: 1、method: 动词 (get,post之类的) 2、Host/post: URI(统一资源标识)、 服务器,端口 3、Path:名词(路径,服务器里面的某个东西)路径的结尾是 资源的形态(如text, html, image, pdf等)。 即、对host里面的某个Path里面的东西做一些get或post操作。 二、rpc: 2、通常的调用过程,把函数序列化,远端收到后,再把函数反序列化,完成函数调用。 三、rest和rpc的区别 rpc:想对服务器里面的资源进行修改,首先需要了解服务器中各个接口都是干啥的,然后把相关参数传给服务器提供的接口,让服务器自己去执行修改。 修改代码在服务端。 所以 RPC服务端逻辑更复杂些,服务器会有很大的工作量,但分工明确,不容易造成失误。可以基于tcp或http,如果基于tcp,将少一层协议。 REST风格: 想对服务器里面的资源进行操作, 下载服务器端的当前状态,修改之后将最终用户所期待的状态发送给服务器,服务器按照客户的期待进行修改。 修改代码在客户端。 所以 REST风格客户端逻辑相比rpc客户端更复杂。自由度更大一些,但因此造成失误的可能性也大一些。 传输层基于HTTP,相比于TCP,多了一层协议。但

什么是rpc

匿名 (未验证) 提交于 2019-12-03 00:22:01
RPC RPC全称为 Remote Procedure Call “远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 HTTP协议的( SOAP(XML)、Rest(JSON) Hessian( Binary TCP协议的(通常会借助Mina、Netty等 (例如Java平台的RMI、.NET平台Remoting) HTTP Rest、Thrift等 RPC) MQ、异步RPC) 常见的几种通信方式 / 只有二进制数据才能在网络中传输,序列化和反序列化的定义是: Java .NET Java 技术 简介 是否支持跨平台 Corbra 90 不支持 RMI EJB 不支持 WebService 基于 Http SOAP 支持 Hessain 基于 Http 支持 Rest spring mvc 支持 Http Rest API 支持 JMS MQ Java 支持 Socket 基于 Mina Netty NIO AIO 理论上支持 .NET 技术 简介 是否支持跨平台 WebService 基于 Http SOAP WCF 支持 .NET Remoting 通信效率尚可,使用复杂,逐渐被 WCF 不支持 WCF SOAP 整合了原有的 WebService 支持

RPC服务和HTTP服务

匿名 (未验证) 提交于 2019-12-03 00:19:01
本文简单地介绍一下两种形式的C/S架构,先说一下他们最本质的区别,就是 RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的 ,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹啦!下面来具体说一说RPC服务和HTTP服务。 OSI网络七层模型 在说RPC和HTTP的区别之前,我觉的有必要了解一下OSI的七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层: (从上到下) 第一层:应用层。定义了用于在网络中进行通信和传输数据的接口; 第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等; 第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断; 第四层:传输层。管理着网络中的端到端的数据传输; 第五层:网络层。定义网络设备间如何传输数据; 第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输; 第七层:物理层。这一层主要就是传输这些二进制数据。 实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。我们应该将重点放在应用层和传输层这两个层面。因为 HTTP是应用层协议,而TCP是传输层协议 。好,知道了网络的分层模型以后我们可以更好地理解为什么RPC服务相比HTTP服务要Nice一些! TCP(Transmission Control

理解rpc协议,为什么使用rpc

匿名 (未验证) 提交于 2019-12-03 00:12:02
RPC 全称 Remote Procedure Call――远程过程调用。在学校学编程,我们写一个函数都是在本地调用就行了。但是在互联网公司,服务都是部署在不同服务器上的分布式系统,如何调用呢? RPC技术简单说就是为了解决远程调用服务的一种技术,使得调用者像调用本地服务一样方便透明。 下图是客户端调用远端服务的过程: 1)客户端client发起服务调用请求。 2)client stub 可以理解成一个代理,会将调用方法、参数按照一定格式进行封装,通过服务提供的地址,发起网络请求。 3)消息通过网络传输到服务端。 4)server stub接受来自socket的消息 5)server stub将消息进行解包、告诉服务端调用的哪个服务,参数是什么 6)结果返回给server stub 7)sever stub把结果进行打包交给socket 8)socket通过网络传输消息 9)client slub 从socket拿到消息 10)client stub解包消息将结果返回给client。 一个RPC框架就是把步骤2到9都封装起来。 为什么需要RPC 1、首先要明确一点:RPC可以用HTTP协议实现,并且用HTTP是建立在 TCP 之上最广泛使用的 RPC,但是互联网公司往往用自己的私有协议,比如鹅厂的JCE协议,私有协议不具备通用性为什么还要用呢?因为相比于HTTP协议