在使用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 项目中需要引入如下依赖:
<dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.28.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.28.0</version> </dependency>+ <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.28.0</version> </dependency>
然后加入编译插件:
<plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.11.0:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.28.0:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin>
将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 服务