自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何基于gRPC溝通微服務(wù)框架

開發(fā) 架構(gòu)
gRPC 是一個(gè)開源框架(由 Google 創(chuàng)建),是一個(gè)通用的 RPC 框架,用于大規(guī)模構(gòu)建具有高性能的網(wǎng)絡(luò)應(yīng)用程序。實(shí)現(xiàn)有多種語言版本,并且支持跨平臺(tái)通信。

本文我們來講解一下如何使用 gRPC構(gòu)建微服務(wù),gRPC是一個(gè)開源框架,可用于構(gòu)建可擴(kuò)展且高性能的微服務(wù)并創(chuàng)建服務(wù)之間的通信。

背景

隨著企業(yè)越來越多地轉(zhuǎn)向微服務(wù),對(duì)構(gòu)建這些微服務(wù)的低延遲和可擴(kuò)展框架的需求也在增加。為了滿足這一需求,各種工具和框架提供商正加快滿足微服務(wù)需求。同時(shí)從構(gòu)建大型微服務(wù)應(yīng)用程序的經(jīng)驗(yàn)中學(xué)習(xí),技術(shù)專業(yè)人士分享他們對(duì)可重用組件的知識(shí),以便其他人可以構(gòu)建具有相同規(guī)模和性能的架構(gòu)。

什么是 gRPC

gRPC 是一個(gè)開源框架(由 Google 創(chuàng)建),是一個(gè)通用的 RPC 框架,用于大規(guī)模構(gòu)建具有高性能的網(wǎng)絡(luò)應(yīng)用程序。實(shí)現(xiàn)有多種語言版本,并且支持跨平臺(tái)通信。

使用場景

gRPC 非常適合服務(wù)與服務(wù)之間的 RPC 通信。在這里,我們將使用 Java 來實(shí)現(xiàn)微服務(wù)和相關(guān)框架,讓它的功能更齊全。為了讓其他服務(wù)可以訪問它,我們將創(chuàng)建一個(gè)包裝 REST 服務(wù),這個(gè)服務(wù)將使用 gRPC 客戶端與 gRPC 服務(wù)進(jìn)行通信。

準(zhǔn)備工作

我們需要設(shè)置一個(gè)基礎(chǔ)環(huán)境來構(gòu)建和運(yùn)行示例?;疽笫前惭b Java 和 Maven。gRPC 工具和服務(wù)器運(yùn)行時(shí)庫等其他依賴項(xiàng),將在構(gòu)建過程中自動(dòng)下載。有關(guān)構(gòu)建應(yīng)用程序所需的核心依賴項(xiàng),請(qǐng)參閱下面的代碼。

<dependency>
<groupId>io.github.lognet</groupId>
<artifactId>grpc-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>

核心功能

gRPC 基本上是一種與平臺(tái)和編碼無關(guān)的協(xié)議。這意味著,您可以使用任何類型的編碼,如二進(jìn)制、JSON、XML 等,但推薦的方法是使用“protobuf”,它使用專門的序列化/反序列化機(jī)制支持二進(jìn)制編碼。可插拔設(shè)計(jì)允許用戶對(duì)其進(jìn)行擴(kuò)展以支持所需的平臺(tái)和堆棧。

protobuf 的核心構(gòu)造是 proto IDL(接口定義語言),定義了消息類型和服務(wù)定義。它還提供了為所需平臺(tái)生成模型類和服務(wù)接口的工具。

消息類型

我們可以從在.proto文件中定義消息類型的 proto 定義開始??聪旅娴睦?。

message AccountProto {    
int32 accId = 1;
string accName = 2;
string accBalance = 3;
bool status = 4;
...
}

有關(guān)數(shù)據(jù)類型和關(guān)鍵字的完整參考,請(qǐng)參閱proto3文檔。

Protobuf 提供了一種工具,可以根據(jù)適用于您的平臺(tái)/編程語言的消息定義為模型類生成代碼。以下命令將根據(jù)給定的消息定義在 Java 中生成account類。

$ > protoc -I=proto-demo --java_out=proto-demo account.proto

服務(wù)定義

gRPC 服務(wù)定義是一組需要對(duì)定義的消息類型執(zhí)行的操作。這些操作可以采用以下四種通信形式之一:

  • 單通道 RPC — 它是最簡單的通信形式。它本質(zhì)上是同步的,允許用戶以阻塞模式發(fā)送請(qǐng)求并等待響應(yīng),直到服務(wù)器完成處理。
  • 流式 RPC — 在這種形式中,客戶端一次性發(fā)送數(shù)據(jù),但服務(wù)器以流的形式返回響應(yīng)。
  • 客戶端流式 RPC — 與服務(wù)器流式傳輸不同,在這種形式中,客戶端以流的形式發(fā)送請(qǐng)求的數(shù)據(jù),服務(wù)器將數(shù)據(jù)作為一個(gè)整體返回。
  • 雙向流式 RPC — 在這種形式中,服務(wù)器和客戶端都支持根據(jù)請(qǐng)求和響應(yīng)流式傳輸數(shù)據(jù)。

具有標(biāo)準(zhǔn) CRUD 操作的消息類型的示例服務(wù)定義將采用以下輸入:

service AccountService {
rpc GetAccount (google.protobuf.Int32Value) returns (AccountProto);
rpc GetAllAccounts (google.protobuf.Empty) returns (stream AccountProto);
rpc CreateAccount (AccountProto) returns (AccountProto);
rpc UpdateAccount (AccountProto) returns (AccountProto);
rpc DeleteAccount (google.protobuf.Int32Value) returns (google.protobuf.Empty);
}

gRPC-Java 實(shí)現(xiàn)提供的擴(kuò)展工具有助于根據(jù)域邏輯和服務(wù)器存根生成用戶需要實(shí)現(xiàn)的服務(wù)接口,客戶端將使用這些存根調(diào)用已部署的服務(wù)。

$ > protoc -I=grpc-demo\src\main\proto --java_out=grpc-demo\src\main\proto account.proto

標(biāo)準(zhǔn)服務(wù)器和客戶端

gRPC-Java 庫提供了一個(gè)響應(yīng)式服務(wù)器實(shí)現(xiàn)(基于 Netty)來部署您的服務(wù)和一個(gè)阻塞/非阻塞客戶端實(shí)現(xiàn)來連接您的服務(wù)和其他服務(wù)。

您需要注冊(cè)您的服務(wù)實(shí)現(xiàn)并以編程方式啟動(dòng)服務(wù)器。

server = ServerBuilder.forPort(port), .addService(new GreeterImpl()).build().start();

在此處找到 GitHub 參考。

要連接到部署在基于 Netty 的 gRPC 服務(wù)器上的服務(wù),您需要?jiǎng)?chuàng)建一個(gè)消息通道并將其與生成的服務(wù)器存根連接以進(jìn)行調(diào)用。

ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build(); 
blockingStub = GreeterGrpc.newBlockingStub(channel);
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloReply response = blockingStub.sayHello(request);

在此處找到 GitHub 參考。

網(wǎng)絡(luò)客戶端

還有一個(gè) gRPC Web 模塊,允許 Web 客戶端無縫訪問您的 gRPC 服務(wù)。他們的早期版本支持通過反向代理連接 Web 客戶端,但現(xiàn)在可以在沒有中間代理的情況下進(jìn)行。

另一種方法是使用 REST/GraphQL 協(xié)議將包裝服務(wù)層暴露給面向外部的世界,并通過 gRPC 客戶端連接。

數(shù)據(jù)映射和持久性

我們可能需要在其之上添加另一層,以使用 Hibernate 等數(shù)據(jù)訪問庫創(chuàng)建功能齊全的域服務(wù)。與 Hibernate 或任何數(shù)據(jù)庫一樣,需要以某種方式修飾所需的實(shí)體,而這對(duì)于 protobuf 模型生成的模型可能不可行。因此,我們可能需要一些映射邏輯來將模型類轉(zhuǎn)換為實(shí)體類。一個(gè)這樣好的庫是 MapStruct,它基于 bean 約定進(jìn)行自動(dòng)映射。我們只需要提供映射接口:

@Mapper
public interface AccountProtoMapper {
Account map(AccountProto accountProto);
AccountProto map(Account account);
}

第三方支持

為了進(jìn)一步簡化整個(gè)構(gòu)建和運(yùn)行環(huán)境,有一些流行的第三方 Maven 插件和庫也有幫助。

1. 運(yùn)行與 Build 集成的 Proto Tool

協(xié)議緩沖區(qū) Maven 插件(由 Xolstice 提供)運(yùn)行 proto 工具及其擴(kuò)展,以及從*.proto文件構(gòu)建和生成源代碼。它還附加了 .proto*文件作為項(xiàng)目的資源。請(qǐng)參閱示例配置以生成 Java 代碼。

<configuration>
<protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
</configuration>

參考可以在這里找到。

2. 生成映射器類

MapStruct 庫支持生成消息類型的映射器類,這些映射器類可以將消息從/到類的實(shí)體。它提供了一個(gè)注解處理器,通過在構(gòu)建時(shí)分析指定的注解來生成一個(gè)映射器類。Maven編譯插件參考下面的配置。

<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>

3.自動(dòng)啟動(dòng)gRPC服務(wù)器并注冊(cè)服務(wù)實(shí)現(xiàn)

默認(rèn)情況下,gRPC 服務(wù)器不會(huì)與 web 服務(wù)器(在本例中為 Netty)一起啟動(dòng)。此外,它需要在服務(wù)器啟動(dòng)之前注冊(cè)所有 gRPC 服務(wù)。LogNet 的 gRPC Spring Boot 會(huì)自動(dòng)掃描所有帶有@GRpcService注解的類,并向服務(wù)器構(gòu)建器注冊(cè)服務(wù)定義。構(gòu)建服務(wù)器后,它會(huì)在 Spring 應(yīng)用程序?qū)傩灾信渲玫亩丝谏献詣?dòng)啟動(dòng) gRPC 服務(wù)器。

除了注冊(cè)服務(wù)和啟動(dòng)服務(wù)器外,它還支持自動(dòng)配置的安全、健康檢查和服務(wù)發(fā)現(xiàn)。有關(guān)詳細(xì)信息,請(qǐng)參閱此處。

GitHub 上提供了上述方法的完整示例實(shí)現(xiàn)。

差異化

  • 谷歌構(gòu)建 gRPC 是出于從零開始構(gòu)建大規(guī)模微服務(wù)的學(xué)習(xí)需求。大多數(shù)流行的微服務(wù)框架仍然缺乏對(duì)性能和跨平臺(tái)支持的要求,因?yàn)闆]有大型系統(tǒng)可以在單個(gè)堆棧和單個(gè)編碼中構(gòu)建。
  • 最受歡迎的是對(duì) HTTP/2 的支持,它仍然是許多提供商的路線圖。它為在單個(gè) TCP 連接上使用多路復(fù)用非阻塞數(shù)據(jù)流的二進(jìn)制線路傳輸提供了優(yōu)勢。進(jìn)一步支持標(biāo)頭壓縮,它提供了額外的性能優(yōu)勢。
  • 除了支持 protobuf 作為主要編碼機(jī)制外,它還增加了對(duì)基于 JSON 的服務(wù)的支持,這些服務(wù)可以很容易地被低端客戶端使用。雖然 protobuf 是實(shí)施 gRPC 的推薦方式,但 Google 增加了對(duì) FlatBuffers 的支持,并增加了內(nèi)部和整個(gè)行業(yè)的采用率。
  • 初始版本支持通過反向代理(如基于 Envoy 和 Ngnix 的系統(tǒng))公開 gRPC 服務(wù)。gRPC Web 的最新發(fā)展彌補(bǔ)了這一差距,并通過跨 JavaScript 庫采用 HTTP/2 增加了對(duì)向 Web 客戶端公開 gRCP 服務(wù)的支持。進(jìn)一步的開發(fā)正在進(jìn)行中,以增加對(duì) Angular 和 React 等流行 Web 框架的支持。
  • 借助功能齊全的開發(fā)堆棧,它還為單元測試助手(如InProcessServer和InProcessChannelBuilder.

采用

Google 在其內(nèi)部工具和平臺(tái)上使用它,例如 Bigtable、Pub/Sub、Speech 和 TensorFlow。

CoreOS 是 gRPC 的早期采用者,并在其服務(wù)發(fā)現(xiàn)工具和容器引擎中增加了支持。

Microsoft 是 gRPC 的高級(jí)采用者,并增加了對(duì)其 Web API 和構(gòu)建工具的支持,以簡化開發(fā)人員無縫構(gòu)建服務(wù)的工作。

現(xiàn)在,越來越多的項(xiàng)目在整個(gè)行業(yè)中使用它,例如 Docker、Square、Netflix 和 Cisco 等開源開發(fā)人員。

替代方法

除了構(gòu)建 gRPC 之外,Google 的應(yīng)用程序還提供了文章中提到的工具/庫和 Spring Boot 啟動(dòng)框架。一些專門的微服務(wù)框架為 gRPC 服務(wù)實(shí)現(xiàn)提供了開箱即用的支持。

  • Quarkus gRPC
  • Asp.NET gRPC
  • Akka gRPC
  • Salesforce gRPC

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2018-12-03 08:00:00

微服務(wù)gRPC

2017-05-25 10:32:41

Docker微服務(wù)容器

2022-10-17 00:14:55

微服務(wù)稅mock代理服務(wù)

2018-12-17 16:39:20

Golang微服務(wù)

2022-03-29 10:36:32

技術(shù)架構(gòu)微服務(wù)

2017-09-09 16:22:51

PHP-MSF服務(wù)器服務(wù)框架

2020-11-27 10:50:06

微服務(wù)架構(gòu)框架

2021-03-02 16:25:52

微服務(wù)架構(gòu)技術(shù)

2023-02-17 18:06:33

微服務(wù)架構(gòu)

2021-07-07 10:21:26

技術(shù)

2021-12-29 08:30:48

微服務(wù)架構(gòu)開發(fā)

2024-11-06 16:27:12

2022-03-31 08:15:38

微服務(wù)服務(wù)拆分架構(gòu)

2019-10-16 08:41:46

微服務(wù)架構(gòu)Nginx

2023-08-16 14:39:20

微服務(wù)Java

2022-06-07 08:19:30

gRPCBallerina微服務(wù)

2019-07-12 08:45:07

開源微服務(wù)框架

2021-12-02 16:20:17

開源微服務(wù)框架

2022-03-22 09:22:21

Go kitgRPC網(wǎng)絡(luò)傳輸

2021-12-05 23:14:24

微服務(wù)GolanggRPC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)