项目使用maven构建,执行mvn compile 命令后,proto文件自动生成java文件,这个功能需要依赖相关编译插件。
一、pom.xml配置
为陆良等地区用户提供了全套网页设计制作服务,及陆良网站建设行业解决方案。主营业务为成都网站建设、成都网站设计、陆良网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
4.0.0
com.test.grpcTest
grpc-api
0.0.1-SNAPSHOT
jar ``
grpc-api
UTF-8
io.grpc
grpc-netty
1.0.0
io.grpc
grpc-protobuf
1.0.0
io.grpc
grpc-stub
1.0.0
io.grpc
grpc-all
0.13.2
kr.motd.maven
os-maven-plugin
1.4.1.Final
org.xolstice.maven.plugins
protobuf-maven-plugin
0.5.0
com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}
grpc-java
io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier}
compile
compile-custom
二、proto文档(IDL文档)编辑和编译成java文件
//指定proto3格式
syntax = "proto3";
//一些生成代码的设置
option java_multiple_files = false;//以非外部类模式生成
option java_package = "com.test.grpcTest.grpc_api";//所在包名
option java_outer_classname = "Grpc";//最外层类名称
message UnaryRequest{
string serviceName = 1;
string methodName = 2;
bytes data = 3;
string request_id = 4;//参数默认都为可选,如果没有赋值,那么接口中不会出现该参数,不会默认为null之类的
}
message UnaryResponse{
string serviceName = 1;
string methodName = 2;
bytes data = 3;
string request_id = 4;
}
service GrpcService{
// 一对一服务请求
rpc SendUnaryRequest(UnaryRequest) returns(UnaryResponse);
}
proto文件编辑好后,在项目根目录下执行 **mvn compile** 进行编译 。
如果使用maven编译proto文件,那么需要默认将proto文件放在 /src/main/proto/ 路径下。
编译后生成的java文件在 target/generated-sources/ 路径下。
将 java 文件拷贝到 /src/main/java/ 路径下。
项目文件结构如下:
三、服务端代码
在 /src/main/java/ 路径下新建目录 /server,存放服务端代码。
package com.test.grpcTest.grpc_api.server;
import com.test.grpcTest.grpc_api.GrpcServiceGrpc;
import com.test.grpcTest.grpc_api.UnaryRequest;
import com.test.grpcTest.grpc_api.UnaryResponse;
import com.google.protobuf.ByteString;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import java.io.IOException;
//Grpc服务器对象
public class GrpcServer {
private int port = 50051;//grpc服务端口
private Server server;//grpc server
public static void main(String[] args) throws IOException,InterruptedException {
final GrpcServer server = new GrpcServer();
server.start();
server.blockUntilShutdown();
}
private void start() throws IOException {
//指定grpc服务器端口、接口服务对象,启动grpc服务器
server = ServerBuilder.forPort(port).addService(new GreeterImpl())
.build().start();
System.out.println("service start...");
//添加停机逻辑
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.err.println("*** shutting down gRPC server since JVM is shutting down");
GrpcServer.this.stop();
System.err.println("*** server shut down");
}
});
}
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
//内部类,继承抽象类 GrpcServiceGrpc.GrpcServiceImplBase,
//并重写服务方法 sendUnaryRequest
private class GreeterImpl extends GrpcServiceGrpc.GrpcServiceImplBase {
//UnaryRequest 客户端请求参数,
//StreamObserver 返回给客户端的封装参数
public void sendUnaryRequest(UnaryRequest request,StreamObserver responseObserver) {
ByteString message = request.getData();
System.out.println("server, serviceName:" + request.getServiceName()
+ "; methodName:" + request.getMethodName()+"; datas:"+new String(message.toByteArray()));
UnaryResponse.Builder builder = UnaryResponse.newBuilder(); builder.setServiceName("GrpcServiceResponse").setMethodName("sendUnaryResponse");
responseObserver.onNext(builder.build());
responseObserver.onCompleted();
}
}
}
四、客户端代码
package com.test.grpcTest.grpc_api.client;
import java.util.concurrent.TimeUnit;
import com.test.grpcTest.grpc_api.GrpcServiceGrpc;
import com.test.grpcTest.grpc_api.UnaryRequest;
import com.test.grpcTest.grpc_api.UnaryResponse;
import com.google.protobuf.ByteString;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
//grpc客户端类
public class GrpcClient {
private final ManagedChannel channel;//客户端与服务器的通信channel
private final GrpcServiceGrpc.GrpcServiceBlockingStub blockStub;//阻塞式客户端存根节点
public GrpcClient(String host, int port) {
channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build();//指定grpc服务器地址和端口初始化通信channel
blockStub = GrpcServiceGrpc.newBlockingStub(channel);//根据通信channel初始化客户端存根节点
}
public void shutdown() throws InterruptedException{
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
//客户端方法
public void sayHello(String str){
//封装请求参数
UnaryRequest request = UnaryRequest.newBuilder() .setServiceName("GrpcServiceRequest").setMethodName("sendUnaryRequest").setData(ByteString.copyFrom(str.getBytes()))
.build();
//客户端存根节点调用grpc服务接口,传递请求参数
UnaryResponse response = blockStub.sendUnaryRequest(request);
System.out.println("client, serviceName:"+response.getServiceName()+"; methodName:"+response.getMethodName());
}
public static void main(String[] args) throws InterruptedException{
//初始化grpc客户端对象
GrpcClient client = new GrpcClient("127.0.0.1",50051);
for(int i=0; i<5; i++){
client.sayHello("client word:"+ i);
Thread.sleep(3000);
}
}
}