当前位置:首页>行业快讯 >

idea构建grpc项目|快资讯

时间:2023-05-21 13:27:08    来源:博客园

转载请注明出处:


(资料图片)

安装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工程就搭建好了。

标签:

夏季补水新风尚 市场上功能性饮料新品频出

前段时间,刘畊宏引爆了全民健身热潮,与此同时,全国多地迎来高温天气。在多重因素的影响下,越来越多的消费者意识到了补充电解质的重要性

2022-08-09

郑州管城区、二七区今天开展核酸检测,最全采样点看这里

今天(5月18日)郑州市管城区7:00—17:00二七区9:00—16:00开展核酸检测管城回族区新冠肺炎疫情防控指挥部办公室关于在全区范围开展新冠病

2022-05-19

郑州发布99号通告:调整封控管控区域

郑州市新冠肺炎疫情防控指挥部办公室关于调整封控管控区域的通告(2022年99号)根据疫情形势变化,经郑州市疫情防控指挥部研究,自5月18日

2022-05-19

5月17日河南新增本土确诊病例3例、本土无症状感染者8例

5月17日0—24时,全省新增本土确诊病例3例(郑州市3例),含1例无症状感染者转确诊病例(在郑州市),新增本土无症状感染者8例(郑州市6例

2022-05-19

【行走郑州·读懂最早中国】锁定“云游麦田里的博物馆”直播,探寻最早中国

黄河孕育华夏,麦穗延续苍生,文物折射历史,历史照亮未来。看直播 抽门票为全面展示郑州城市魅力,深入塑造行走郑州·读懂最早中国品牌体

2022-05-19

郑州约谈百果园郑州地区负责人

今日记者获悉,针对近期成都、武汉相继曝出百果园销售腐败变质水果切盘的负面新闻,为全面加强能力作风建设,严格落实国家食品安全示范城市

2022-05-19

全力备汛!郑州94支队伍10313人集结到位

记者从近日召开的郑州市2022年城市防汛工作会议上了解到,郑州市组建了94支共10313人的防汛应急抢险队伍。目前,这些队伍正在全力备汛。据

2022-05-19

【行走河南·读懂中国】河南四大文旅集团入榜全国文旅集团品牌影响力百强

2022年5月16日,迈点研究院发布《2022年4月中国文旅业发展报告》,河南省的四个知名文旅集团,银基文旅集团、建业文旅、洛阳文旅集团、河南

2022-05-19

图集|来自郑州五月的浪漫,闯入莫奈的花园

遇见郑州五月的浪漫,走进这片虞美人和矢车菊的花海,彷佛置身于莫奈的花园。色彩缤纷的花儿在微风中摇曳生姿,好似步入童话般的世界。

2022-05-19

郑州市普通中专采用网上报名 志愿填报时间为5月22日〜25日

5月17日上午,《2022年郑州市普通中等专业学校招生工作意见》发布,今年,郑州市普通中专采用网上报名。普通中专志愿填报时间为5月22日至25

2022-05-19

X 关闭

X 关闭