現在微服務很流行,很多的語言都有自己的rpc框架,在同一框架內的微服務之間通信很方便,筆者工作時用到的框架是hyperf,自帶jsonrpc、grpc組件,grpc用起來略感繁瑣,調試起來也不方便,因此選用jsonrpc-http,損失些許通信成本在可接受范圍之內,能用postman調試實在是太方便了。
創新互聯憑借專業的設計團隊扎實的技術支持、優質高效的服務意識和豐厚的資源優勢,提供專業的網站策劃、成都網站設計、成都網站建設、網站優化、軟件開發、網站改版等服務,在成都10余年的網站建設設計經驗,為成都上千家中小型企業策劃設計了網站。
隨著業務和團隊的不斷發展,開始有多語言開發需求,我們的另一個項目是用go搭建的,hyperf與go之間也打算用jsonrpc,go自帶jsonrpc包,但是是jsonrpc1.0的,與hyperf不兼容,經過努力,找到一個jsonrpc2.0的包( go-jsonrpc ),與hyperf完美兼容。
近幾年誕生了很多微服務框架,比如JAVA的Spring Cloud、Dubbo;Golang的GoKit和GoMicro以及NodeJs的Seneca。幾乎每種主流語言都有其對應的微服務框架。
Go在微服務框架中有其獨特的優勢,至于優勢在哪,自行google。
1、GoKit框架
這是一個工具包的集合,可以幫助攻城獅構建強大、可靠和可維護的微服務。提供了用于實現系統監控和彈性模式組件的庫,例如日志、跟蹤、限流、熔斷等。
基于這個框架的應用程序架構由三個主要的部分組成:
傳輸層:用于網絡通信,服務通常使用HTTP或者gRPC等網絡傳輸協議,或者使用NATS等發布訂閱系統相互通信。
接口層:是服務器和客戶端的基本構建塊。每個對外提供的接口方法都會定義為一個Endpoint,一遍在服務器和客戶端之間進行網絡通信,每個端點使用傳輸層通過HTTP或gRPC等具體通信模式對外提供服務
服務成:具體的業務邏輯實現
2、GoMicro框架
這是一個基于Go語言實現的插件化RPC微服務框架。提供了服務發現、負載均衡、同步傳輸、異步通信以及事件驅動等機制,嘗試簡化分布式系統之間的通信,讓開發者更專注于自身業務邏輯的開發。
GoMicro的設計哲學是可插拔的架構理念,提供了可快速構建系統的組件,并且可以根據自身的需求對GoMicro提供的默認實現進行定制。所有插件都可在倉庫github.com/micro/go-plugins 中找到。
Kitex為 字節跳動 內部的 Golang 微服務 RPC 框架,具有 高性能 、 強可擴展 的特點,在字節內部已廣泛使用。如果對微服務性能有要求,又希望定制擴展融入自己的治理體系,Kitex 會是一個不錯的選擇。
這次我們可以從 官方示例 中的 easy_note 這個demo 開始分析,因為它基本展示了 Kitex 的基本使用方法。
下面圖例為官方在 demo 中展示的架構圖,通過簡單的分析可得, note , user 通過 注冊中心 (Etcd) 進行注冊 , api 通過 注冊中心 來發現 note , user 兩個 rpc 服務, 并進行業務處理。
從 kitex-examples/hello 這個最簡單示例分析,從 cloudwego/kitex 的快速上手可知,這里用了最簡單的 直鏈 來鏈接 server 和 client。而這次的 easy_note 中使用了 注冊中心 來作為 服務之間的 橋梁 (middleware), 為什么不使用之前的方式而是使用了注冊中心?
我們搜索一下注冊中心的作用,可知: 服務注冊中心的主要作用就是「服務的注冊」和「服務的發現」
我們將服務交給注冊中心管理,雖然可以避免處理復雜的手動管理,我們也許需要還要考慮更多問題,例如:
這次目標之一就是來解析解析服務是如何在服務啟動時進行 注冊 ( Register ) 這個操作的, 這次我們從 easy_note/cmd/user 這個服務開始分析, 因為它是被 注冊 進入 Etcd 的服務之一。
我們從其中的 main.go 開始下手,以下的內容是經過簡化后的文件,是實現配置服務,啟動服務的文件
由注釋可知 WithRegister() 為配置 注冊信息 的函數 ,那為什么直接就看這個函數呢?
一是因為主要配置注冊的主要邏輯在其中,二是因為 With... 的函數結構都是大同小異,十分相似的。
再然后我們進入 kitex/server/option.go ,先看看 di.Push(fmt.Sprintf("WithRegistry(%T)", r)) 這一行,
這個 *util.Slice 是什么 ?進去看看?
進入 kitex/pkg/utils/slice.go , 我發現它很簡短。但是它好眼熟,它好像是一個非常常見的數據結構 —— Stack (棧) !
在這個文件之下有它的 slice__test.go 文件 ,看到這里的朋友可以去試驗一下是否這個 Slice 和我的想法是否一致,大家看文章是要思考的嘛!最好可以動動手!
我們再進入 o.Registry = r 這一行,可以得知 Options 用于初始化 server, Option 用于配置 Options (我覺得這種命名方式很巧妙,我感覺基本達到了 見名知意 的作用),里面東西很多,我們今天只看 Register 部分
到了這里我們可以暫停思考一下,到達這一步是怎么個過程呢?是通過 main.go/user.NewServer() 的方法進來的。
那 NewServer() 的作用是什么?是用于配置初始化服務器的 可選參數 ,
配置完了參數什么時候生效呢 ( Register 是什么時候發生的呢) ?其實配置的實現就在 main.go NewServer() 的下一句, Run() !
進入Run方法的實現,可以得知 register 是發生在 server 啟動成功后 的,停止也是會向 Etcd 進行注銷操作的 (大家可以在同文件的 Stop() 中查看)
至此 服務完成了向 Etcd 的注冊,我忽略了許多其他細節,這些細節也很有意思,希望大家可以自己試著探索
這次文章其實向大家分析了如何配置服務,以及向注冊中心進行注冊的方法和時機。
雖然省略了許多細節,但是通過這篇文章可以學到什么呢?
在 gRPC 里客戶端應用可以像調用本地對象一樣直接調用另一臺不同的機器上服務端 應用的方法,使得您能夠更容易地創建分布式應用和服務。與許多 RPC 系統類似,gRPC 也是基于以下理念:定義一個服務,指定其能夠被遠程調用的方法(包含參數和返回類型)。在服務端實現這個接口,并運行一個 gRPC 服務器來處理客戶端調用。在客戶端擁有一個存根能夠像服務端一樣的方法。
gRPC 客戶端和服務端可以在多種環境中運行和交互 - 從 google 內部的服務器到你自己的筆記本,并且可以用任何 gRPC 支持的語言來編寫。所以,你可以很容易地用 Java 創建一個 gRPC 服務端,用 Go、Python、Ruby 來創建客戶端。此外,Google 最新 API 將有 gRPC 版本的接口,使你很容易地將 Google 的功能集成到你的應用里。
gRPC 默認使用 protocol buffers,這是 Google 開源的一套成熟的結構數據序列化機制(當然也可以使用其他數據格式如 JSON)。名叫 proto3 的新風格的 protocol buffers,它擁有輕量簡化的語法、一些有用的新功能,并且支持更多新語言。當前針對 Java 和 C++ 發布了 beta 版本,針對 JavaNano(即 Android Java)發布 alpha 版本,在protocol buffers Github 源碼庫里有 Ruby 支持, 在golang/protobuf Github 源碼庫里還有針對 Go 語言的生成器, 對更多語言的支持正在開發中。
有了 gRPC, 我們可以一次性的在一個 .proto 文件中定義服務并使用任何支持它的語言去實現客戶端和服務器,反過來,它們可以在各種環境中,從Google的服務器到你自己的平板電腦—— gRPC 幫你解決了不同語言及環境間通信的復雜性.使用 protocol buffers 還能獲得其他好處,包括高效的序列號,簡單的 IDL 以及容易進行接口更新。
現在讓我們來仔細了解一下當 gRPC 客戶端調用 gRPC 服務端的方法時到底發生了什么。我們不究其實現細節,關于實現細節的部分,你可以在我們的特定語言頁面里找到更為詳盡的內容。
首先我們來了解一下最簡單的 RPC 形式:客戶端發出單個請求,獲得單個響應。
服務端流式 RPC 除了在得到客戶端請求信息后發送回一個應答流之外,與我們的簡單例子一樣。在發送完所有應答后,服務端的狀態詳情(狀態碼和可選的狀態信息)和可選的跟蹤元數據被發送回客戶端,以此來完成服務端的工作。客戶端在接收到所有服務端的應答后也完成了工作。
客戶端流式 RPC 也基本與我們的簡單例子一樣,區別在于客戶端通過發送一個請求流給服務端,取代了原先發送的單個請求。服務端通常(但并不必須)會在接收到客戶端所有的請求后發送回一個應答,其中附帶有它的狀態詳情和可選的跟蹤數據。
雙向流式 RPC ,調用由客戶端調用方法來初始化,而服務端則接收到客戶端的元數據,方法名和截止時間。服務端可以選擇發送回它的初始元數據或等待客戶端發送請求。 下一步怎樣發展取決于應用,因為客戶端和服務端能在任意順序上讀寫 - 這些流的操作是完全獨立的。例如服務端可以一直等直到它接收到所有客戶端的消息才寫應答,或者服務端和客戶端可以像"乒乓球"一樣:服務端后得到一個請求就回送一個應答,接著客戶端根據應答來發送另一個請求,以此類推。
通過運行下面的命令克隆并安裝grpc-go代碼庫:
下載protobuf源碼包
安裝golang-protobuf
第一步使用 protocol buffers去定義 gRPC service 和方法 request 以及 response 的類型。
要定義一個服務,必須在.proto 文件中指定 service:
然后在服務中定義 rpc 方法,指定請求的和響應類型,gRPC 允許定義4種類型的 service 方法。
服務.proto文件如下所示:
新聞名稱:go語言rpc框架 go grpc框架
文章來源:http://www.yijiale78.com/article46/dodcohg.html
成都網站建設公司_創新互聯,為您提供虛擬主機、微信小程序、定制開發、網站營銷、建站公司、響應式網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯