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 main
import (
"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_grpc
def 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
到这里 演示就全部结束了。
gRPC快速入门记录的更多相关文章
- GRPC快速入门
转载请注明来自ChenJiehua的<GRPC快速入门> GRPC是一个高性能.通用的开源RPC框架,基于HTTP/2协议标准和Protobuf序列化协议开发,支持众多的开发语言. 概述 ...
- Cordova 快速入门记录
本篇文章由:http://xinpure.com/cordova-quick-start-recording/ 记一笔 Cordova 官网入门文档 Get Started Fast,言简意该.通俗易 ...
- SpringMVC快速入门记录(一)
1.SpringMVC入门:表现层框架,spring的一部分 2.Spring处理流程: 3.要在web.xml里写好相关配置 <!--配置DispatcherServlet--> < ...
- SpringMVC快速入门记录(二)
一.数组参数绑定和List参数绑定 1.数组参数绑定 提交多个相同name的参数,保持name的名字和Controller方法参数的数组名称相同即可. 2.List参数绑定 List中存放对象,并将定 ...
- Golang Module快速入门
前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具.开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后 ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- Mybatis框架 的快速入门
MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...
- 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
随机推荐
- 【webpack系列】webpack4.x入门配置基础(一)
一.前言 webpack在不断的迭代优化,目前已经到了4.29.6.在webpack4这个版本中,做了很多优化,引入了很多特性,将获得更多模块类型,.mjs支持,更好的默认值,更为简洁的模式设置,更加 ...
- 【二分讲解及例题】火车站台连锁店-C++
首先我们先来从一个小游戏理解一下二分.(摘自程序员小灰的博客) 为什么说这样效率最高呢?因为每一次选择数字,无论偏大还是偏小,都可以让剩下的选择范围缩小一半. 给定范围0到1000的整数: 第一次我们 ...
- Feign挡板和Mock
背景: 在项目开发中,会有调用第三方接口的场景.当开发时,对方不愿意提供测试服务器给我们调用,或者有的接口会按调用次数进行计费.当联调时,第三方的测试服务器也可能会出现不稳定,如果他们的服务挂了,我们 ...
- C#2.0新增功能02 泛型
连载目录 [已更新最新开发文章,点击查看详细] C# 语言和公共语言运行时 (CLR) 的 2.0 版本中添加了泛型. 泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有 ...
- JavaSE总结(一)
一.Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年 ...
- linux初学者-磁盘加密篇
linux初学者-磁盘加密篇 因为保密需要,一般系统中会在文件和磁盘中进行加密,但是文件的加密比较容易破解,不安全.所以在特殊需要下,会对磁盘进行加密,磁盘加密后在磁盘损坏的同时,其中的数据也会损坏, ...
- Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题
在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...
- 说说Java线程间通信
序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...
- Mysql优化(出自官方文档) - 第五篇
目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...
- Cell Phone Networ (树形dp-最小支配集)
目录 Cell Phone Networ (树形dp-最小支配集) 题意 思路 题解 Cell Phone Networ (树形dp-最小支配集) Farmer John has decided to ...