這篇文章主要用代碼示例詳解python中golang的grpc,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
python
1、使用前準備,安裝這三個庫
pip install grpcio pip install protobuf pip install grpcio_tools
2、建立一個proto文件hello.proto
// [python quickstart](https://grpc.io/docs/quickstart/python.html#run-a-grpc-application) // python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto // helloworld.proto syntax = "proto3"; package test; service Greeter { rpc SayHello(HelloRequest) returns (HelloReply) {} rpc SayHelloAgain(HelloRequest) returns (HelloReply) {} } service Greetera{ rpc SayStudent(Studentid) returns (Student){} } message Student { string msg=1;//json } message Studentid{ string id=1; } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
3、執行命令就會對應生成兩個py文件
hello_pb2.py
hello_pb2_grpc.py
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto
4、py服務端代碼hello.server.py:
from concurrent import futures import time import grpc import hello_pb2 import hello_pb2_grpc import json # 實現 proto 文件中定義的 GreeterServicer class Greeter(hello_pb2_grpc.GreeterServicer): # 實現 proto 文件中定義的 rpc 調用 def SayHello(self, request, context): return hello_pb2.HelloReply(message = 'hello {msg}'.format(msg = request.name)) def SayHelloAgain(self, request, context): return hello_pb2.HelloReply(message='hello {msg}'.format(msg = request.name)) class Gretera(hello_pb2_grpc.GreeteraServicer): def SayStudent(self,request,context): print(request.id) if request.id=="0": c=hello_pb2.Student(msg=json.dumps({"name":"owen","age":22,"sex":"男"})) else: c=hello_pb2.Student(msg=json.dumps({"name":"lihui","age":23,"sex":"女"})) return c def serve(): # 啟動 rpc 服務 server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) hello_pb2_grpc.add_GreeteraServicer_to_server(Gretera(),server) server.add_insecure_port('[::]:50052') server.start() try: while True: time.sleep(60*60*24) # one day in seconds except KeyboardInterrupt: server.stop(0) if __name__ == '__main__': serve()
py客戶端代碼hello.client.py:
import grpc import hello_pb2 import hello_pb2_grpc import json def run(): # 連接 rpc 服務器 channel = grpc.insecure_channel('localhost:50051') # 調用 rpc 服務 stub = hello_pb2_grpc.GreeterStub(channel) response = stub.SayHello(hello_pb2.HelloRequest(name='czl')) print("Greeter client received: " + response.message) response = stub.SayHelloAgain(hello_pb2.HelloRequest(name='nsdnfkjda')) print("Greeter client received: " + response.message) stub1 = hello_pb2_grpc.GreeteraStub(channel) response1 = stub1.SayStudent(hello_pb2.Studentid(id='1')) print(json.loads(response1.msg)) if __name__ == '__main__': run()
golang
由于grpc是跨語言的所以這里用golang做為示范,golang客戶端代碼,小編這里也踩了許多坑,最主要的是兩個proto文件一定要一致,golang 中使用必須安裝protoc,windows將環境變量指向安裝目錄的bin下面:
1、protocal buffer安裝
從 https://github.com/google/protobuf/releases 下載 對應自己的系統(環境變量記得改)
2、安裝 golang protobuf
go get -u github.com/golang/protobuf/proto // golang protobuf 庫 go get -u github.com/golang/protobuf/protoc-gen-go //protoc --go_out 工具
3、安裝 gRPC-go
go get google.golang.org/grpc
4、生成go文件
protoc --go_out=plugins=grpc:文件目錄 對應的.proto文件 protoc --go_out=plugins=grpc:. hello.proto
生成hello.pb.go,調用的實現hello_go_client.go:
package main import ( "context" "encoding/json" "google.golang.org/grpc" "log" "student/test" //對應的生成文件目錄 ) type Studenmsg struct { Name string Age int Sex string } func main() { // 建立連接到gRPC服務 conn, err := grpc.Dial("127.0.0.1:50052", grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %v", err) } // 函數結束時關閉連接 defer conn.Close() // 創建Waiter服務的客戶端 t := test.NewGreeteraClient(conn) tr,err:=t.SayStudent(context.Background(),&test.Studentid{Id:"1"}) if err != nil { log.Fatalf("could not greet: %v", err) } var st Studenmsg err=json.Unmarshal([]byte(tr.Msg),&st)//這里說明一下發過來的數據是json格式轉化成struct if err!=nil{ log.Println(err.Error()) } log.Println(st.Name,st.Age,st.Sex) }
以上就是關于用代碼示例詳解python中golang的grpc的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。