gRPC之初體驗

来源:https://www.cnblogs.com/dk168/archive/2023/01/16/17056254.html
-Advertisement-
Play Games

1、yaml文件準備 common: secretid: AKIDxxxxx secretKey: 3xgGxxxx egion: ap-guangzhou zone: ap-guangzhou-7 InstanceChargeType: POSTPAID_BY_HOUR 2、config配置類準備 ...


前言

經常看到說gRPC怎麼好的文章,實際工作中也沒有體驗過,這次看了一下它的HelloWorld程式,記錄一下這個過程。 RPC是Remote Produce Call 的縮寫, 就是遠程調用,調用遠程的代碼像本地一樣。Java裡面比較有名的RPC框架Dubbo,但它只支持Java。 gRPC 是google開源的RPC框架,使用HTTP2, 支持很多種語言:Java,GO,.Net Core,C,它都有對應的支持。 這篇初體驗就打算使用Java做服務端,分別使用Java和GO作為客戶端。

Java服務端和客戶端

首先我們來建一個Java服務端。
使用gRPC最基礎的一步是protobuf文件,這裡我們直接使用HelloWorld裡面的文件,首先新建一個helloworld.proto在source目錄下麵,參考了這篇文章https://www.cnblogs.com/liugh/p/7505533.html

syntax = "proto3";

option java_multiple_files = true;
option java_package = "ken.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

定義了一個SayHello方法,接收HelloRequest的消息,返回HelloReply

我們用proto文件生成相應的Java代碼
這裡我們直接使用maven插件protobuf-maven-plugin來完成,

 <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.2</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</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:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>1.4.1</version>
                <executions>
                    <execution>
                        <id>enforce</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireUpperBoundDeps/>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

這樣編譯之後
image
就會生成對應的Java文件在target目錄下麵
image

然後就是新建一個HelloWorldServer來作為服務端,這裡代碼省略,可以直接使用
https://github.com/grpc/grpc-java/blob/master/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java

IDEA會出現找不到類的錯誤,重啟一下IEDA可以修複

POM文件需要添加grpc-netty-shaded,grpc-protobuf,grpc-stub,protobuf-java-util,gson 參考grpc的sample就可以了,客戶端也是這樣的配置

客戶端代碼同樣也是需要用Propo文件生成Java類,然後添加POM文件,然後編寫客戶端代碼
https://github.com/grpc/grpc-java/blob/master/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldClient.java

運行服務端Java類, 控制台輸出
INFO: Server started, listening on 50051
然後運行客戶端代碼,
一月 16, 2023 8:00:13 下午 ken.grpc.examples.helloworld.HelloWorldClient greet
INFO: Will try to greet world1 ...
一月 16, 2023 8:00:13 下午 ken.grpc.examples.helloworld.HelloWorldClient greet
INFO: Greeting: Hello 1world1
就可以在客戶端看到對應的調用。

Go語言客戶端

首先按照https://grpc.io/docs/languages/go/quickstart/裡面的Prerequisites安裝go, 下載Protocol buffer 編譯器, protoc,文檔裡面的是Linux的指引,我用的是Window的系統,所以要下載到對應的Window版本,然後配置到Path裡面。參考了這篇文章
https://www.geeksforgeeks.org/how-to-install-protocol-buffers-on-windows/
https://github.com/protocolbuffers/protobuf/releases/tag/v21.12
執行命令
$ go install google.golang.org/protobuf/cmd/[email protected]
$ go install google.golang.org/grpc/cmd/[email protected]
安裝插件。

基本的環境就可以了,就可以編碼了。
首先用go mod init grpcdemo/hello新建一個項目
然後和Java相同的添加.proto文件,這裡需要在proto文件中添加一行
option go_package = "grpcdemo/hello/helloworld";
這樣才可以生成go語言的類,執行命令
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld/helloworld.proto
我們可以在目錄下麵看到生成的類
image

然後編寫grpc-client/main.go,這裡代碼也是複製example裡面的代碼
https://github.com/grpc/grpc-go/blob/master/examples/helloworld/greeter_client/main.go
需要修改的地方是引用的包修改成你自己的
pb "grpcdemo/hello/helloworld/helloworld"

運行這個main.go,控制台輸出
2023/01/16 16:18:31 Greeting: Hello 1world
我們調用了Java服務端的服務使用GO語言。

總結

體驗gRPC整體感覺還是很容易,不管是服務端還是客戶端都是以proto文件作為協議的基礎, 查了下實際的引用中,這個文件的存放位置也比較有它的方法。這裡有篇文章專門說這個事情https://blog.csdn.net/kevin_tech/article/details/122834090
如何編寫proto,如何寫好grpc的代碼還有很多需要學習,這裡只是體驗一下,暫未深入。後期繼續在深入學習一下。 同時也打算做些對比試驗,比如它跟rest服務對比下到底能快多少,和Dubbo對比一下,哪個更好用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • node和npm在某種意義上,早已成為當前前端開發中不可或缺的工具。 本文將介紹如何進行node和npm的版本升級和指定等等操作。 查看node和npm版本: node -v npm -v 清除npm緩存: npm cache clean -f 如何升級npm 當只需要簡單的升級 npm 的時候,可 ...
  • CAP特性 ​ CAP理論是在設計分散式系統的過程中,處理數據一致性問題時必須考慮的理論,一個分散式系統最多只能同時滿足一致性(Consistence)、可用性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項。 2000年7月Eric Brewer教授 ...
  • StringBuilder類 一、結構剖析 一個可變的字元序列。此類提供一個與 StringBuffer 相容的 API,但不保證同步(StringBuilder 不是線程安全的)。該類被設計用作 StringBuffer 的一個簡易替換,==用在字元串緩衝區被單個線程使用的時候==。如果可能,建議 ...
  • Typora軟體與Markdown語法 Typora軟體的安裝 ​ ==Typora是什麼軟體:== ​ Typora是一款很火的輕量級支持Markdown語法的文本編輯器 ​ ==Typora下載:== ​ mac:https://mac.qdrayst.com/02/Typora_1.1.4_m ...
  • pycharm下載安裝與基本配置 1.簡介 PyCharm是一種Python IDE(Integrated Development Environment,集成開發環境),帶有一整套可以幫助用戶在使用Python語言開發時提高其效率的工具,比如調試、語法高亮、項目管理、代碼跳轉、智能提示、自動完成、 ...
  • 原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,轉載請保留出處。 簡介 最近我觀察到一個現象,當服務的請求量突發的增長一下時,服務的有效QPS會下降很多,有時甚至會降到0,這種現象網上也偶有提到,但少有解釋得清楚的,所以這裡來分享一下問題成因及解決方案。 隊列延遲 目前的Web伺服器, ...
  • CF鏈接:Least Prefix Sum Luogu鏈接:Least Prefix Sum $ {\scr \color {CornflowerBlue}{\text{Solution}}} $ 先來解釋一下題意: 給定一個數組,問最少把多少個數變成相反數,使得$ \forall \cal{i}$ ...
  • Spring管理Bean-IOC 1.Spring配置/管理bean介紹 Bean管理包括兩方面: 創建bean對象 給bean註入屬性 Bean的配置方式: 基於xml文件配置方式 基於註解配置方式 2.基於XML配置bean 2.1通過類型來獲取bean 通過id來獲取bean在Spring基本 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...