欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python golang中grpc 使用示例代碼詳解

 更新時間:2020年06月03日 09:01:40   作者:hw_owen ·  
這篇文章主要介紹了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、執(zhí)行命令就會對應生成兩個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
# 實現(xiàn) proto 文件中定義的 GreeterServicer
class Greeter(hello_pb2_grpc.GreeterServicer):
 # 實現(xiàn) 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將環(huán)境變量指向安裝目錄的bin下面:

1、protocal buffer安裝

https://github.com/google/protobuf/releases  下載 對應自己的系統(tǒng)(環(huán)境變量記得改)

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,調用的實現(xiàn)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)
 }
 // 函數(shù)結束時關閉連接
 defer conn.Close()
 // 創(chuàng)建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)//這里說明一下發(fā)過來的數(shù)據(jù)是json格式轉化成struct
 if err!=nil{
 log.Println(err.Error())
 }
 log.Println(st.Name,st.Age,st.Sex)
}

總結

到此這篇關于python golang中grpc 使用示例代碼詳解的文章就介紹到這了,更多相關python golang grpc 使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論