grpc之Java實戰用戶端篇
- proto檔案
- 用戶端pom依賴
- 用戶端代碼編寫
緊接上一篇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