日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
gRPC對比REST,在SpringBoot中使用gRPC

1 為什么選擇 gRPC

gRPC是一種高性能的先進(jìn)RPC(遠(yuǎn)程過程調(diào)用)框架,是開源的,并且兼容不同的環(huán)境。它使用協(xié)議緩沖區(qū)作為消息交換格式。

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁設(shè)計師等,應(yīng)用各種網(wǎng)絡(luò)程序開發(fā)技術(shù)和網(wǎng)頁設(shè)計技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)專業(yè)提供成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站制作(企業(yè)站、響應(yīng)式網(wǎng)站開發(fā)、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗的提升,我們力求做到極致!

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

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

2 gRPC VS REST(簡要比較)

主要的區(qū)別在于:

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

圖片

3 項目結(jié)構(gòu)

  • grpc-proto:Demo 項目的 gRPC proto 文件
  • grpc-server:Spring Boot 中的 gRPC 服務(wù)器項目
  • 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);
}

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

使用 protobuf-maven-plugin 將服務(wù)器和客戶端代碼生成集成到 Maven 構(gòu)建系統(tǒng)中。


 org.xolstice.maven.plugins
 protobuf-maven-plugin
 ${protobuf-maven-plugin.version}
 
  
   com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}
  grpc-java
  
   io.grpc:protoc-gen-grpc-java:${io.grpc.version}:exe:${os.detected.classifier}
 
 
  
   client-code-generation
   
    compile
   
  
  
   server-code-generation
   
    compile-custom
   
  
 

結(jié)果是,當(dāng)項目通過 mvn package 命令編譯時,服務(wù)器和客戶端代碼都會生成。

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

因此,我們應(yīng)該調(diào)用 mvn install 命令。

mvn install 后生成的源代碼

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

5 grpc-server 項目

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


    net.devh
    grpc-server-spring-boot-starter
    2.14.0.RELEASE
  
  
    com.imertyildiz
    grpcproto
    0.0.1-SNAPSHOT
  

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

當(dāng)我們?yōu)閿U展自動生成的 gRPC 服務(wù)定義的類使用 @GrpcService 注解時,該庫會將服務(wù)注冊到 gRPC 服務(wù)器上。

下面是實現(xiàn)代碼:

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 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 只記錄了來自請求的客戶端名稱,因此服務(wù)器只是記錄了傳入消息。

6 grpc-client 項目

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

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

@GrpcClient 注解中的目標(biāo)服務(wù)器名稱參數(shù)在這里用于配置地址和端口信息。

客戶端代碼如下:

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()));
    }

}

在我們?yōu)樽詣由傻姆?wù)注釋 BlockingStub 對象之后,它就可以使用了。我們發(fā)送消息并獲取響應(yīng),然后記錄響應(yīng)。

從主函數(shù)中觸發(fā)請求函數(shù)。代碼如下:

@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 !!!");
 }
}

我們來看看結(jié)果:

首先啟動了服務(wù)器,然后啟動了客戶端。結(jié)果如下:

gRPC 服務(wù)器的日志

gRPC 客戶端的日志

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


文章題目:gRPC對比REST,在SpringBoot中使用gRPC
網(wǎng)頁鏈接:http://m.5511xx.com/article/djiddsi.html