本文讲述如何使用 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
复制代码