本文講述如何使用 grpc,由 go 做爲客戶端,python 做爲服務端進行通訊。 (題外:一直迷惑於怎樣讓他們兩個連起來,後來才發現只要對同一個proto文件進行編譯就行了。。。😓)python
python 實現方法 f(name) ,返回 "hello "+name,由 go 調用獲得返回值git
GOPROXY
,我配置的是阿里的GOPROXY="https://mirrors.aliyun.com/goproxy/"
安裝 grpc,protobuf編譯器和對應的 go 插件github
go get google.golang.org/grpc
go get github.com/golang/protobuf/proto
go get github.com/golang/protobuf/proto-gen-go
複製代碼
注:若是在 goland 編譯器裏使用命令行也須要配置代理 golang
一樣也是安裝 grpc,protobuf等bash
pip3 install grpcio
pip3 install protobuf
pip3 install grpcio-tools
複製代碼
我使用的是 goland 編譯器,而後引入了 python 解釋器 微服務
在紅框內選擇本身解釋器就好本人初嘗,可能不規範,敬請指正google
-project
-go
-main.go
-micro
-hello.proto
-python
-server.py
複製代碼
這是所須要本身建立的目錄和文件,go 包內即 go代碼,micro是微服務配置文件,python包是python代碼spa
首先建立proto文件--hello.proto插件
syntax = "proto3"; //選擇版本
package micro; // 包
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {
}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string msg = 1;
}
複製代碼
注:這裏package 要與當前路徑一致 命令行
並無很詳細解釋 proto 語法,你們又須要能夠自行查看
編譯 proto文件 首先命令行移動到 micro 包下,而後分別執行 go 和 python 的編譯語句
go:hello.proto
即爲須要編譯的文件,編譯後會在當前包下生成 hello.pb.go
文件
protoc --go_out=plugins=grpc:. hello.proto
複製代碼
python:編譯後會生成hello_pb2.py
和hello_pb2_grpc.py
兩個文件
python3 -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto
複製代碼
文件都生成成功的話就能夠編寫客戶端和服務端代碼了
在 python 包下 server.py 文件內編寫以下代碼
from concurrent import futures
import time
import grpc
from micro import hello_pb2
from micro import hello_pb2_grpc
class Greeter(hello_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return hello_pb2.HelloReply(msg = "hello "+request.name)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers = 10))
hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(),server)
server.add_insecure_port('[::]:50051')
print("服務啓動")
server.start()
try:
while True:
time.sleep(60*60*24)
except KeyboardInterrupt:
server.stop(0)
if __name__=='__main__':
serve()
複製代碼
建立了端口號爲50051
的服務 能夠嘗試啓動一下服務
在go 包下 main.go 中編寫下面代碼
package main
import (
"context"
pb "cymdemo/micro"
"fmt"
"google.golang.org/grpc"
)
const address = "localhost:50051"
func main() {
conn,err := grpc.Dial(address,grpc.WithInsecure())
if err != nil {
fmt.Println(err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
name := "world"
res,err := c.SayHello(context.Background(),&pb.HelloRequest{Name:name})
if err != nil{
fmt.Println(err)
}
fmt.Println(res.Msg)
}
複製代碼
先啓動 python 服務端,而後啓動 go 客戶端就會拿到調用結果
hello world
複製代碼