天天看點

grpc之Java實戰用戶端篇proto檔案用戶端pom依賴用戶端代碼編寫

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>
           

用戶端代碼編寫

相較于服務端,用戶端的實作要簡單許多,隻需要建立一個啟動方法就可以了,我把目錄結構截圖:

grpc之Java實戰用戶端篇proto檔案用戶端pom依賴用戶端代碼編寫

我将用戶端的代碼大緻分為一下幾個步驟:

  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