RPC系列之--远程过程调用(RPC,Remote Procedure Call)

RPC系列之–远程过程调用(RPC,Remote Procedure Call)

RPC简介
1.什么是rpc

远程过程调用(英语:Remote Procedure Call,缩写为 RPC,也叫远程程序调用)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。

在这里插入图片描述
2. 背景与用途

在单台计算机中,我们可以通过程序调用来传递控制和数据;或者说通过程序调用,我们可以将多个程序组成一个整体来实现某个功能。

如果将这种调用机制推广到多台彼此间可以进行网络通讯的计算机,由多台计算机中的多个程序组成一个整体来实现某个功能,这也是可以的。调用的一方(发起远程过程调用,然后调用这方的环境挂起,参数通过网络传递给被调用方,被调用的一方执行程序,当程序执行完成后,产生的结果再通过网络回传给调用的一方,调用的一方恢复继续执行。这样一种原型思想,就是我们所说的RPC远程过程调用。
在这里插入图片描述

RPC这种思想最早可以追溯到1976年,RPC的发展到今天已经40年有余了。

如今的计算机应用中,单机性能上很难承受住产品的压力,需要不断扩充多台机器来提升整体的性能。同时为了充分利用这些集群里的计算机,需要对其从架构上进行划分,以提供不同的服务,服务间相互调用完成整个产品的功能。RPC就能帮助我们解决这些服务间的信息传递和调用。

  1. 概念说明
    关于RPC的概念,我们可以从广义和狭义来分别进行理解。

广义

  • 我们可以将所有通过网络来进行通讯调用的实现统称为RPC。

  • 按照这样来理解的话,那我们发现HTTP其实也算是一种RPC实现。
    在这里插入图片描述

狭义

区别于HTTP的实现方式,在传输的数据格式上和传输的控制上独立实现。比如在机器间通讯传输的数据不采用HTTP协议的方式(分为起始行、header、body三部份),而是使用自定义格式的二进制方式。

我们更多时候谈到的RPC都是指代这种狭义上的理解。

  1. 优缺点
    相比于传统HTTP的实现而言:

优点

  • 效率高
  • 发起RPC调用的一方,在编写代码时可忽略RPC的具体实现,如同编写本地函数调用一样

缺点

  • 通用性不如HTTP好 因为传输的数据不是HTTP协议格式,所以调用双方需要专门实现的通信库,对于不同的编程开发语言,都要有相关实现。而HTTP作为一个标准协议,大部分的语言都已有相关的实现,通用性更好。

HTTP更多的面向用户与产品服务器的通讯。

RPC更多的面向产品内部服务器间的通讯。 thrift

RPC结构

RPC的设计思想是力图使远程调用中的通讯细节对于使用者透明,调用双方无需关心网络通讯的具体实现。因而实现RPC要进行一定的封装。

RPC原理上是按如下结构流程进行实现的。
在这里插入图片描述

流程:

  • 1调用者(Caller, 也叫客户端、Client)以本地调用的方式发起调用;
  • 2Client stub(客户端存根,可理解为辅助助手)收到调用后,负责将被调用的方法名、参数等打包- - 编码成特定格式的能进行网络传输的消息体;
  • 3Client stub将消息体通过网络发送给对端(服务端)
  • 4Server stub(服务端存根,同样可理解为辅助助手)收到通过网络接收到消息后按照相应格式进行- 拆包解码,获取方法名和参数;
  • 5Server stub根据方法名和参数进行本地调用;
  • 6被调用者(Callee,也叫Server)本地调用执行后将结果返回给server stub;
  • 7Server stub将返回值打包编码成消息,并通过网络发送给对端(客户端);
  • 8Client stub收到消息后,进行拆包解码,返回给Client;
  • 9Client得到本次RPC调用的最终结果。
    在这里插入图片描述

可先看gRPC相关内容 https://blog.csdn.net/Jack_yun_feng/article/details/96351743

test.proto

syntax = "proto3";  // 指定协议的版本号

/*
需求:  {data='zs', info={age=10, score=80}} = func1(age=10, scores=[80, 70, 60])

*/


// message用于定义数据(请求/响应)类型
// 请求数据的类型
message TestRequest {
    int32 age=1;  // 每个字段必须定义字段编号, 并且在同一个数据类型中不能重复
    repeated int32 scores=2;  // 定义列表类型数据
}

message Info{
    int32 age=1;
    int64 score=2;
}

// 响应数据类型
message TestResponse {
    string data=1;  // 字符串
    Info info=2;  // 自定义的数据类型
}


// service用于定义远程调用的函数
service TestService {
    rpc func1 (TestRequest) returns (TestResponse) {}
}

使用grpcio-tools编译器编译命令生成2个文件

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. test.proto

grpcio-tools安装包

pip install grpcio-tools

test_pb2.py


# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor.FileDescriptor(
  name='test.proto',
  package='',
  syntax='proto3',
  serialized_options=None,
  serialized_pb=_b('\n\ntest.proto\"*\n\x0bTestRequest\x12\x0b\n\x03\x61ge\x18\x01 \x01(\x05\x12\x0e\n\x06scores\x18\x02 \x03(\x05\"\"\n\x04Info\x12\x0b\n\x03\x61ge\x18\x01 \x01(\x05\x12\r\n\x05score\x18\x02 \x01(\x03\"1\n\x0cTestResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\t\x12\x13\n\x04info\x18\x02 \x01(\x0b\x32\x05.Info25\n\x0bTestService\x12&\n\x05\x66unc1\x12\x0c.TestRequest\x1a\r.TestResponse\"\x00\x62\x06proto3')
)




_TESTREQUEST = _descriptor.Descriptor(
  name='TestRequest',
  full_name='TestRequest',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='age', full_name='TestRequest.age', index=0,
      number=1, type=5, cpp_type=1, label=1,
      has_default_value=False, default_value
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值