在使用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 服务