rpc与grpc学习记录

news2024/11/26 4:42:39

文章目录

  • 1、RPC
  • 2、gRPC
  • 多线程python
  • grpc代码
    • 1、安装python需要的库:
    • 2、grpc编程步骤
    • 3、Demo1
      • 3.1、编写 .proto文件,定义接口和数据类型
      • 3.2、编译 .proto文件生成存根文件
      • 3.3、编写服务器端代码:
      • 3.4、编写客户端代码:
      • 3.5、测试

1、RPC

RPC是Remote Procedure Call的简称,中文叫远程过程调用。

RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP或者HTTP)、序列化方式(XML/Json/ 二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程,使得开发网络分布式程序在内的应用程序更加容易。

说的白话一点,可以这么理解:现在有两台服务器A和B。部署在A服务器上的应用,想调用部署在B服务器上的另一个应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来达到调用的效果。

现在,我们在A服务的一个本地方法中封装调用B的逻辑,然后只需要在本地使用这个方法,就达到了调用B的效果。对使用者来说,屏蔽了细节。你只需要知道调用这个方法返回的结果,而无需关注底层逻辑。

那,从封装的那个方法角度来看,调用B之前我们需要知道什么?

当然是一些约定。比如:
1、调用的语义,也可以理解为接口规范。(比如RESTful)
2、网络传输协议。 (比如HTTP)
3、数据序列化反序列化规范(比如JSON)。

有了这些约定,我就知道如何给你发数据,发什么样的数据,你返回给我的又是什么样的数据。

在这里插入图片描述
从上图中可以看出,RPC是一种客户端-服务端(Client/Server)模式

HTTP 和 RPC 有什么区别?

首先这个问题本身不太严谨。HTTP只是一个通信协议,工作在OSI第七层。而RPC是一个完整的远程调用方案。它包含了:接口规范、传输协议、数据序列化反序列化规范。

这样看,RPC和 HTTP的关系只可能是包含关系。为什么是可能?因为RPC传输协议那块我可以不基于HTTP,可以基于TCP或UDP。

所以这个问题应该改成:基于HTTP的远程调用方案 (如:HTTP+RESTful+JSON) 和直接使用RPC远程调用方案有什么区别。

业界主流的 RPC 框架整体上分为三类:

  • 支持多语言的 RPC 框架,比较成熟的有 Google 的 gRPC、Apache(Facebook)的 Thrift;
  • 只支持特定语言的 RPC 框架,例如新浪微博的 Motan;
  • 支持服务治理等服务化特性的分布式服务框架,其底层内核仍然是 RPC 框架, 例如阿里的
    Dubbo。《秒懂Dubbo框架(原理篇)》

2、gRPC

gRPC,则是RPC的一种,它是免费且开源的,由谷歌出品,主要面向移动应用开发且基于HTTP/2协议标准而设计,同时支持大多数流行的编程语言。

gRPC的典型特征就是使用protobuf(全称protocol buffers)作为其接口定义语言(Interface Definition Language,缩写IDL),同时底层的消息交换格式也是使用protobuf。

gRPC要求client存放一个stub(存根:提供与服务器相同的方法和功能),stub由gRPC框架自动生成。有了stub后,开发人员只需要关心具体的业务逻辑,而不需要关心网络通信相关实现原理。

client的stub是由编译.protoc文件后gRPC这个框架自动生成的,可以利用插件快速将.proto文件生成gRPC需要的stub。
在这里插入图片描述

参考文:

《什么是 gRPC ?什么是 RPC?》:大白话,首先解释了rpc,再解释rpc和gprc的关系,解释得很直白与明白。

《gRPC详解》

《初识gRPC》

《.net高级面试进阶篇(一):GRPC》

多线程python

《Python 中的并发编程和异步编程》

《Python threading实现多线程 基础篇》

grpc代码

1、安装python需要的库:

安装grpc

pip install grpcio

安装gRPC tools

pip install grpcio-tools 

注:gRPC tools包含了protobuf的编译器protoc,以及编译插件grpc_python_out(后面编译会用到)。且里面已经自动安装了protobuf库,不用再单独 pip install protobuf 安装了。


2、grpc编程步骤

python实现grpc需要以下步骤:

1、编写.proto文件,即定义接口和数据类型规范
2、通过编译.proto文件 生成2份存根文件
3、编写服务端代码
4、编写客户端代码


3、Demo1

目录结构如下:

在这里插入图片描述
具体可以采用如下命令查看:

apt-get install tree

tree ./

3.1、编写 .proto文件,定义接口和数据类型

关于具体的proto常见语法可参考:《gRPC之proto语法》

// helloworld.proto:定义接口和数据类型规范

// 限定该文件使用的是proto3的语法
syntax = "proto3";

// 可以为proto文件指定包名,防止消息命名冲突
package helloworld;

// 基础Demo
service Greeter {
    //一个服务中可以定义多个接口,也就是多个函数功能。
    //   方法名      方法参数                 返回值
    rpc SayHello (HelloRequest) returns (HelloResponse) {} 
}

// 简单请求
message HelloRequest {
    string name = 1; //数字1是参数的位置顺序,并不是对参数赋值
}

// 简单响应
message HelloResponse {
    string message = 1;
}

3.2、编译 .proto文件生成存根文件

利用编译工具把 .proto文件转化成 .py文件,直接在当前文件目录下运行下方代码即可。

cd test0_zct

python3 -m grpc_tools.protoc -I./proto --python_out=. --grpc_python_out=. proto/helloworld.proto

参数说明:

  1. -m 指定通过protoc工具自动生成 .py文件(即存根文件)
  2. -I 指定 .proto所在目录
  3. –python_out指定生成.py文件的输出路径
  4. hello.proto 输入的.proto文件

编译后会生成如下图所示,helloworld_pb2.py和helloworld_pb2_grpc.py两份存根文件(stub)。大致可以理解为:_pb2中定义了数据结构,_pb2_grpc中定义了相关的方法。

在这里插入图片描述

3.3、编写服务器端代码:

vim hello_server.py

代码内容如下:

# -*- coding: utf-8 -*-
# hello_server.py
'''
服务器端代码
'''

import grpc
from concurrent import futures
import helloworld_pb2
import helloworld_pb2_grpc

class Hello(helloworld_pb2_grpc.GreeterServicer):
    '''
    实现在helloworld.proto中'service'定义的SayHello方法。说明:

    1、定义一个类,要继承父类GreeterServicer。
    这里为何是GreeterServicer?因为helloworld_pb2_grpc.py是通过helloworld.proto编译后自动生成的,
    而在helloworld.proto文件中定义的'service'名为'Greeter',编译后会自动生成'名+Servcier',
    继承'GreeterServicer'就相当于是helloworld.proto的service Greeter。

    2、初始化

    3、具体实现SayHello方法。注意该方法的参数和返回值,要和helloworld.proto中'service'定义的SayHello方法相对应。
    此方法虽存在服务器端,但是通过rpc,客户端可以实现远程调用。
    具体实现细节是客户端可以调用本地的存根文件里的方法。存根文件来源于编译.proto文件后,grpc自动生成的。
    '''
    def __init__(self):
        pass

    def SayHello(self, request, context):
        '''
        这里具体实现之前定义的SayHello()
        :param request: request是在.proto文件中定义的HelloRequest消息类型
        :param context: context是保留字段,这里不用管
        :return: .proto文件中定义的HelloResponse类型
        '''
        # message = 'Hello {msg}'.format(msg=request.name)
        # return helloworld_pb2.HelloResponse(message)
        return helloworld_pb2.HelloResponse(message='Hello {msg}'.format(msg=request.name))

def serve():
    '''
    模拟服务启动
    :return:
    '''
    # 这里通过thread pool来并发处理server的任务
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    # 将对应的任务处理函数添加到rpc server中
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Hello(), server)
    # 添加端口
    server.add_insecure_port('[::]:50054')
    # 开始监听
    server.start()
    print('gRPC 服务端已开启,端口为50054...')
    # 堵塞监测本地50054端口,等待接收数据
    server.wait_for_termination()
    # try:
    #     while True:
    #         time.sleep(_ONE_DAY_IN_SECONDS)
    # except KeyboardInterrupt:
    #     server.stop(0)

if __name__ == '__main__':
    serve()

3.4、编写客户端代码:

vim hello_client.py

代码内容如下:

# -*- coding: utf-8 -*-
# hello_client.py
'''
客户端代码
'''

import grpc
import helloworld_pb2, helloworld_pb2_grpc

def run():
    # 本次不使用SSL,所以channel是不安全的
    channel = grpc.insecure_channel('localhost:50054')
    # 客户端实例
    stub = helloworld_pb2_grpc.GreeterStub(channel)
    # 调用服务端方法,这里其实是通过调用client本地的存根文件中方法实现的
    response = stub.SayHello(helloworld_pb2.HelloRequest(name='World'))
    print("Greeter client received: " + response.message)

if __name__ == '__main__':
    run()

3.5、测试

一个终端运行hello_server.py

python3 hello_server.py

另一个终端运行hello_client.py

python3 hello_client.py

运行结果如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker操作2

docker操作2 文章目录 docker操作2启动新容器配置新的容器后要做的操作进入Docker容器可以显示图片的容器镜像pull 网络镜像 日志停止与删除停止删除删除image报错 在容器和宿主机之间拷贝数据创建命令别名查看docker运行容器的ipdocker image保存与导入保存image导入image 打标…

CMake的应用与实践

CMake 简介 CMake是什么? 全称 Cross Platform Make,起初为了跨平台需求,而后不断完善并广泛使用一款优秀的工程构建工具 特点和优势 开放源代码,具有BSD许可跨平台,支持Linux,Mac和Windows等不同操作系…

【C生万物】 字符串内存函数篇 (上)

欢迎来到 Claffic 的博客 💞💞💞 👉 专栏:《C生万物 | 先来学C》👈 前言: 过了指针这个坎后,下一步就是C语言中关于字符的处理,这一期来讲…

chatgpt赋能Python-python5个一行

Python: 5行代码改变世界 Python是一种高级编程语言,以其简单易学的特性而闻名。Python的发明者Guido van Rossum在1980年代末和1990年代初创造了Python,旨在创建一种语言,既易于理解又易于使用。如今,Python已经成为了最受欢迎的…

【离散数学】陪集和拉格朗日定理编程题

1:编写一个程序能够计算有限群G的子群H的左陪集 输入一个n阶有限群G的二元运算表及相关的子群,输出其左陪集。 (注意:按照表头元素顺序计算每个陪集,下图为G的二元运算表示例) 样例1: 输入&…

干货 | 利用SPSS进行高级统计分析第三期

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 在本期中,我们继续为大家介绍如何利用SPSS进行:单因素方差分析、多因素方差分析、重复测量方差分析等。 1. 单因素方差分析【组间实验单一因变量;进行差…

iptables防火墙中的SNAT和DNAT

SNAT的原理和应用 SNAT 应用环境∶局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) SNAT原理∶修改数据包的源地址。 SNAT转换前提条件∶ 局域网各主机已正确设置IP地址、子网掩码、默认网关地址Linux网关开启IP路由转发…

游资92科比到底牛在哪里?

昨天一天时间把92科比之前的一个帖子全部看完,从科比对情绪周期的把握来看那简直总结的已经是标准答案了,那么为何92科比公布了答案,还是有很多人“痛苦”的做不到? 这个问题我觉得跟退学炒股是一样的,退学先解决了小…

springcloud-alibaba (03)sentinel下载安装

Sentinel 一,下载安装💠二,编写脚本🧿三,启动sentinel💎四,Win-访问控制台✨ 在Linux中下载安装Spring Cloud Alibaba Sentinel,可以按照以下步骤进行操作: 一&#xff0…

Python常见面试题. Python中的解包操作及其应用场景

这是个简单的知识点,但有的同学并不理解 unpacking解包 解,对应的是*或者**,也有自动解包之说 包对应的可迭代对象 Python助学大礼包点击跳转获取 目录 一、自动解包二、数据过多的解包*三、星号在函数中的使用四、两个星号的解包五、场…

Lesson13---人工神经网络(2)

13 人工神经网络(2) 多层神经网络-非线性分类问题多层神经网络的损失函数不是凸函数,很难计算解析解通常采用梯度下降法,得到数据解,梯度下降法可以用来求解函数极值问题 批量梯度下降随机梯度下降小批量梯度下降 1…

[Nacos] Nacos Client获取所有服务和定时更新Client端的注册表 (三)

文章目录 1.Nacos Client获取所有服务1.1 Client如何获取所有服务1.2 Client获取服务方法getServices()详解 2.Nacos定时更新Client端的注册表2.1 Nacos和Eureka定时更新Client端的注册表的区别2.2 Client定时更新本地服务过程2.3 updateServiceNow方法解析2.4 定时更新本地注册…

DrissionPage学习(一)

一、下载适合mac环境的chromedriver.exe 1.查找chrome浏览的版本 方法二:查看chrome版本信息 2.确定版本后在下载chrome对应的chromedriver.exe 下载地址:http://chromedriver.storage.googleapis.com/index.html 3.在文件夹中找到下载的文件chro…

MyBatis-Plus or() equls() 连用的格式为 a AND (b OR c)

正确示范: userInterfaceQueryWrapper.and(qw -> qw .eq("status", UserInterfaceInfoStatusEnum.OFFLINE) .or() .eq("status", UserInterfaceInfoStatusEnum.TRYOUT));错误示范: userInterfaceQueryWrapper.eq("status&…

分布式项目10.jsonp 使用js中script的属性src进行服务器之间的访问

一般使用ajax来访问不同服务器的数据&#xff0c;可行吗&#xff1f; 做个实验&#xff1a; 第一步&#xff1a;在本服务器中使用ajax技术访问本服务器数据 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>测试JSON跨域…

NFT游戏Mythical Beings将参加NFT Polygon 在线展会

Mythical Beings神秘生物是由Tarasca Art & Games 开发的基于区块链的卡牌收集游戏。游戏中每张卡牌所拥有的属性和背后的故事都是独一无二的&#xff0c;Mythical Beings不仅具有游戏属性&#xff0c;还兼具故事的传承。 作为一款跨链Polygon的NFT游戏&#xff0c;Mythic…

Transformer架构解析

1.Transformer架构图 本文主要来自&#xff1a;http://nlp.seas.harvard.edu/annotated-transformer/#hardware-and-schedule 论文地址: https://arxiv.org/pdf/1810.04805.pdf 1.1 Transformer模型的作用 基于seq2seq架构的transformer模型可以完成NLP领域研究的典型任务,…

ThinkPHP6模型中的获取器,修改器及搜索器的简单使用

ThinkPHP6模型中的获取器&#xff0c;修改器及搜索器的简单使用 1. 获取器2. 修改器3. 搜索器 1. 获取器 获取器的作用是对模型实例的&#xff08;原始&#xff09;数据做出自动处理。一个获取器对应模型的一个特殊方法&#xff08;该方法必须为public类型&#xff09;&#x…

MySQL(用户管理)

文章目录 1 用户1.1 用户信息1.2 创建用户1.3 删除用户1.4 修改用户密码 2 数据库的权限2.1 给用户授权2.2 回收权限 1 用户 1.1 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 host&#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是l…

GPT专业应用:如何让GPT策划方案

身为一名职场打工人&#xff0c;或多或少会面临需要写策划案的难题。 不管是策划一场线下活动&#xff0c;还是策划业务发展的方向&#xff1b; 甚至到生活中还需要策划婚礼&#xff0c;策划房屋装修&#xff0c;策划和朋友的聚会等等。那么如何快速积累经验&#xff0c;找准…