rpc协议

RPC是什么?

為{幸葍}努か 提交于 2020-02-28 10:50:16
目录 1、什么是RPC? 2、典型RPC调用框架 3、Thrift框架介绍 1、什么是RPC? (1)RPC(remote procedure call):远程调用过程。 服务器A部署应用a,服务器B部署应用b,当A服务器调用B服务器上的b应用的函数或者方法时,因为不在同一内存空间,不能直接调用,必须通过网络来表达调用的语义传达调用的数据。 既然是调用B机器上的服务,那A机器自己也创建一个这个服务不就也可以调用了么。原理上是可以这么做,但是随着计算机的横向发展,集群的出现,使得多台机器部署成一个集群来对外提供服务。无法在一个进程内甚至同一台计算机上完成的需求就得需要RPC来实现了。 RPC的框架很多,比如最早的额CORBA,Java RMI,Web Service的RPC风格,Hessian,Thrift,甚至是Rest API。 (2) 本地过程调用过程 RPC就是要像调用本地的函数一样去调远程函数。在研究RPC前,我们先看看本地调用是怎么调的。假设我们要调用函数Multiply来计算lvalue * rvalue的结果: 1 int Multiply(int l, int r) { 2 int y = l * r; 3 return y; 4 } 5 6 int lvalue = 10; 7 int rvalue = 20; 8 int l_times_r = Multiply

2.微服务--RPC

元气小坏坏 提交于 2020-02-25 15:48:33
1.RPC简介 1.远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。 2.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。 3.如果涉及的软件采用面向对象编程,那么远程过程调用也可称为远程调用或远程方法调用。 2.流行的RPC框架的对比 3.golang中如何实现RPC Golang中实现RPC比较简单,官方提供了封装好的库,还有第三方库。 官方库:net/rpc 1.net/rpc库使用encoding/gob进行编码 2.支持tcp和http数据传输方式 3.由于其他语言不支持gob编解码方式,所以golang的RPC只支持golang开发的服务端与客户端的交互 官方库:net/jsonrpc 1.jsonrpc采用JSON进行数据编解码,因而支持跨语言调用。 2.jsonrpc库是基于tcp协议实现的,暂不支持http传输方式。 golang的RPC必须符合四个条件才可以: 1.结构体字段首字母要大写,要跨域访问,所以大写。 2.函数名必须首字母大写。 3.函数第一个参数是接收参数,第二个参数是返回给客户端参数,必须是指针类型。 4.函数必须有一个返回值err。 3.1示例1 golang实现RPC程序,实现求矩形面积和周长 //rpcClient/server.go package

RPC框架之Dubbo

烂漫一生 提交于 2020-02-24 02:51:38
问题1:为什么要把系统拆分成分布式的?为啥要用dubbo? 1.为什么要将系统进行拆分? 要是不拆分系统,一个大系统几十万行代码,很多人共同维护一份代码,简直是悲剧; 拆分了以后,一个大系统拆分成很多小服务,平均每个系统也就几万行代码,每个服务部署到单独的机器 2.如何进行服务拆分? ​ 大部分系统,是要进行多轮拆分的,第一次拆分就可能将原来的多个模块拆分开来。 ​ 但是后来可能每个系统都变得很复杂了,每个模块拆分出来的服务又要继续拆分。 3.拆分后可以不用dubbo吗? ​ 当然可以,大不了各个系统之间,直接基于springmvc,就通过纯httpj接口互相通信。但是这里肯定是由问题的,因为HTTP接口通信维护起来成本很高,要考虑超时重试,负载均衡等各种问题。 所以dubbo说白了,就是一个rpc框架,就是本地就是进行接口调用,但是dubbo会代理这个调用请求,跟远程机器网络通信,处理负载均衡,服务上下线自动感知,超时重试等问题,就不用我们自己做,交给dubbo。 ​ 问题2:说一下dubbo的工作原理,注册中心挂了可以继续通信吗?说一下一次rpc请求的流程? 1.dubbo工作原理 2.dubbo分层 第一层:service层,需要服务提供方和消费方来实现 第二层:config层,配置层,主要是对dubbo的各种配置 第三层:proxy层,服务代理层

概念回顾---中间件(IDC)

社会主义新天地 提交于 2020-02-17 09:42:14
转自 http://www.itisedu.com/phrase/200604241155005.html 中间件 (IDC) 定义: 中间件 ( middleware )是一种独立的系统 软件 或服务 程序 ,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的 操作系统 之上,管理计算资源和网络通信 提出原因: 为解决分布异构问题这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,它们可以有符合接口和协议规范的多种实现。 也许很难给中间件一个严格的定义,但中间件应具有如下的一些特点: 满足大量应用的需要 运行于多种硬件和 OS 平台 支持分布计算,提供跨网络、硬件和 OS 平台的透明性的应用或服务的交互 支持标准的协议 支持标准的接口 IDC 分类: 终端仿真 / 屏幕转换中间件、数据访问中间件、 远程过程调用 中间件、 消息 中间件、交易中间件、 对 象 中间件。下面,针对几类主要的中间件分别加以简要的介绍。 1 、远程过程调用 远程过程调用是一种广泛使用的分布式应用程序处理方法。一个应用程序使用 RPC 来 “ 远程 ” 执行一个位于不同地址空间里的过程,并且从效果上看和执行本地调用相同。事实上,一个 RPC 应用分为两个部分: server 和 Client 。 server 提供一个或多个远程过程; client 向 server

java技术栈

99封情书 提交于 2020-02-12 04:22:24
1 java基础: 1 算法 1.1 排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序 1.2 二叉查找树、红黑树、B树、B+树 1.3 BitSet解决数据重复和是否存在等问题 2 基本 2.1 字符串常量池的迁移 jdk1.6,string in PermGen永久代,方法区,在运行时大小不可扩展, jdk1.7,string in heap,-XX:StringTableSize=1009(default),WeakHashMap<String, WeakReference<String>> jdk1.8,string in heap,default table size 25-50K 2.2 字符串KMP算法 2.3 equals和hashcode 2.4 泛型、异常、反射 2.5 string的hash算法 2.6 hash冲突的解决办法:开放定址法和拉链法 2.7 foreach循环的原理 2.8 static、final、transient等关键字的作用 2.9 volatile关键字的底层实现原理 2.10 Collections.sort方法使用的是哪种排序方法 2.11 Future接口,常见的线程池中的FutureTask实现等 2.12 string的intern方法的内部细节,jdk1.6和jdk1

RPC 框架性能大比拼

霸气de小男生 提交于 2020-02-11 11:59:49
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 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框架经常用在服务的大并发调用的环境中,性能的好坏决定服务的质量以及公司在硬件部署上的花费。 本文通过一个统一的服务,测试这四种框架实现的完整的服务器端和客户端的性能。 这个服务传递的消息体有一个protobuf文件定义: syntax =

golang原生的RPC实现

十年热恋 提交于 2020-02-08 16:54:36
server端代码 package main import ( "math" "net" "net/http" "net/rpc" ) //math calculate type MathUtil struct { } //该方法对外暴露,提供计算圆形面积的服务 func (mu *MathUtil)CalculateCircleArea(req float32,resp *float32)error{ *resp = math.Pi * req * req //计算圆形面积 s= pi * r * r return nil } func main(){ //1.初始化指针数据类型 mathUtil := new(MathUtil) //2.调用net/rpc包的功能 将服务对象进行注册 err := rpc.Register(mathUtil) //如果想自定义服务名,可以使用rpc.RegisterName("MathUtil",mathUtil) if err != nil { panic(err.Error()) } //3.通过该函数把mathUtil中提供的服务注册到http协议上,方便调用者可以利用http的方式进行数据传递 rpc.HandleHTTP() //4.在特定的端口进行监听 listen,err := net.Listen("tcp",":8081")

手写rpc框架

天大地大妈咪最大 提交于 2020-02-07 03:06:05
文章目录 手写rpc框架 rpc概念 rpc是什么 为什么要用rpc rpc核心概念术语 rpc的流程 开发rpc框架 设计客户端 代理对象生成 发现者 协议层 网络层 实现客户端 代理对象生成 发现者 协议层 网络层 设计服务端 RPCServer RequestHandler ServiceRegister 实现服务端 RPCServer RequestHandler ServiceRegister 实现高并发 RPC 框架的要素 手写rpc框架 rpc概念 rpc是什么 远程过程调用 (Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作 远程调用 或 远程方法调用 。 为什么要用rpc RPC框架介于传输层和应用中间,它会帮助处理: 服务化 可重用 系统间交互调用 rpc核心概念术语 Client、Server、calls、replies、service、programs、procedures、version、marshalling(编组)、unmarshalling(解组) 一个网络服务由一个或多个远程程序集构成 一个远程程序实现一个或多个远程过程 过程、过程的参数

RPC浅谈

ぐ巨炮叔叔 提交于 2020-02-01 17:15:43
RPC RPC(Remote Procedure Call) 广义上的RPC RPC(架构)框架 RPC框架原理 PRC架构组件 PRC架构调用过程 常见的RPC框架及分类 常见的RPC 框架的比较 RPC协议 MVC架构、RPC架构、SOA架构、微服务架构区别 单体架构 MVC(Model View Controller) 多服务架构 RPC(Remote Procedure Call)远程过程调用 SOA(Service Oriented Architecture)面向服务架构 微服务架构(轻量级的服务治理方案) RPC(Remote Procedure Call) 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 个人觉得单纯的讲RPC 是没有意义的。 RPC应该被分为广义上的RPC ,RPC框架,RPC协议(后2个暂且称之为狭义的RPC) 广义上的RPC 所谓广义RPC 根据定义 通过网络调用远程计算机上的服务即可称之为RPC 。所以任何符合该说明的都应该属于RPC。包括常见的web服务个人觉得其实也可以理解为RPC. RPC(架构)框架 RPC框架原理 PRC架构组件 一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。

一个故事讲清楚NIO

試著忘記壹切 提交于 2020-01-30 07:40:32
from : https://www.cnblogs.com/LBSer/p/4853234.html 你应该知道的 RPC原理    在学校期间大家都写过不少程序,比如写个 hello world服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。   而一旦踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题: 1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用? 2)其它团队要使用我们的新服务,我们的服务该怎么发布以便他人调用?下文将对这两个问题展开探讨。 1 public interface HelloWorldService { 2 String sayHello(String msg); 3 } 1 public class HelloWorldServiceImpl implements HelloWorldService { 2 @Override 3 public String sayHello(String msg) { 4 String result = "hello world " + msg; 5 System.out.println(result); 6 return result; 7 } 8