gpt4 book ai didi

idea构建grpc项目

转载 作者:我是一只小鸟 更新时间:2023-05-21 14:31:17 29 4
gpt4 key购买 nike

转载请注明出处:

安装protocbuf插件

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

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

gRPC项目构建

新建Maven项目并修改pom.xml

首先用IDEA新建一个maven项目 。

                     。

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

                            <build>
  <extensions>
    <extension>
      <groupId>kr.motd.maven</groupId>
      <artifactId>os-maven-plugin</artifactId>
      <version>1.6.2</version>
    </extension>
  </extensions>
  <plugins>
    <plugin>
      <groupId>org.xolstice.maven.plugins</groupId>
      <artifactId>protobuf-maven-plugin</artifactId>
      <version>0.6.1</version>
      <configuration>
        <protocArtifact>com.google.protobuf:protoc:3.17.3:exe:${os.detected.classifier}</protocArtifact>
        <pluginId>grpc-java</pluginId>
        <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.42.0:exe:${os.detected.classifier}</pluginArtifact>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>
            <goal>compile-custom</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
                          

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

                            <dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-netty-shaded</artifactId>
  <version>1.42.0</version>
</dependency>
<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-protobuf</artifactId>
  <version>1.42.0</version>
</dependency>
<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-stub</artifactId>
  <version>1.42.0</version>
</dependency>
<dependency> <!-- necessary 
                            
                              for
                            
                             Java 9+ -->
  <groupId>org.apache.tomcat</groupId>
  <artifactId>annotations-api</artifactId>
  <version>6.0.53</version>
  <scope>provided</scope>
</dependency>
                          

添加.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<RPCDateResponse>
                            
                               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项目的文章就讲到这里了,如果你想了解更多关于idea构建grpc项目的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com