RPC 是什么 (what)

Remote Procedure Call,缩写为 RPC

远程过程调用

客户端和服务器端约定好一个接口 (eg: SOA api 里边的接口)

客户端调用接口的时候,去请求服务器端

服务器端进行处理,返回结果

A、user-system启动一个socket-server,监听某个端口,用json作为传输数据的协议;

B、blog-system则用socket去connect我们的server,并按要求发送一个json数据给server;

C、server收到请求以后,取出json数据中的user_id,从数据库中查出user,并打包成一个json,返回给client;

D、blog-system收到返回的json,包装成对应的格式,展示给用户。

为什么用 RPC (why)

  • 它可以简化分布式系统内,不同服务间的数据交换。
  • 因为这些东西被封装简化了,所以,他顺带带来的好处就是:代码极大的简化。
  • 一般这种调用的封装还支持多语言、多操作系统,所以,他能帮我们极好的实现跨平台跨语言。
  • 更高效的数据传输。因为RPC封装了数据交换的协议,所以可以在里面极大的优化数据传输的算法,和传输方式。从而压缩数据传输的量

底层原理 (how)

How IT works ?整体流程

1)服务消费方(client)调用以本地调用方式调用服务;

2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3)client stub找到服务地址,并将消息发送到服务端;

4)server stub收到消息后进行解码;

5)server stub根据解码结果调用本地的服务;

6)本地服务执行并将结果返回给server stub;

7)server stub将返回结果打包成消息并发送至消费方;

8)client stub接收到消息,并进行解码;

9)服务消费方得到最终结果。

RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。

再举个例子:

古代有个 将军在外边打仗,遇到一拨人,说是友军,但他没见过。

于是他为了查证这些人,要将这些人的信息传回给总部。 根据总部的回复来判断。

1他给身边的军师说: 问一下司令部,这些穿着迷彩服,拿着 ak 的人是的上级是哪里的?哪个分部的?

服务消费方(client)调用以本地调用方式调用服务

2军师就 写信 给司令部: 我们在某某地方遇到穿着迷彩服,拿着 ak 的人是的上级是哪里的?哪个分部的?

client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体

3然后选择了 飞鸽传书 或者是 (让下边的小弟快马加鞭) ,将这封信送到了司令部。

client stub找到服务地址,并将消息发送到服务端;

4司令部的通讯员接收到这封信,

server stub收到消息后进行解码;

5然后把内容读给司令部参谋长,

server stub根据解码结果调用本地的服务;

6 参谋长说告诉通讯员 : 这不是友军,这是骗子啊。

本地服务执行并将结果返回给server stub

7司令部通讯员把参谋长的话记录下来,写到信里,通过同样的方式返回给军师

server stub将返回结果打包成消息并发送至消费方

8军师收到信,拆开阅读

client stub接收到消息,并进行解码;

9军师告诉将军结果

服务消费方得到最终结果。

How IT works ?协议层

协议层 (2,5,7)

public interface HelloWorldService {

String sayHello(String msg);

}

IDL(Interface Description Language):接口定义语言。

service TUserService{

struct.TUser getUser (1: required i32 uid);

}

传输什么

接口名称 HelloWorldService

方法名 sayHello

参数类型&参数值 string String

超时时间

请求信息 (eg: unique RequestId,版本号)

如何传

即序列化与反序列化

语言层面 jvm自带 , kyro 等

语言无关 json Hessian

How IT works ?通信层

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

当我们要启动一个server的时候,最简单的就是按我们之前的那种方式,启动一个server-socket。但是这个模型太简单,以至于只要轻轻的给一些压力,服务就可能崩塌。因此,我们需要一个高承载能力的server模型。

现在在linux平台上,大家基本都使用epoll模型。这个是非阻塞的事件驱动模型,能够根据请求事件来触动业务逻辑。所以具有很强的负载能力。现在主流的服务器,比如:nginx、mina、netty等等,都基本采用这种底层模型。

细节是魔鬼

负载均衡

有多台提供服务,我该选择哪一台?

1.轮询

2.随机

3.最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求

4.一致性Hash,相同参数的请求总是发到同一提供者

容错策略

访问出错了,该怎么办?

1.失败自动切换,当出现失败,重试其它服务器,通常用于读操作(推荐使用)

2.快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作

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

路由规则

设定某些请求只有个别服务器可以/不可以 处理。

现有的一些 rpc 框架

DUBBO

http://dubbo.io

Motan

http://weibo.com/ttarticle/p/show?id=2309403951077522312320

GRPC (跨语言)

参考资料

https://zh.wikipedia.org/wiki/遠程過程調用

http://mp.weixin.qq.com/s?__biz=MzA3MDExNzcyNA==&mid=2650392260&idx=1&sn=5a4978d02326cdd38e2ea1cd9586b4df

http://blog.jobbole.com/92290/

http://dubbo.io

postman调用rpc服务器接口_RPC 原理相关推荐

  1. 如何用postman测试导出excel接口

    今天后台写了一个导出excel接口,调用的时候发现输出一堆乱码,瞬间懵了!!!好像这么久了还是第一次掉导出excel的接口,之前还试过导入的接口,今天这在一起说一下. 1.postman调用导入接口 ...

  2. postman调用webservice接口_【分享】关于接口对前后端和测试的意义

    1.什么是接口? 接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点来,通过一些特殊的规则也就是协议,来进行数据之间的交互. 2.接口都有哪些类型? ...

  3. postman调用webservice接口_接口对前后端和测试的意义

    1.什么是接口? 接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点来,通过一些特殊的规则也就是协议,来进行数据之间的交互. 2.接口都有哪些类型? ...

  4. [架构之路-61]:目标系统 - 平台软件 - 基础中间件 - 远程过程(函数)调用RPC原理与其网络架构

    目录 第1章 远程过程/函数调用RPC概述 1.1 什么是编程语言原生的函数调用 1.2 IPC:(Inter Process Communication )跨进程通信 1.4 什么是本地过程(函数) ...

  5. AppScan api登录接口 postman_如何通过Postman调用EDI系统的API?

    知行EDI系统主要是用来实现贸易双方的数据交换的过程,这个过程中,贸易双方往往需要根据国际通用的消息格式收发信息,我们称符合国际规范的消息文件为EDI报文,然而不同的公司会结合ERP的接口情况选择不同 ...

  6. python rpc_对python调用RPC接口的实例详解

    要调用RPC接口,python提供了一个框架grpc,这是google开源的 rpc相关文档: 需要安装的python包如下: 1.grpc安装 pip install grpcio 2.grpc的p ...

  7. 调用大智慧L2接口是什么原理?作用是什么?

    有些开发人员想要设计一个微信公众号或者微信小程序,由于自己搭建数据库工作量太大,或者技术受限,也会选择调用大智慧L2接口减少工作量.调用大智慧L2接口是什么原理?作用是什么? 大智慧L2接口即应用程序 ...

  8. 微信开发 --- 调用微信上传图片接口,并保存到自己的服务器

    微信开发 - 调用微信上传图片接口,并保存到自己的服务器 整体思路是这样的: 1.先把手机上的图片上传到微信服务器,然后返回一个图片ID 2.在通过后台根据ID从微信后台拿到流,保存到服务器 前几个步 ...

  9. 网站调用其他服务器的Api,服务器接口调用方法

    服务器接口调用方法 内容精选 换一换 登录Windows操作系统的弹性云服务器时,需使用密码方式登录.因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员密 ...

最新文章

  1. Python 1 数据类型的操作
  2. 在Windows环境下配置QT Creator 读取NC文件(NetCDP,C++接口)
  3. Java基础教程——Set
  4. 机器学习都需要有哪些数学知识?
  5. vscode插件开发实践与demo源码
  6. 容器编排技术 -- Kubernetes kubectl annotate 命令详解
  7. 年薪201万!华中科大AI博士生入选华为天才少年计划!
  8. [导入]Silverlight 的 Data Bindings:Silverlight 與 ASP.NET Ajax
  9. 20171130C语言知识点梳理
  10. kali怎么进入root用户_ubuntu系统密码忘了怎么办(root或一般用户)
  11. 程序员到项目经理:从内而外的提升(比较全面的介绍)
  12. Nb iot php_NB-IoT是什么
  13. java jbutton 不显示_java JButton显示问题
  14. 深度强化学习方法(DQN)玩转Atari游戏(pong)
  15. 红尘梦落,卧醉千年,当所有的繁华散尽
  16. Linux之端口映射
  17. 香农三大定理、香农公式
  18. 几种常用数据库的区别
  19. 使用VirtualBox安装Linux虚拟机,避坑指南
  20. 公司 电脑突然 上不去网络 无网络访问

热门文章

  1. 华为数据库,安全的保障
  2. esp8266灯上电闪一下_【零知ESP8266教程】快速入门2-点亮外部LED灯
  3. IDEA创建 Git 分支
  4. Webshell河马后门查杀工具配合shell脚本实现多站点自动化查杀
  5. css动画怎么暂停,纯CSS方式实现CSS动画的暂停与播放!
  6. unity3d游戏暂停
  7. 对称加密算法之基于口令加密——PBE
  8. 老广的味道第五季笔记
  9. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。 //已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
  10. 卡通动画项目 —— 写代码 —— 睡觉 —— 丝滑如德芙