通过Grpc调用Python函数 2021-11-7

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()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiudan1114

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值