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.pswp.cn/news/391748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391748.shtml
英文地址,請注明出處:http://en.pswp.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…