使用Grpc+maven定义接口、发布服务、调用服务
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,项目使用maven构建,执行mvn compile 命令后,proto文件自动生成java文件,这个功能需要依赖相关编译插件。一、pom.xml配置 4.0.0 com.test.grpcTest
千家信息网最后更新 2025年12月01日使用Grpc+maven定义接口、发布服务、调用服务
服务端输出日志:
客户端输出日志:
项目使用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); } }}客户端输出日志:
服务
客户
客户端
文件
参数
服务器
编译
代码
路径
接口
存根
对象
端口
节点
项目
生成
通信
文档
方法
日志
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库界的四位图灵奖得主
万紫千红服务器上市了没
网络安全管理条例具体内容
湖南 互联网 科技服务
易班网络技术部未来规划
idea数据连接数据库
软件开发题库
sql怎么引用现有数据库
网络安全策略包括哪些策略
阿里云服务器独立管理
邹平瓷砖库存软件开发
华硕服务器上海售后
2网络安全绘画入门
网络安全是先进生产力的
软件开发服务研发服务
杭州康美德网络技术有限公司
网络技术人员资格证书
男主软件开发老电视剧
远程重启服务器cmd
中科可控服务器产地是哪
高斯数据库解析语句
防溺水网络安全征文
数据库表一对一
网络安全典型威胁有哪些
全景网络安全
2022永久免费的服务器
中专网络技术专业是学的什么
下列属于数据库对象是
最佳阵容服务器列表
爱思销售地无数据库
