Proto
syntax = "proto3";
import "google/protobuf/empty.proto";
option go_package = ".;proto";
service Greeter {
// 加法PySever
rpc PyAddSever (AddRequest) returns (AddReply);
// 获取当前时间PySever
rpc PyGetNowTimeSever(google.protobuf.Empty) returns (GetNowTimeReply);
}
// AddSever
message AddRequest {
int64 Num1 = 1;
int64 Num2 = 2;
}
message AddReply {
int64 Result = 1;
}
// GetNowTimeSever
message GetNowTimeReply {
string NowTime = 1;
}
首先实现Py服务
# Created time : 2021/11/7
# Author : Jiudan
# Description information:
import time
from concurrent import futures
import grpc
from proto import Proto_pb2
from proto import Proto_pb2_grpc
def nowTime(mode='%Y-%m-%d %H:%M:%S'):
ti = time.strftime(mode, time.localtime())
return ti
# 拦截器
class Interceptor(grpc.ServerInterceptor):
def intercept_service(self, continuation, handler_call_details):
print("请求开始")
rsp = continuation(handler_call_details)
print("请求结束")
return rsp
class Greeter(Proto_pb2_grpc.GreeterServicer):
def PyGetNowTimeSever(self, request, context):
for key, value in context.invocation_metadata():
print(key, value)
ParaDict = dict(context.invocation_metadata())
print(ParaDict['username'])
return Proto_pb2.GetNowTimeReply(NowTime=nowTime())
def PyAddSever(self, request, context):
for key, value in context.invocation_metadata():
print(key, value)
ParaDict = dict(context.invocation_metadata())
print(ParaDict['username'])
# 一定要指明参数 Result, Num1 Num2
return Proto_pb2.AddReply(Result=request.Num1 + request.Num2)
# 开启grpc服务
def StartSever():
interceptor = Interceptor()
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), interceptors=(interceptor,))
Proto_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
if __name__ == '__main__':
print("Python Sever Start")
StartSever()
然后实现 Go 的PyClient
// Author : Jiudan
// Created time : 2021/11/7
package PySever_Client
import (
"GoProject/src/grpc/Go_Py_WebSever/proto"
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
"google.golang.org/protobuf/types/known/emptypb"
)
var Port = "0.0.0.0:50051"
//var c, conn = linkConnect(Port)
// 创建链接
func linkConnect(Port string) (proto.GreeterClient, *grpc.ClientConn) {
// 创建链接
conn, err := grpc.Dial(Port, grpc.WithInsecure())
if err != nil {
fmt.Println("ERROR : ", err)
}
// 发起请求
return proto.NewGreeterClient(conn), conn
}
// 关闭链接
func linkClose(conn *grpc.ClientConn) {
err := conn.Close()
if err != nil {
fmt.Println("ERROR : ", err)
}
}
// PyAddSever 服务
func PyAddSever(Num1, Num2 int64) (*proto.AddReply, error) {
// 链接Py服务器
c, conn := linkConnect(Port)
defer linkClose(conn)
// 使用metadata发送数据 - 简单验证
md := metadata.New(map[string]string{
"UserName": "AddSever",
"password": "123456",
})
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 调用服务端函数 并发送数据
//r, err := c.PyAddSever(context.Background(), &proto.AddRequest{Num1: Num1, Num2: Num2})
r, err := c.PyAddSever(ctx, &proto.AddRequest{Num1: Num1, Num2: Num2})
if err != nil {
fmt.Println("ERROR : ", err)
}
return r, nil
}
// PyGetNowTimeSever 服务
func PyGetNowTimeSever() (*proto.GetNowTimeReply, error) {
// 链接Py服务器
c, conn := linkConnect(Port)
defer linkClose(conn)
// 使用metadata发送数据 - 简单验证
md := metadata.New(map[string]string{
"UserName": "GetNowTimeSever",
"password": "123456",
})
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 调用服务端函数 并发送数据
//r, err := c.PyGetNowTimeSever(context.Background(), new(emptypb.Empty))
r, err := c.PyGetNowTimeSever(ctx, new(emptypb.Empty))
if err != nil {
fmt.Println("ERROR : ", err)
}
return r, nil
}
最后实现Go服务
// Author : Jiudan
// Created time : 2021/11/7
package main
import (
"GoProject/src/grpc/Go_Py_WebSever/PySever_Client"
"fmt"
"io"
"net/http"
"sync"
)
var wg sync.WaitGroup
// Go服务 通过Py服务获取时间
func GoGetNowTimeSever(w http.ResponseWriter, req *http.Request) {
result, err := PySever_Client.PyGetNowTimeSever()
_, err = io.WriteString(w, result.NowTime)
if err != nil {
fmt.Println("ERROR : ", err)
}
}
// 通过Go调用Py服务
func PyAddSever(Num1, Num2 int64) {
result, err := PySever_Client.PyAddSever(Num1, Num2)
if err != nil {
fmt.Println("ERROR : ", err)
}
fmt.Println("PyAddSever : ", result.Result)
}
// StartSever 启动网络连接
func StartSever() {
defer wg.Done()
// 测试 PyAddSever
PyAddSever(100, 200)
// 启动Go服务-获取当前时间
http.HandleFunc("/GetNowTime", GoGetNowTimeSever)
// 监听 80 端口
err := http.ListenAndServe(":80", nil)
if err != nil {
fmt.Println("ERROR : ", err)
}
}
func main() {
StartSever()
}