【SpringBoot3】結合 gRpc 實現遠程服務調用

一、gRPC概念介紹

gRPC(Google Remote Procedure Call,Google遠程過程調用)是一個現代開源高性能遠程過程調用(RPC)框架,可以在任何環境中運行。它由Google開發,旨在幫助開發人員更輕松地構建分布式應用,特別是當代碼可能在不同地方運行的時候。

gRPC是一個高性能、開源和通用的RPC框架,它基于HTTP/2設計,并支持多種編程語言和平臺。

隨著其開源和廣泛應用,gRPC已成為云原生計算基金會(CNCF)的一個孵化項目,被大量組織和企業采用。

核心特點

  1. 高性能:gRPC使用HTTP/2作為傳輸協議,支持二進制組幀、多路復用、雙向全雙工通信和流式處理等功能,從而顯著提高性能。與JSON相比,gRPC的消息序列化速度更快,消息體積更小。
  2. 跨平臺與跨語言:gRPC支持多種編程語言和平臺,如C++、Java、Python、Go等,使得開發人員可以在不同的環境中使用統一的RPC框架。
  3. 靈活性與可擴展性:gRPC提供了豐富的功能,如負載平衡、跟蹤、健康檢查和身份驗證等,這些功能都是可插拔的,可以根據需要進行配置和擴展。
  4. 安全性:gRPC支持TLS加密,確保數據在傳輸過程中的安全性。同時,它還支持多種認證機制,如JWT(JSON Web Tokens)等,以確保服務的訪問安全。

工作原理

  • 服務定義:在gRPC中,服務通過.proto文件進行定義。這些文件包含了服務的接口描述、消息類型等信息。開發人員可以使用Protocol Buffers(簡稱Protobuf)來定義這些結構化的消息。
  • 代碼生成:基于.proto文件,gRPC提供了protoc編譯器來生成支持多種編程語言的客戶端和服務端代碼。這使得開發人員可以輕松地實現跨語言的RPC調用。
  • 通信過程:在客戶端和服務端之間,gRPC通過HTTP/2協議進行通信。客戶端發送請求到服務端,服務端處理請求并返回響應。整個通信過程都是基于二進制格式的,從而提高了性能和效率。

應用場景

  • 微服務架構:在微服務架構中,gRPC可以有效地連接多語言服務,實現服務間的快速通信。
  • 分布式計算:gRPC適用于分布式計算的最后一英里,將設備、移動應用程序和瀏覽器連接到后端服務。
  • API設計:與REST API相比,gRPC提供了一種更加高效和靈活的API設計風格,適用于需要高性能和低延遲的應用場景。

二、簡單使用步驟

首先,你需要定義gRPC服務。這里我們使用一個簡單的helloworld.proto文件。

1. helloworld.proto

syntax = "proto3";option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "HelloWorldProto";package helloworld;service HelloWorldService {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

2. 生成Java代碼

使用protoc編譯器和gRPC插件生成Java代碼。

protoc --java_out=./src/main/java --grpc-java_out=./src/main/java --plugin=protoc-gen-grpc-java=/path/to/protoc-gen-grpc-java-1.x.x-linux-x86_64.exe helloworld.proto

確保將/path/to/protoc-gen-grpc-java-1.x.x-linux-x86_64.exe替換為你的protoc-gen-grpc-java插件的實際路徑。

3. 服務端實現

在Spring Boot應用中,你可以創建一個組件來實現gRPC服務。

package com.example.grpc;import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;@GrpcService
public class HelloWorldServiceImpl extends HelloWorldServiceGrpc.HelloWorldServiceImplBase {@Overridepublic void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {String message = "Hello, " + req.getName() + "!";HelloReply reply = HelloReply.newBuilder().setMessage(message).build();responseObserver.onNext(reply);responseObserver.onCompleted();}
}

4. 客戶端調用

在Spring Boot應用中,你可以創建一個服務來調用gRPC服務。這里使用JUnit單元測試

import com.example.grpc.HelloReply;
import com.example.grpc.HelloRequest;
import com.example.grpc.HelloWorldServiceGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.junit.jupiter.api.Test;public class HelloWorldClientServiceTest {@Testpublic void sayHello() {ManagedChannel channel = ManagedChannelBuilder.forTarget("localhost:9091").usePlaintext().build();HelloWorldServiceGrpc.HelloWorldServiceBlockingStub stub = HelloWorldServiceGrpc.newBlockingStub(channel);HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName("Lisa").build());System.out.println("response = " + response);channel.shutdown();}
}

5. 構建和運行

確保你的pom.xml中包含了必要的gRPC和Spring Boot依賴。

然后執行maven compile 指令生成java代碼

mvn compile 

啟動SpringBoot服務端,然后運行測試用例,得到如下結果:

response = message: "Hello, Lisa!"

三、添加gRPC相關依賴包

參考 grpc-spring

在Spring Boot項目中使用gRPC,你需要在項目的pom.xml 中添加相關的gRPC依賴。

以下是在Maven項目中添加gRPC依賴的示例。

<dependencies><dependency><groupId>com.salesforce.servicelibs</groupId><artifactId>jprotoc</artifactId><version>1.2.2</version></dependency><dependency><groupId>net.devh</groupId><artifactId>grpc-spring-boot-starter</artifactId><version>${grpc-spring-boot-starter.version}</version></dependency>
</dependencies><properties><protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version><protoc.version>3.25.1</protoc.version><grpc-java.version>1.64.0</grpc-java.version><os-maven-plugin.version>1.7.1</os-maven-plugin.version>
</properties>

請注意,你需要將${grpc-java.version}${grpc-spring-boot-starter.version}替換為你想要使用的具體版本號。

這些依賴項包括了gRPC的基礎庫、與Protobuf的集成、以及Spring Boot對gRPC的支持。確保你使用的版本是兼容的,并根據你的項目需求進行調整。如果你還需要使用到其他的gRPC功能(如安全認證、健康檢查等),你可能需要添加更多的依賴項。

四、使用Maven插件自動生成proto對應代碼

參考 os-maven-plugin 和 protobuf-maven-plugin

如果你希望通過maven編譯時自動生成proto對應的java代碼,則需要添加Maven插件和相關依賴

<properties><protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version><protoc.version>3.25.1</protoc.version><grpc-java.version>1.64.0</grpc-java.version><os-maven-plugin.version>1.7.1</os-maven-plugin.version><grpc-spring-boot-starter.version>3.1.0.RELEASE</grpc-spring-boot-starter.version>
</properties>
//...//
<dependencies><dependency><groupId>com.salesforce.servicelibs</groupId><artifactId>jprotoc</artifactId><version>1.2.2</version></dependency><!-- gRPC Server + Client --><dependency><groupId>net.devh</groupId><artifactId>grpc-spring-boot-starter</artifactId><version>${grpc-spring-boot-starter.version}</version></dependency>
</dependencies>
// ... //<build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>${os-maven-plugin.version}</version></extension></extensions><pluginManagement><plugins><!-- protobuf-maven-plugin --><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>${protobuf-maven-plugin.version}</version><extensions>true</extensions><executions><execution><id>protoc-compile</id><phase>generate-sources</phase><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution><execution><id>protoc-test-compile</id><phase>generate-test-sources</phase><goals><goal>test-compile</goal><goal>test-compile-custom</goal></goals></execution></executions><configuration><protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact><attachProtoSources>true</attachProtoSources><useArgumentFile>true</useArgumentFile><writeDescriptorSet>false</writeDescriptorSet><attachDescriptorSet>false</attachDescriptorSet><includeDependenciesInDescriptorSet>false</includeDependenciesInDescriptorSet><checkStaleness>true</checkStaleness><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact><protocPlugins></protocPlugins></configuration></plugin></plugins></pluginManagement><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId></plugin></plugins>
</build>

通過上面配置后,你就可以在項目中通過指令mvn compile生成proto對應的java代碼,不需要通過外包指令了。

參考

  • https://protobuf.com.cn/overview/
  • https://protobuf.dev/getting-started/javatutorial/
  • https://protobuf.dev/reference/java/java-generated/
  • https://protobuf.dev/programming-guides/proto3/
  • https://github.com/grpc-ecosystem/grpc-spring
  • https://www.xolstice.org/protobuf-maven-plugin/
  • https://github.com/trustin/os-maven-plugin/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41936.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

昇思學習打卡-8-FCN圖像語義分割

目錄 FCN介紹FCN所用的技術訓練數據的可視化模型訓練模型推理FCN的優點和不足優點不足 FCN介紹 FCN主要用于圖像分割領域&#xff0c;是一種端到端的分割方法&#xff0c;是深度學習應用在圖像語義分割的開山之作。通過進行像素級的預測直接得出與原圖大小相等的label map。因…

clean code-代碼整潔之道 閱讀筆記(第十六章)

第十六章 重構SerialDate 16.1 首先&#xff0c;讓它能工作 利用SerialDateTests來完整的理解和重構SerialDate用Clover來檢查單元測試覆蓋了哪些代碼&#xff0c;效果不行重新編寫自己的單元測試經過簡單的修改&#xff0c;讓測試能夠通過 16.2 讓它做對 全過程&#xff1…

若依微服務初始化搭建教程

文章目錄 &#x1f95d;從Gitee拉取代碼&#x1f344;初始化項目配置配置項目maven配置項目JDKmaven - clean - install &#x1f352;數據源配置創建config / seata數據庫創建ry-cloud數據源導入ry-cloud數據 &#x1f370;啟動Nacos下載Nacos修改Nacos配置雙擊startup.cmd啟動…

梧桐數據庫:查詢優化器是提升數據庫性能的關鍵技術

查詢優化器是數據庫管理系統中的核心組件之一&#xff0c;它的主要作用是在執行查詢語句之前&#xff0c;選擇最優的執行計劃&#xff0c;以提高查詢性能。 查詢優化器的基本原理 查詢優化器的主要目標是找到一個執行代價最小的查詢執行計劃。它通過對查詢語句進行語法分析、…

GraphRAG:AI的全局文本理解革新

前言 在人工智能領域&#xff0c;處理和理解大量文本數據始終是一個挑戰。隨著大型語言模型&#xff08;LLMs&#xff09;的出現&#xff0c;自動化地進行復雜的語義理解和文本摘要變得可能。檢索增強生成&#xff08;RAG&#xff09;方法因其能有效結合檢索與生成技術&#x…

C++基礎語法之重載引用和命名空間等

1.C關鍵字 c的關鍵字比我們的c語言的關鍵字多&#xff0c;c包容C語言并對C語言進行了補充&#xff0c;但是我們對關鍵字的學習是在我們后面逐漸學習的。這里我們的只是提供一個表格對齊了解一下。 2.命名空間 我們c出現了命名空間的概念&#xff0c;用關鍵字namespace來定義。…

LeetCode 二分查找

1.題目要求: 給定一個 n 個元素有序的&#xff08;升序&#xff09;整型數組 nums 和一個目標值 target &#xff0c;寫一個函數搜索 nums 中的 target&#xff0c;如果目標值存在返回下標&#xff0c;否則返回 -1。示例 1:輸入: nums [-1,0,3,5,9,12], target 9 輸出: 4 解…

論文閱讀 - Intriguing properties of neural networks

Intriguing properties of neural networks 經典論文、對抗樣本領域的開山之作 發布時間&#xff1a;2014 論文鏈接: https://arxiv.org/pdf/1312.6199.pdf 作者&#xff1a;Christian Szegedy, Wojciech Zaremba, Ilya Sutskever, Joan Bruna, Dumitru Erhan, Ian Goodfellow,…

信息技術課堂上如何有效防止學生玩游戲?

防止學生在信息技術課堂上玩游戲需要綜合運用教育策略和技術手段。以下是一些有效的措施&#xff0c;可以用來阻止或減少學生在課堂上玩游戲的行為&#xff1a; 1. 明確課堂規則 在課程開始之初&#xff0c;向學生清楚地說明課堂紀律&#xff0c;強調不得在上課時間玩游戲。 制…

電阻負載柜的工作原理是什么?

電阻負載柜是用于模擬電網中各種負載特性的設備&#xff0c;廣泛應用于電力系統、新能源發電、電動汽車充電站等領域。其工作原理主要包括以下幾個方面&#xff1a; 1. 結構組成&#xff1a;電阻負載柜主要由變壓器、調壓器、電阻器、控制器、保護裝置等部分組成。其中&#xf…

理解神經網絡的通道數

理解神經網絡的通道數 1. 神經網絡的通道數2. 輸出的寬度和長度3. 理解神經網絡的通道數3.1 都是錯誤的圖片惹的禍3.1.1 沒錯但是看不懂的圖3.1.2 開玩笑的錯圖3.1.3 給人誤解的圖 3.2 我或許理解對的通道數3.2.1 動圖演示 1. 神經網絡的通道數 半路出嫁到算法崗&#xff0c;額…

數據防泄密軟件精選|6款好用的數據防泄漏軟件強推

某科技公司會議室&#xff0c;CEO張總、CIO李總、信息安全主管王經理正圍繞最近發生的一起數據泄露事件展開討論。 張總&#xff08;憂慮&#xff09;: 大家&#xff0c;這次的數據泄露事件對我們來說是個沉重的打擊。客戶信息的外泄不僅損害了我們的信譽&#xff0c;還可能面…

DAY2:插件學習

文章目錄 插件學習ClangGoogle TestCMakeDoxygen 收獲 插件學習 Clang 是什么&#xff1a;Clang 是指 LLVM 項目的編譯器的前端部分&#xff0c;支持對 C 家族語言(C、C、Objective-C)的編譯。Clang 的功能包括&#xff1a;詞法分析、語法分析、語義分析、生成中間中間代碼 L…

【源碼+文檔+調試講解】智能倉儲系統 JSP

摘 要 隨著科學技術的飛速發展&#xff0c;社會的方方面面、各行各業都在努力與現代的先進技術接軌&#xff0c;通過科技手段來提高自身的優勢&#xff0c;智能倉儲系統當然也不能排除在外。智能倉儲系統是以實際運用為開發背景&#xff0c;運用軟件工程開發方法&#xff0c;采…

Dubbo源碼解析-過濾器Filter

上篇我們介紹了消費端負載均衡的原理 Dubbo源碼解析-負載均衡-CSDN博客 因為篇幅問題&#xff0c;本文主單獨Dubbo消費端負載均原理&#xff0c;從dubbo源碼角度進行解析。 大家可以好好仔細讀一下本文。有疑問歡迎留言。 接著說明&#xff0c;讀Dubbo源碼最好是先對Spring源碼…

小車解決連接 Wi-Fi 后還不能上網問題

小車解決連接 Wi-Fi 后還不能上網問題 跟大家講講&#xff1a;為什么小車連接我們自己的熱點以后還是不能聯網呢&#xff1f; 小車連接我們的熱點以后需要訪問外面的網絡&#xff0c;我們訪問網絡使用域名來進行的&#xff0c;所以要對域名進行解析&#xff0c;但是小車原來的域…

【HarmonyOS NEXT】鴻蒙線程安全容器集collections.Map

collections.Map 一種非線性數據結構。 文檔中存在泛型的使用&#xff0c;涉及以下泛型標記符&#xff1a; K&#xff1a;Key&#xff0c;鍵V&#xff1a;Value&#xff0c;值 K和V類型都需為Sendable類型。 屬性 元服務API&#xff1a;從API version 12 開始&#xff0c…

Android 系統網絡、時間服務器配置修改

1.修改wifi 是否可用的檢測地址&#xff1a; 由于編譯的源碼用的是谷歌的檢測url,國內訪問不了&#xff0c;系統會認為wifi網絡受限&#xff0c;所以改成國內的地址 adb shell settings delete global captive_portal_https_urladb shell settings delete global captive_por…

貓咪浮毛太多怎么處理?6年鏟屎官最值得買的貓毛空氣凈化器分享

作為一位擁有6年鏟屎經驗的鏟屎官&#xff0c;家中既有寶寶又有毛孩子的鏟屎官家庭來說&#xff0c;空氣中的寵物異味和貓毛不僅影響生活質量&#xff0c;更關乎家人的健康。普通空氣凈化器雖然能夠提供基本的空氣凈化&#xff0c;但對于養貓家庭的特定需求&#xff0c;如去除寵…

捕獲 IPython 的輸出:深入探索 %%capture 命令的妙用

捕獲 IPython 的輸出&#xff1a;深入探索 %%capture 命令的妙用 在 IPython 的強大功能中&#xff0c;%%capture 魔術命令是一顆隱藏的寶石&#xff0c;它允許用戶捕獲執行單元格的輸出&#xff0c;無論是打印的文本、錯誤信息還是生成的圖像。這對于創建干凈的報告、自動化文…