grpc python java_利用grpc 实现java 服务与Python服务的互相调用

在使用grpc 之前,需要了解proto3 的语法,谷歌的官方教程如下(https://developers.google.cn/protocol-buffers/docs/javatutorial),我们就不再赘述。使用grpc我们需要定义.proto 文件,示例如下:

syntax = "proto3";

package com.magicdu.grpc.service;

// The greeting service definition.

service Greeter {

// Sends a greeting

rpc SayHello (HelloRequest) returns (HelloReply) {}

}

// The request message containing the user's name.

message HelloRequest {

string name = 1;

}

// The response message containing the greetings

message HelloReply {

string message = 1;

}

上述文件主要定义的是接收消息的实体和返回消息的实体,利用代码生成器,我们便可以生成grpc 的代码

java 项目中需要引入如下依赖:

io.grpc

grpc-netty-shaded

1.28.0

io.grpc

grpc-protobuf

1.28.0

+

io.grpc

grpc-stub

1.28.0

然后加入编译插件:

org.xolstice.maven.plugins

protobuf-maven-plugin

0.6.1

com.google.protobuf:protoc:3.11.0:exe:${os.detected.classifier}

grpc-java

io.grpc:protoc-gen-grpc-java:1.28.0:exe:${os.detected.classifier}

compile

compile-custom

将proto文件放到src/main 下面

然后打开maven工具,找到如下图所示的插件:

先执行protobuf:compile一遍,再执行protobuf:copile-custom,会自动生成文件,将生成的文件拷贝到对应的包中。

编写 java 客户端代码:

public class HelloClient {

public static void main(String[] args) {

String text="ip";

final Channel messageChannel=NettyChannelBuilder.forAddress(SysConstants.IP,50051).negotiationType(NegotiationType.PLAINTEXT)

.build();

GreeterGrpc.GreeterBlockingStub stub= GreeterGrpc.newBlockingStub(messageChannel);

Helloworld.HelloReply reply=stub.sayHello(Helloworld.HelloRequest.newBuilder().setName(text).build());

System.out.println("client recevie"+reply.getMessage());

}

}

再利用相同的proto 生成python 代码:

python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. helloworld.proto

编写python 服务端代码:

from concurrent import futures

import grpc

import time

import helloworld_pb2

import helloworld_pb2_grpc

import requests

import json

def getIP():

ip= requests.get("https://api.ipify.org/?format=json")

ip=json.loads(ip.text)

return ip['ip']

class Greeter(helloworld_pb2_grpc.GreeterServicer):

def SayHello(self, request, context):

responseMsg="127.0.0.1"

name=request.name

if(name=='ip'):

responseMsg=getIP()

return helloworld_pb2.HelloReply(message='IP, %s!' % responseMsg)

def serve():

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)

server.add_insecure_port('[::]:50051')

server.start()

try:

while True:

time.sleep(60*60*24) # one day in seconds

except KeyboardInterrupt:

server.stop(0)

if __name__ == '__main__':

serve()

启动服务端,再启动java客户端,就实现 java 调用 python rpc 服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值