紧接上一篇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>
客户端代码编写
相较于服务端,客户端的实现要简单许多,只需要新建一个启动方法就可以了,我把目录结构截图:
我将客户端的代码大致分为一下几个步骤:
- 定义好IP和端口
- 创建一个通讯管道,通过构造器传入定义的服务IP和端口
- 通过使用构造器模式给参数赋值
- 调用服务
- 关闭服务
代码如下
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