• idea构建grpc项目


    转载请注明出处:

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

  • 相关阅读:
    可视化工具Datart踩(避)坑指南(4)——丢失的精度
    【C语言】经典编程题
    网上商城小程序(小程序+PHP)
    汽车4G车载TBOX智能信息终端
    技术成神之路:设计模式(一)单例模式
    R语言计算时间序列数据的移动平均值(滚动平均值、例如5日均线、10日均线等):使用zoo包中的rollmean函数计算k个周期移动平均值
    母婴用品会员商城小程序的作用是什么
    循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
    【UiPath2022+C#】UiPathExcel 和数据表
    CF1539 D. PriceFixed
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/17418511.html