使用Grpc+maven定义接口、发布服务、调用服务
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,项目使用maven构建,执行mvn compile 命令后,proto文件自动生成java文件,这个功能需要依赖相关编译插件。一、pom.xml配置 4.0.0 com.test.grpcTest
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
中智农互联网科技
互联网科技公司排名
中国互联网科技工作委员会毛军
A股互联网金融科技公司
智能科技公司是互联网公司吗
互联网科技卖菜
中资互联网科技
互联网科技作文
中国互联网科技发展
互联网女皇 腾讯科技
丰台科技园 互联网公司
互联网科技创新企业排名
华中科技有哪些互联网大佬
博兴的互联网电子科技公司
浙江互联网科技研学营
哈尔滨屹滨互联网科技有限公司
杭州披云加互联网科技有限公司
广州有谷有贝互联网科技有限公司
河南商务圈互联网科技有限公司
株洲百竞科技的互联网营销顾问
喔噻互联网科技有限公司
互联网科技公司排名
科技类互联网
华宇互联网科技
互联网科技论文
苏州大垚互联网科技
互联网科技实习生岗位职责
常德市电业局互联网科技部
天津腾达互联网科技有限公司
数字科技和互联网金融哪个好
