日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

1 為什么選擇 gRPC

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

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

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

2 gRPC VS REST(簡(jiǎn)要比較)

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

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

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

  • grpc-proto:Demo 項(xiàng)目的 gRPC proto 文件
  • grpc-server:Spring Boot 中的 gRPC 服務(wù)器項(xiàng)目
  • grpc-client:Spring Boot 中的 gRPC 客戶端項(xiàng)目

4 grpc-proto 項(xiàng)目

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)建了一個(gè)簡(jiǎn)單的 .proto 文件,包括服務(wù)、方法和消息定義。

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

<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>

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

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

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

mvn install 后生成的源代碼

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

5 grpc-server 項(xiàng)目

使用 grpc-spring-boot-starter 的服務(wù)器庫(kù),它通過(guò)注解簡(jiǎn)化了客戶端和服務(wù)器的定義。下面是 proto 項(xiàng)目和 starter 庫(kù)的一部分 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>

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

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

下面是實(shí)現(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<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 只記錄了來(lái)自請(qǐng)求的客戶端名稱,因此服務(wù)器只是記錄了傳入消息。

6 grpc-client 項(xiàng)目

同樣,使用 grpc-spring-boot-starter 的客戶端庫(kù)。我們通過(guò) @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)樽詣?dòng)生成的服務(wù)注釋 BlockingStub 對(duì)象之后,它就可以使用了。我們發(fā)送消息并獲取響應(yīng),然后記錄響應(yīng)。

從主函數(shù)中觸發(fā)請(qǐng)求函數(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 !!!");
 }
}

我們來(lái)看看結(jié)果:

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

圖片gRPC 服務(wù)器的日志

圖片gRPC 客戶端的日志

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

分享到:
標(biāo)簽:gRPC
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定