rpc协议

从零开始手写 dubbo rpc 框架

荒凉一梦 提交于 2019-12-02 00:05:27
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的解释

大城市里の小女人 提交于 2019-12-01 22:48:23
如何科学的解释RPC 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域。 假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你要调用Calculator的add方法来执行一个加运算,直接new一个CalculatorImpl,然后调用add方法就行了,这其实就是非常普通的本地函数调用,因为在同一个地址空间,或者说在同一块内存,所以通过方法栈和参数栈就可以实现。 现在,基于高性能和高可靠等因素的考虑,你决定将系统改造为分布式应用,将很多可以共享的功能都单独拎出来,比如上面说到的计算器,你单独把它放到一个服务里头,让别的服务去调用它。 这下问题来了,服务A里头并没有CalculatorImpl这个类,那它要怎样调用服务B的CalculatorImpl的add方法呢? 有同学会说,可以模仿B/S架构的调用方式呀,在B服务暴露一个Restful接口,然后A服务通过调用这个Restful接口来间接调用CalculatorImpl的add方法。 很好,这已经很接近RPC了,不过如果是这样,那每次调用时,是不是都需要写一串发起http请求的代码呢?比如httpClient.sendRequest...之类的,能不能像本地调用一样,去发起远程调用,让使用者感知不到远程调用的过程呢,像这样: @Reference

我开始抄代码来学编程

帅比萌擦擦* 提交于 2019-12-01 18:50:08
之前研究 Hadoop 源码,把 hadoop-common 模块下的 RPC 模块源码通读一遍,又花了 3 个月抄了一遍 Hadoop RPC 代码,学到很多东西。我觉得学习编程最有效的方式就是抄代码,我觉得这个过程对正在学编程的朋友很有帮助,所以想做成教程,以下是周末写的一个开头,后续教程的形式以及进展会发布在公众号,有兴趣的朋友欢迎文末关注 。 1. 起源 故事得从19年上半年说起,那时候我正打算研究一下Hadoop源码。 现在大家都听说过Hadoop,它是一个分布式存储和计算的框架。作为分布式系统,节点之间的通信、交互式必不可少的。Hadoop自己实现了RPC(Remote Procedure Call,远程过程调用)模块来满足这样的需求。带着好奇,我便阅读了整个Hadoop RPC模块的源代码,读完后发现这个模块设计的非常好,与其他模块无耦合,完全可以独立出来当成一个独立的框架。为了能够学习相关的编程知识,同时还可以看到Apache 顶级开源项目的代码如何编写的,因此我便把Hadoop RPC模块做成教程。 虽然这个项目是实现RPC功能,但我觉得我们重点不应该过多关注RPC本身,而应该重点学习RPC所涉及的客户端开发、服务端开发、网络编程、多线程、并发编程、设计模式等核心知识,尤其是对于刚学习Java没有接触线上实战项目的朋友,掌握好了这些知识,写其他项目也会更有思路。

http接口、api接口、RPC接口、RMI、webservice、Restful等概念

人盡茶涼 提交于 2019-12-01 10:52:48
在这之前一定要好好理解一下接口的含义,我觉得在这一类中接口理解成规则很恰当。 http接口 :基于HTTP协议的开发接口.这个并不能排除没有使用其他的协议。 api接口 :API(Application Programming Interface)应用程序编程接口,应用也包括网络应用程序,就像api文档基本上就是使用说明书,API接口可以简单理解成“应用程序使用接口”。 RPC接口 :Remote Procedure Calls 远程过程调用 (RPC) 是一种协议,程序可使用这种协议向网络中的另一台计算机上的程序请求服务。由于使用 RPC 的程序不必了解支持通信的网络协议的情况,因此 RPC 提高了程序的互操作性。在 RPC 中,发出请求的程序是客户程序,而提供服务的程序是服务器。 RPC(远程过程调用)是一项广泛用于支持分布式应用程序(不同组件分布在不同计算机上的应用程序)的技术。RPC 的主要目的是为组件提供一种相互通信的方式,使这些组件之间能够相互发出请求并传递这些请求的结果。 没有语言限制。 RMI :RMI(Remote Method Invocation,远程方法调用)RMI是针对于java语言的, RMI 允许您使用Java编写分布式对象 Webservice接口: Webservice是系统对外的接口,比如你要从别的网站或服务器上获取资源或信息

【Java】分布式RPC通信框架Apache Thrift 使用总结

↘锁芯ラ 提交于 2019-11-30 18:50:34
简介   Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。   RPC即Remote Procedure Call,翻译为远程过程调用。任何RPC协议的实现终极目标都是让使用者在调用远程方法的时候就像是调用本地方法一样简单,从而提高使用远程服务的效率。   现代互联网架构多数基于SOA思想而搭建,即面向服务化的架构。服务提供方称为Provider,服务的使用方称为Consumer,有时也把服务提供方称为Server端,使用方称为Client端,即典型的CS模型。这里的远程调用,主要指跨进程的调用,Provider和Consumer可能是同一机器的不同进程,也可能在不同的机器,通过网络相互通信,大部分情况下两者会部署在不同的物理机器上,这种情况下由于网络通信的开销就会对RPC框架的性能要求极高。 下面分别从服务端和客户端的视角来介绍Thrift在RPC中的应用。 服务端(Server) 服务端需要发布一个服务给别人使用,首先要约定好服务的接口,包括以下几个部分: 服务的名称 服务使用时的参数 返回结果 Thrift自己规定了一套接口定义语言(IDL)来描述服务,用后缀为

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

◇◆丶佛笑我妖孽 提交于 2019-11-30 15:53:11
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协议

Spring Cloud 与 Dubbo 区别

给你一囗甜甜゛ 提交于 2019-11-30 13:22:43
Dubbo Spring Cloud 服务注册中心       Zookeeper Spring Cloud Netflix Eureka 服务调用方式 RPC           REST API 服务监控 Dubbo-monitor Spring Boot Admin 断路器 不完善 Spring Cloud Netflix Hystrix 服务网关 无 Spring Cloud Netflix Zuul 分布式配置 无 Spring Cloud Config 服务跟踪 无 Spring Cloud Sleuth 消息总线 无 Spring Cloud Bus 数据流 无 Spring Cloud Stream 批量任务 无 Spring Cloud Task ...... ...... ...... 最大的区别:Spring Cloud抛弃了Dubbo 的RPC通信,采用的是基于HTTP的REST方式。 严格来说,这两种方式各有优劣。虽然在一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适。 总结: Dubbo和Spring Cloud并不是完全的竞争关系,两者所解决的问题域不一样

Java性能之优化RPC网络通信

痴心易碎 提交于 2019-11-30 10:57:10
服务框架的核心 大型服务框架的核心:RPC通信 微服务的核心是远程通信和服务治理 远程通信提供了服务之间通信的桥梁,服务治理提供了服务的后勤保障 服务的拆分增加了通信的成本,因此远程通信很容易成为系统瓶颈 在满足一定的服务治理需求的前提下,对远程通信的性能需求是技术选型的主要影响因素 很多微服务框架中的服务通信是基于RPC通信实现的 在没有进行组件扩展的前提下,Spring Cloud是基于Feign组件实现RPC通信(基于HTTP+JSON序列化) Dubbo是基于SPI扩展了很多RPC通信框架,包括RMI、Dubbo、Hessian等(默认为Dubbo+Hessian序列化) 性能测试 基于Dubbo:2.6.4,单一TCP长连接+Protobuf(响应时间和吞吐量更优),短连接的HTTP+JSON序列化 RPC通信 架构演化 无论是微服务、SOA、还是RPC架构,都是分布式服务架构,都需要实现服务之间的互相通信,通常把这种通信统称为RPC通信 概念 RPC:Remote Process Call,远程服务调用,通过网络请求远程计算机程序服务的通信技术 RPC框架封装了底层网络通信和序列化等技术 只需要在项目中引入各个服务的接口包,就可以在代码中调用RPC服务(如同调用本地方法一样) RMI RMI:Remote Method Invocation

NodeManager概述(基本职能和内部架构)

蓝咒 提交于 2019-11-30 10:30:39
概述 NodeManager是运行在单个节点上的代理,它需要与应用程序的的ApplicationMaster和集群管理者ResourceManager交互: 从ApplicationMaster上接收有关Container的命令并执行之(比如启动,停止Container); 向ResourceManager汇报各个Container运行状态和节点健康状况,并领取有关Container的命令(比如清理Container)执行之 NodeManager是YARN中单个节点上的代理,它管理Hadoop集群中单个计算节点,功能包括与ResourceManager保持通信,管理Container的生命周期,监控每个Container的资源使用(内存,CPU等)情况,追踪节点健康状况,管理日志和不同应用程序用到的附属服务 NodeManager基本职能 NodeManager需通过两个RPC协议与ResourceManager服务和各个应用程序的ApplicationMaster交互 ResourceTrackerProtocol协议 NodeManager通过该RPC协议向ResourceManager注册,汇报节点健康状况和Container运行状态,并领取ResourceManager下达的命令,包括重新初始化,清理Container占用资源等.在该RPC协议中

RPC原理及RPC实例分析

老子叫甜甜 提交于 2019-11-30 07:51:23
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。 RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有: 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud、Facebook 的 Thrift、Twitter 的 Finagle 等。 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。 通信框架:MINA 和 Netty。 ps: Google gRPC 框架是基于 HTTP2 协议实现的,底层使用到了 Netty 框架的支持。 1. RPC 框架 一个典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中“RPC 协议”就指明了程序如何进行网络传输和序列化。 图 1:完整 RPC 架构图 2. RPC 核心功能 一个 RPC 的核心功能主要有 5 个部分组成,分别是:客户端、客户端 Stub、网络传输模块、服务端 Stub、服务端等。 图 4:RPC 核心功能图 下面分别介绍核心 RPC 框架的重要组成: 客户端(Client):服务调用方。 客户端存根(Client Stub):存放服务端地址信息