記錄go-python微服務實踐,希望能幫助需要的人
阿新 • • 發佈:2020-06-24
介紹
本文講述如何使用 grpc,由 go 作為客戶端,python 作為服務端進行通訊。 (題外:一直迷惑於怎樣讓他們兩個連起來,後來才發現只要對同一個proto檔案進行編譯就好了。。。?)
實現功能
python 實現方法 f(name) ,返回 "hello "+name,由 go 呼叫得到返回值
安裝配置
Go
- 個人配置是 go 1.12 ,使用 go mod 專案管理
- 因為有些包會被牆,所有要配置
GOPROXY
,我配置的是阿里的GOPROXY="https://mirrors.aliyun.com/goproxy/"
安裝 grpc,protobuf編譯器和對應的 go 外掛
go get google.golang.org/grpc
go get github.com/golang/protobuf/proto
go get github.com/golang/protobuf/proto-gen-go
複製程式碼
注:如果在 goland 編譯器裡使用命令列也需要配置代理
python3
同樣也是安裝 grpc,protobuf等
pip3 install grpcio
pip3 install protobuf
pip3 install grpcio-tools
複製程式碼
開始
我使用的是 goland 編譯器,然後引入了 python 直譯器
在紅框內選擇自己直譯器就好專案結構
本人初嘗,可能不規範,敬請指正
-project
-go
-main.go
-micro
-hello.proto
-python
-server.py
複製程式碼
這是所需要自己建立的目錄和檔案,go 包內即 go程式碼,micro是微服務配置檔案,python包是python程式碼
micro包
首先建立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服務端
在 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 客戶端
在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
複製程式碼