亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1 為什么選擇 gRPC

gRPC是一種高性能的先進RPC(遠程過程調用)框架,是開源的,并且兼容不同的環境。它使用協議緩沖區作為消息交換格式。

不同語言中的 gRPC 客戶端和服務器通信示例

gRPC可以讓客戶端代碼像調用本地對象方法一樣輕松地調用位于不同計算機上的服務器應用程序的方法,從而簡化了開發分布式應用程序和服務的過程。

2 gRPC VS REST(簡要比較)

主要的區別在于:

  • 協議:gRPC 使用 HTTP/2,但通常 REST 使用 HTTP/1.1(下面進行比較)。簡而言之,HTTP/2 比 HTTP/1.1 快得多,效率更高。
  • 數據格式:REST 通常使用 JSON,而 gRPC 使用協議緩沖區。
  • API 格式:gRPC 的 API 范式是 RPC(遠程過程調用),而 REST 基于表現層狀態轉移模型。
  • 流式傳輸:雖然 gRPC 支持雙向流式傳輸,但 REST 僅限于請求-響應模式。

3 項目結構

  • grpc-proto:Demo 項目的 gRPC proto 文件
  • grpc-server:Spring Boot 中的 gRPC 服務器項目
  • grpc-client:Spring Boot 中的 gRPC 客戶端項目

4 grpc-proto 項目

syntax = "proto3";

package com.imertyildiz.grpcproto;

option JAVA_multiple_files = true;

message HelloWorldRequest{
    string requestMessage = 1;
    string clientName = 2;
}

message HelloWorldResponse{
    string responseMessage = 1;
}

service HelloWorldService {
    rpc HelloWorld(HelloWorldRequest) returns (HelloWorldResponse);
}

這里創建了一個簡單的 .proto 文件,包括服務、方法和消息定義。

使用 protobuf-maven-plugin 將服務器和客戶端代碼生成集成到 Maven 構建系統中。

<plugin>
 <groupId>org.xolstice.maven.plugins</groupId>
 <artifactId>protobuf-maven-plugin</artifactId>
 <version>${protobuf-maven-plugin.version}</version>
 <configuration>
  <protocArtifact>
   com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
  <pluginId>grpc-java</pluginId>
  <pluginArtifact>
   io.grpc:protoc-gen-grpc-java:${io.grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
 </configuration>
 <executions>
  <execution>
   <id>client-code-generation</id>
   <goals>
    <goal>compile</goal>
   </goals>
  </execution>
  <execution>
   <id>server-code-generation</id>
   <goals>
    <goal>compile-custom</goal>
   </goals>
  </execution>
 </executions>
</plugin>

結果是,當項目通過 mvn package 命令編譯時,服務器和客戶端代碼都會生成。

但是,我們應該將項目 JAR 安裝到本地 Maven 倉庫中,以便 grpc-client 和 grpc-server 項目可以包含此項目 JAR。

因此,我們應該調用 mvn install 命令。

mvn install 后生成的源代碼

我們將在 grpc-server 和 grpc-client 項目中使用的服務和請求對象已創建并安裝在本地 Maven 倉庫中。

5 grpc-server 項目

使用 grpc-spring-boot-starter 的服務器庫,它通過注解簡化了客戶端和服務器的定義。下面是 proto 項目和 starter 庫的一部分 pom.xml。

  <dependency>
    <groupId>.NET.devh</groupId>
    <artifactId>grpc-server-spring-boot-starter</artifactId>
    <version>2.14.0.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>com.imertyildiz</groupId>
    <artifactId>grpcproto</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </dependency>

該庫在應用程序啟動時啟動 gRPC 服務器,并監聽端口:9090(默認值)。如果我們想更改端口,可以通過 Application.properties 文件更改,例如:grpc.server.port=8000。

當我們為擴展自動生成的 gRPC 服務定義的類使用 @GrpcService 注解時,該庫會將服務注冊到 gRPC 服務器上。

下面是實現代碼:

 package com.imertyildiz.grpcserver.Service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.imertyildiz.grpcproto.HelloWorldRequest;
import com.imertyildiz.grpcproto.HelloWorldResponse;
import com.imertyildiz.grpcproto.HelloWorldServiceGrpc;

import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;


@GrpcService
public class GreeterServer extends HelloWorldServiceGrpc.HelloWorldServiceImplBase {
    private static final Logger logger = LoggerFactory.getLogger(GreeterServer.class);

    @Override
    public void helloWorld(HelloWorldRequest request, StreamObserver<HelloWorldResponse> responseobserver) {
        HelloWorldResponse setResponseMessage = HelloWorldResponse.newBuilder()
                .setResponseMessage("Hello " + request.getClientName() + " !!!").build();
        logger.info(String.format("%1s sent a message: %1s", request.getClientName(),request.getRequestMessage()));
        responseObserver.onNext(setResponseMessage);
        responseObserver.onCompleted();
    }

}

由于此 POC 只記錄了來自請求的客戶端名稱,因此服務器只是記錄了傳入消息。

6 grpc-client 項目

同樣,使用 grpc-spring-boot-starter 的客戶端庫。我們通過 @GrpcClient("grpc-server") 定義 gRPC 客戶端。該注解帶有命名目標服務器的參數。我們應該在 application.properties 文件中配置目標服務器地址。創建的文件如下所示:

grpc.client.grpc-server.address=static://localhost:8000
grpc.client.grpc-server.negotiation-type=plAIntext
grpc.server.port=8001

@GrpcClient 注解中的目標服務器名稱參數在這里用于配置地址和端口信息。

客戶端代碼如下:

package com.imertyildiz.grpcclient.Service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.imertyildiz.grpcproto.HelloWorldRequest;
import com.imertyildiz.grpcproto.HelloWorldResponse;
import com.imertyildiz.grpcproto.HelloWorldServiceGrpc.HelloWorldServiceBlockingStub;

import net.devh.boot.grpc.client.inject.GrpcClient;

@Service
public class GreeterClient {
    private static final Logger logger = LoggerFactory.getLogger(GreeterClient.class);

    @GrpcClient("grpc-server")
    private HelloWorldServiceBlockingStub helloWorldServiceStub;

    public void sayHello(String sender, String message) {
        HelloWorldRequest helloWorldRequest = HelloWorldRequest.newBuilder().setClientName(sender)
                .setRequestMessage(message).build();
        HelloWorldResponse helloWorldResponse = this.helloWorldServiceStub.helloWorld(helloWorldRequest);
        logger.info(String.format("Server sent a response: %1s", helloWorldResponse.getResponseMessage()));
    }

}

在我們為自動生成的服務注釋 BlockingStub 對象之后,它就可以使用了。我們發送消息并獲取響應,然后記錄響應。

從主函數中觸發請求函數。代碼如下:

@SpringBootApplication
public class GrpcClientApplication {

 public static void main(String[] args) {
  ApplicationContext applicationContext = SpringApplication.run(GrpcClientApplication.class, args);
  GreeterClient greeterClientService = applicationContext.getBean(GreeterClient.class);
  greeterClientService.sayHello("Client", "Hello Server !!!");
 }
}

我們來看看結果:

首先啟動了服務器,然后啟動了客戶端。結果如下:

圖片gRPC 服務器的日志

圖片gRPC 客戶端的日志

總的來說,本文創建了簡單的 Demo 項目,展示了在 Spring Boot、Java 中 gRPC 客戶端和服務器的實現和通信,以及通過 protobuf 編譯器生成客戶端和服務器代碼的單獨 proto 項目。

分享到:
標簽:gRPC
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定