Bootstrap

grpc之Java实战客户端篇

紧接上一篇grpc之Java实战服务端篇,已经大致说清楚了grpc的服务端是怎么去实现的,这一篇我们就检点说一说客户端的实现.

proto文件

这里需要注意的是客户端与服务端的proto文件必须是相同的,其实这个不难理解,就相当于彼此间的一个通行标记,只有互相能够识别的时候才能够通,所以第一步就是将proto文件复制过来.

客户端pom依赖

客户端的pom依赖跟服务端的是一样的,同样是引用这些基本的grpc和protobuf就可以了:

<properties>
        <grpc.version>1.29.0</grpc.version>
        <protobuf.version>3.11.0</protobuf.version>
    </properties>

    <dependencies>
        <!--  grpc-netty 底层的通讯组件-->
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty-shaded</artifactId>
            <version>${grpc.version}</version>
        </dependency>
        <!--  grpc对protobuf的支持工具包-->
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>${grpc.version}</version>
        </dependency>
        <!--存根,通过这个处理存根-->
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>${grpc.version}</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>

    </dependencies>

    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.5.0.Final</version>
            </extension>
        </extensions>

        <plugins>
            <plugin>
                <!--                通过定义的环境变量找到具体的protobuf编译器位置-->
                <groupId>org.xolstice.maven.plugins</groupId>
                <!--                通过这个插件maven自动根据proto文件生成Java代码-->
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.1</version>

                <configuration>
                    <!--                    用来编译生成文件-->
                    <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
                    </protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <!--                    用于生成grpc的工具类,用于简化实际的数据处理过程,生成的代码简化程序开发工作-->
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
                    </pluginArtifact>
                    <protoSourceRoot>proto</protoSourceRoot>
                </configuration>

                <executions>
                    <execution>
                        <goals>
                            <!--                            生成消息代码-->
                            <goal>compile</goal>
                            <!--                            生成grpc的通讯文件-->
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

客户端代码编写

相较于服务端,客户端的实现要简单许多,只需要新建一个启动方法就可以了,我把目录结构截图:
在这里插入图片描述
我将客户端的代码大致分为一下几个步骤:

  1. 定义好IP和端口
  2. 创建一个通讯管道,通过构造器传入定义的服务IP和端口
  3. 通过使用构造器模式给参数赋值
  4. 调用服务
  5. 关闭服务
    代码如下
package com.xj.news;

import com.xj.news.proto.HelloProto;
import com.xj.news.proto.NewsServiceGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

import java.util.List;

public class NewClient {
    private static final String host = "localhost";//服务器
    private static final int serverPort = 8888;//服务端口号

    public static void main(String[] args) {
        //创建一个通讯管道channel,构造器传入定义的服务IP和端口,usePlaintext()表示一个传输文本的通道
        ManagedChannel channel = ManagedChannelBuilder.forAddress(host,serverPort)
                .usePlaintext().build();
        try {
            NewsServiceGrpc.NewsServiceBlockingStub blockingStub = NewsServiceGrpc.newBlockingStub(channel);
            HelloProto.NewsRequest request = HelloProto.NewsRequest.newBuilder().setDate("20220102").build();
            HelloProto.NewsResponse response = blockingStub.list(request);
            List<HelloProto.News> newsList = response.getNewsList();
            for (HelloProto.News news:newsList ) {
                System.out.println(news.getTitle()+":"+news.getContent());
            }
        }finally {
            channel.shutdown();
        }
    }
}

一个简单的grpc例子到这已经完全结束,因为git的改动,只能是一个私有项目,现在把他转存到我的百度网盘,供需要的朋友下载
链接:https://pan.baidu.com/s/1jy5fAQy81nGp0-YYvws8sw
提取码:1111

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;