記錄go-python微服務實踐,但願能幫助須要的人

介紹

本文講述如何使用 grpc,由 go 做爲客戶端,python 做爲服務端進行通訊。 (題外:一直迷惑於怎樣讓他們兩個連起來,後來才發現只要對同一個proto文件進行編譯就行了。。。😓)python

實現功能

python 實現方法 f(name) ,返回 "hello "+name,由 go 調用獲得返回值git

安裝配置

Go

  • 我的配置是 go 1.12 ,使用 go mod 項目管理
  • 由於有些包會被牆,全部要配置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

python3

一樣也是安裝 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

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.pyhello_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
複製代碼
相關文章
相關標籤/搜索