gRPC快速入门记录

为什么使用grpc

1.protocl buffer一种高效的序列化结构。
2.支持http 2.0标准化协议。

http/2

1.http/2对每个源只需创建一个持久连接,在这一个连接内,可以并行的处理多个请求和响应,而且做到不相互影响。
2.允许客户端和服务端实现自己的数据流和连接流控制,这对我们传输大数据非常有帮助。

安装 grpc 与 protobuf 解释器

这里我们需要使用 protobuf 解释器 将 protobuf 语法的代码转化成对应语言的代码,以及使用 grpc 实现跨越性,所以我们需要先安装它们。
本教程中只会用到 python3 以及 golang ,所以我们只安装这两个语言的解释器就足够了

python3 安装 grpc 与 protobuf

安装 grpc 库

pip3 install grpcio

安装 grpc 工具 以及 protobuf 解释器

pip3 install grpcio-tools googleapis-common-protos

go 安装 grcp 与 protobuf

安装 grpc 库:

go get -u -v google.golang.org/grpc

然后从 https://github.com/protocolbuffers/protobuf/releases 下载 与你操作系统对应的 protobuf 解释器,这里选择的 linux64 进行下载
首先新建一个目录用来容纳下载安装包解压后的文件,并进入目录

mkdir protobuf && cd protobuf

下载 protobuf 解释器

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip

解压缩下载的文件

unzip protoc*.zip

删除刚才下载好的压缩包

rm protoc*.zip

移动 protobuf 目录到 ~/.local

mv ~/protobuf/ ~/.local/

将 protobuf 的可执行文件添加进系统变量

echo "PATH=\"\$HOME/.local/protobuf/bin:\$PATH\"" >> ~/.profile

安装 protobuf go 语言的插件

go get -u github.com/golang/protobuf/protoc-gen-go

将插件添加进系统变量

echo "PATH=\$PATH:\$GOPATH/bin" >> ~/.profile

然后使用 cd 命令回到用户根目录

cd

使用 grpc

创建本次使用的工程目录

创建工程目录并进入目录

mkdir $GOPATH/src/demo && cd $GOPATH/src/demo

编写 proto 文件

proto 文件为 protobuf 的扩展名,我们编写这个文件用于生成 python 与 go 都支持的代码。
这里我们再新建一个目录用来容纳 proto 文件以及 使用 protobuf 编译器转化过的代码
创建目录并进入目录

mkdir hello && cd hello

接下来开始编写 proto 文件,这里我们新建一个 名为 hello.proto 的文件并在里面写入以下内容

syntax = "proto3"; //指定语法为 protobuf3 语法,如果不写这句的话默认语法为 protobuf2
package hello; //指定包名,这句在本次演示中只对 go 生效,python 的 protobuf 解释器会忽略它service Greeter { // 定义grpc 远程调用的方法rpc SayHello (HelloRequest) returns (HelloReply) {} // 接受 HelloRequest 返回 HelloReply,SayHello 需要自己在服务端实现
}message HelloRequest { //定义一个消息类型string name = 1; //定义 name 字段为 string 类型 tag 为 1
}message HelloReply {string message = 1;
}

完成后保存并退出编辑

生成对应语言的代码

编辑好 proto 文件后我们并不能直接使用它,还需要将它转化成对应语言的代码才能使用
生成 go 语言的代码

protoc hello.proto --go_out=plugins=grpc:.

生成 python 的代码

python3 -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. hello.proto

然后我们回到 demo 工程目录,开始真正的 代码编写

cd ..

编写服务端

服务端端这里我采用的 go 语言进行编写
创建一个名为 server.go 的文件并写入以下内容

package mainimport ("context""google.golang.org/grpc""google.golang.org/grpc/reflection""log""demo/hello""net"
)const (port = ":50051" // 监听端口
)type server struct{}func (s *server) SayHello(ctx context.Context, in *hello.HelloRequest) (*hello.HelloReply, error) { // 服务端实现 proto 中定义的方法return &hello.HelloReply{Message: "Hello " + in.Name}, nil //拼接客户端发送过来的消息,并返回给客户端
}func main() {lis, err := net.Listen("tcp", port) // 启动监听if err != nil {log.Fatalf("failed to listen: %v", err)        }s := grpc.NewServer()hello.RegisterGreeterServer(s, &server{})reflection.Register(s) // 在 grpc 上注册服务if err := s.Serve(lis); err != nil { //启动服务并处理错误log.Fatalf("failed to server: %v", err)        }
}

编写 客户端

客户端我采用的 python3 进行编写
创建一个名为 client.py 的文件写入以下内容

#! /usr/bin/env python3
# -*- coding: utf-8 -*-import grpc # 导入 grpc 模块import sys
sys.path.append('hello') # 将 hello 目录临时添加进环境变量,不然接下来的导入会失败import hello_pb2 #导入我们刚才从 helloWorld.proto 生成的 python 代码
import hello_pb2_grpcdef run():with grpc.insecure_channel('localhost:50051') as channel: # 创建连接到服务端的通道stub = hello_pb2_grpc.GreeterStub(channel) #创建提供调用的存根response = stub.SayHello(hello_pb2.HelloRequest(name = 'niconiconi')) #调用 SayHello 方法 发送我们刚才在 proto 文件中定义的字段,返回我们在 proto 中定义的返回值print("Greeter client received: " + response.message) #打印返回值if __name__ == '__main__':run()

运行 grpc 服务端与客户端

首先我们启动服务端

go run server.go

使用 CTRL + z 将 正在运行的服务端挂起在后台,然后使用 bg命令使挂起的 程序继续运行。
接下来运行我们编写的客户端

python3 client.py

不出意外的话你的屏幕上应该会打印

Greeter client received: Hello niconiconi

到这里 演示就全部结束了。

转载于:https://www.cnblogs.com/Paul-watermelon/p/11338019.html

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

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

相关文章

微服务、分布式、云架构构建电子商务平台

大型企业分布式微服务云架构服务组件 实现模块化、微服务化、原子化、灰度发布、持续集成 分布式、微服务、云架构构建电子商务平台 commonservice eureka Netflix事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化&am…

使用Matplotlib Numpy Pandas构想泰坦尼克号高潮

Did you know, a novel predicted the Titanic sinking 14 years previously to the actual disaster???您知道吗,一本小说预言泰坦尼克号在14年前沉没到了真正的灾难中??? In 1898 (14 years before the Titanic sank), Amer…

spark 架构_深入研究Spark内部和架构

spark 架构by Jayvardhan Reddy通过杰伊瓦尔丹雷迪(Jayvardhan Reddy) 深入研究Spark内部和架构 (Deep-dive into Spark internals and architecture) Apache Spark is an open-source distributed general-purpose cluster-computing framework. A spark application is a JV…

使用faker生成测试数据

需要先安装faker模块,pip install faker 导入模块中的Faker类:from faker import Faker 实例化faker Faker() print(姓名相关) print(姓名:,faker.name()) print(名:,faker.first_name()) print(姓:,faker.last_name()) print(男姓名:,faker.name_male(…

JavaScript中的数组创建

JavaScript中的数组创建 本文转载自:众成翻译 译者:loveky 链接:http://www.zcfy.cc/article/713 原文:http://rainsoft.io/power-up-the-array-creation-in-javascript/ 数组是一个包含了对象或原始类型的有序集合。很难想象一个…

CODEVS——T1519 过路费

http://codevs.cn/problem/1519/ 时间限制: 1 s空间限制: 256000 KB题目等级 : 大师 Master题解查看运行结果题目描述 Description在某个遥远的国家里,有 n个城市。编号为 1,2,3,…,n。这个国家的政府修建了m 条双向道路,每条道路连接着两个城市。政府规…

pca数学推导_PCA背后的统计和数学概念

pca数学推导As I promised in the previous article, Principal Component Analysis (PCA) with Scikit-learn, today, I’ll discuss the mathematics behind the principal component analysis by manually executing the algorithm using the powerful numpy and pandas lib…

pandas之cut

cut( )用来把一组数据分割成离散的区间。 cut(x, bins, rightTrue, labelsNone, retbinsFalse, precision3, include_lowestFalse, duplicatesraise) # x:被切分的数据,必须是一维的 # bins:①int型整数:将x按照数值大小平均分成分…

为Tueri.io构建React图像优化组件

Let’s face it, image optimization is hard. We want to make it effortless.面对现实吧,图像优化非常困难。 我们希望毫不费力。 When we set out to build our React Component there were a few problems we wanted to solve:当我们开始构建React组件时&#…

红黑树分析

红黑树的性质: 性质1:每个节点要么是黑色,要么是红色。 性质2:根节点是黑色。性质3:每个叶子节点(NIL)是黑色。性质4:每个红色节点的两个子节点一定都是黑色。不能有两个红色节点相…

overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理。 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ping bbox1: 可见 overlay 网络中的容器可以直接通信,同时 docke…

第 132 章 Example

这里介绍一个负载均衡放置问题,我们可以把它摆放在任何位置,每种方案都各有优缺点,需要根据你的实际情况选择使用 适用于HAProxy / Nginx / LVS 等等 这里用web,db为例子,讲述负载均衡之间的关系 132.1. 双负载均衡的用法 User --…

Python:实现图片裁剪的两种方式——Pillow和OpenCV

原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV。两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原…

第一个应在JavaScript数组的最后

by Thomas Barrasso由Thomas Barrasso 第一个应在JavaScript数组的最后 (The first shall be last with JavaScript arrays) So the last shall be [0], and the first [length — 1].所以最后一个应该是[0] ,第一个[length_1]。 – Adapted from Matthew 20:16–根…

鼠标移动到ul图片会摆动_我们可以从摆动时序分析中学到的三件事

鼠标移动到ul图片会摆动An opportunity for a new kind of analysis of Major League Baseball data may be upon us soon. Here’s how we can prepare.不久之后,我们将有机会对美国职棒大联盟数据进行新的分析。 这是我们准备的方法。 It is tempting to think t…

leetcode 1052. 爱生气的书店老板(滑动窗口)

今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。 在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气&#xf…

回到网易后开源APM技术选型与实战

篇幅一:APM基础篇\\1、什么是APM?\\APM,全称:Application Performance Management ,目前市面的系统基本都是参考Google的Dapper(大规模分布式系统的跟踪系统)来做的,翻译传送门《google的Dappe…

持续集成持续部署持续交付_如何开始进行持续集成

持续集成持续部署持续交付Everything you need to know to get started with continuous integration: branching strategies, tests automation, tools and best practices.开始进行持续集成所需的一切:分支策略,测试自动化,工具和最佳实践。…

51nod 1073约瑟夫环

思路传送门 &#xff1a;http://blog.csdn.net/kk303/article/details/9629329 n里面挑选m个 可以递推从n-1里面挑m个 然后n-1里面的x 可以转换成 n里面的x 的公式 x &#xff08;xm&#xff09;%n; #include <bits/stdc.h> using namespace std;int main () {int n,m;s…

如何选择优化算法遗传算法_用遗传算法优化垃圾收集策略

如何选择优化算法遗传算法Genetic Algorithms are a family of optimisation techniques that loosely resemble evolutionary processes in nature. It may be a crude analogy, but if you squint your eyes, Darwin’s Natural Selection does roughly resemble an optimisa…