idea构建grpc项目

2023-05-21 13:25:31 | 来源:博客园

转载请注明出处:

安装protocbuf插件

idea 建议下载一个 protobuf的插件, 可以有代码提示. 这里直接去pluging里搜就行了.

在idea的plugins中搜索proto,然后下载如下的插件就行(最多下载的那个),点击install,然后重启就可以。


(资料图片仅供参考)

gRPC项目构建新建Maven项目并修改pom.xml

首先用IDEA新建一个maven项目

修改pom.xml,注意这个build标签和properties标签都是最顶级标签的直接子标签。

            kr.motd.maven      os-maven-plugin      1.6.2                  org.xolstice.maven.plugins      protobuf-maven-plugin      0.6.1              com.google.protobuf:protoc:3.17.3:exe:${os.detected.classifier}        grpc-java        io.grpc:protoc-gen-grpc-java:1.42.0:exe:${os.detected.classifier}                                          compile            compile-custom                              

接着继续在pom.xml中添加一些,这些依赖是构造gRPC-java项目必须用到的(来自官方文档)

  io.grpc  grpc-netty-shaded  1.42.0  io.grpc  grpc-protobuf  1.42.0  io.grpc  grpc-stub  1.42.0   org.apache.tomcat  annotations-api  6.0.53  provided
添加.proto文件

proto文件用来描述rpc请求体、响应体、以及rpc提供的服务。通过插件可以根据.proto文件生成Java类。

这里面有个非常重要的点要注意,就是proto文件存放的位置。一定要在和src/main/java源文件目录同级的proto源文件目录才可以。如下图所示:

添加一个proto文件:helloworld.proto

syntax = "proto3"; // 协议版本// 选项配置option java_package = "com.chenj.protobuf";option java_outer_classname = "RPCDateServiceApi";option java_multiple_files = true;// 定义包名package com.chenj.protobuf;// 服务接口.定义请求参数和相应结果    service RPCDateService {    rpc getDate (RPCDateRequest) returns (RPCDateResponse) {    }}// 定义请求体message RPCDateRequest {    string userName = 1;}// 定义响应内容message RPCDateResponse {    string serverDate = 1;}
根据.proto文件生成消息体类文件和XXXGrpc类文件

使用maven命令.

在第一步修改的pom.xml的路径下,首先执行

mvn protobuf:compile生成消息体类文件

接着执行:

mvn protobuf:compile-custom生成XXXGrpc类文件

使用maven插件, 编译.

第一个命令执行完. 在 target目录里找就行了. 第二个命令也是找就行了. 然后将生成的Java文件拷贝到你的目录里.就可以了

编写接口实现类
package com.chenj;import com.chenj.grpc.api.RPCDateRequest;import com.chenj.grpc.api.RPCDateResponse;import com.chenj.grpc.api.RPCDateServiceGrpc;import io.grpc.stub.StreamObserver;import java.time.LocalDate;import java.time.format.DateTimeFormatter;// RPCDateServiceGrpc.RPCDateServiceImplBase 这个就是接口.// RPCDateServiceImpl 我们需要继承他的,实现方法回调public class RPCDateServiceImpl extends RPCDateServiceGrpc.RPCDateServiceImplBase {    @Override    public void getDate(RPCDateRequest request, StreamObserver responseObserver) {        //请求结果,我们定义的        RPCDateResponse rpcDateResponse = null;        //        String userName = request.getUserName();        String response = String.format("你好:%s,今天是%s.", userName,LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));        try {            // 定义响应,是一个builder构造器.            rpcDateResponse = RPCDateResponse.newBuilder()                    .setServerDate(response)                    .build();            //int i = 10/0;        } catch (Exception e) {            responseObserver.onError(e);        } finally {                        responseObserver.onNext(rpcDateResponse);        }        responseObserver.onCompleted();    }}
定义服务端
package com.chenj;import io.grpc.Server;import io.grpc.ServerBuilder;import java.io.IOException;public class GRPCServer {    private static final int port = 9999;    public static void main(String[] args) throws IOException, InterruptedException {        //设置service端口        Server server = ServerBuilder.forPort(port)                .addService(new RPCDateServiceImpl())                .build().start();        System.out.println(String.format("GRpc服务端启动成功, 端口号: %d.", port));        server.awaitTermination();    }}
定义客户端
package com.chenj;import com.chenj.grpc.api.RPCDateRequest;import com.chenj.grpc.api.RPCDateResponse;import com.chenj.grpc.api.RPCDateServiceGrpc;import io.grpc.ManagedChannel;import io.grpc.ManagedChannelBuilder;public class GRPCClient {    private static final String host = "localhost";    private static final int serverPort = 9999;    public static void main(String[] args) {        //1,拿到一个通信channel        ManagedChannel channel = ManagedChannelBuilder.forAddress(host, serverPort).                usePlaintext()//无需加密或认证                .build();        try {            //2.拿到stub对象            RPCDateServiceGrpc.RPCDateServiceBlockingStub rpcDateService  = RPCDateServiceGrpc.newBlockingStub(channel);            RPCDateRequest rpcDateRequest = RPCDateRequest.newBuilder()                    .setUserName("JACK")                    .build();            //3,请求            RPCDateResponse rpcDateResponse = rpcDateService.getDate(rpcDateRequest);            //4,输出结果            System.out.println(rpcDateResponse.getServerDate());        } finally {            // 5.关闭channel, 释放资源.            channel.shutdown();        }    }}

然后先启动Server:  再启动Client:  可以看到执行成功。一个简单的gRPC helloworld工程就搭建好了。

上一篇 下一篇

相关新闻

idea构建grpc项目

每日速讯:浅夏悠悠|风中的香气捎来了初夏的花信,收下这篇初夏赏花指南!

天天热资讯!安徽合肥“智造”:每0.5秒就可下线一台笔记本电脑

全日制和开放教育区别 开放教育和函授的区别

【环球热闻】OPPO手机怎么连接电脑投屏 oppo手机怎么连接电脑

全球热资讯!世青赛首轮阿根廷2-1乌兹别克斯坦,国米小将卡博尼攻入制胜球

环球今日报丨西甲前瞻:争冠无望皇马心态成迷 坐镇主场瓦伦力争逆袭

天天微动态丨探世界智能大会:未来科技感包裹无限创意扑面而来

今日视点:宁波市常青藤物业管理有限公司

全球关注:二五八万一样什么意思 二五八万

“520”和书香撞个满怀,鲁迅书店里共话魏晋风骨_每日热讯

蓝芙蓉王多少钱一条|每日速讯

【天天新视野】一枝16元?!这里一天狂卖超850万枝!你买了吗

女孩犯错挨打有用吗_女孩犯错挨打

【世界快播报】26岁生日快乐!布莱顿官方为三笘薫送上生日祝福

最新新闻

idea构建grpc项目

每日速讯:浅夏悠悠|风中的香气捎来了初夏的花信,收下这篇初夏赏花指南!

天天热资讯!安徽合肥“智造”:每0.5秒就可下线一台笔记本电脑

全日制和开放教育区别 开放教育和函授的区别

【环球热闻】OPPO手机怎么连接电脑投屏 oppo手机怎么连接电脑

全球热资讯!世青赛首轮阿根廷2-1乌兹别克斯坦,国米小将卡博尼攻入制胜球

环球今日报丨西甲前瞻:争冠无望皇马心态成迷 坐镇主场瓦伦力争逆袭

天天微动态丨探世界智能大会:未来科技感包裹无限创意扑面而来

今日视点:宁波市常青藤物业管理有限公司

全球关注:二五八万一样什么意思 二五八万

“520”和书香撞个满怀,鲁迅书店里共话魏晋风骨_每日热讯

蓝芙蓉王多少钱一条|每日速讯

【天天新视野】一枝16元?!这里一天狂卖超850万枝!你买了吗

女孩犯错挨打有用吗_女孩犯错挨打

【世界快播报】26岁生日快乐!布莱顿官方为三笘薫送上生日祝福

我也喜欢《大唐双龙传》,这是黄易先生作品中唯一喜欢的,别的都不太读得下去

富士X-S20相机谍照曝光:5月24日发布,售价1299美元

《复联4》再发预告片!漫威粉集体落泪,内地粉丝看到档期怒了

汇报能力,才是你的职场必杀技-热讯

诗经风雅颂含义 诗经风雅颂分别指什么

自考缺考会有什么影响吗?当心被记入诚信档案! 每日消息

世界今亮点!苏杯半决赛来袭!国羽决战日本队,陈雨菲复仇,力争延续纪录

华丽家族股东“对决”,9年前已埋下“导火索”丨股市演义|环球今亮点

2个月宝宝感冒有啥症状_2个月宝宝感冒症状有什么 当前观察

世界最新:宁波居骑士电子科技有限公司

90年代广东持枪抢劫案_28广东化州特大持枪抢劫案 焦点要闻

新鲜蛋挞如何保存 蛋挞出炉后怎么保存|当前视点

邓紫棋和张杰在一起过吗_邓紫棋和张杰上过床

全球速递!痛风的症状有哪些表现_髋关节炎会有哪些症状表现

对对子一年级_对对子