欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語(yǔ)言rpc框架 go grpc框架

hyperf與go基于jsonrpc2.0通信

現(xiàn)在微服務(wù)很流行,很多的語(yǔ)言都有自己的rpc框架,在同一框架內(nèi)的微服務(wù)之間通信很方便,筆者工作時(shí)用到的框架是hyperf,自帶jsonrpc、grpc組件,grpc用起來(lái)略感繁瑣,調(diào)試起來(lái)也不方便,因此選用jsonrpc-http,損失些許通信成本在可接受范圍之內(nèi),能用postman調(diào)試實(shí)在是太方便了。

創(chuàng)新互聯(lián)憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、軟件開(kāi)發(fā)、網(wǎng)站改版等服務(wù),在成都10余年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都上千家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。

隨著業(yè)務(wù)和團(tuán)隊(duì)的不斷發(fā)展,開(kāi)始有多語(yǔ)言開(kāi)發(fā)需求,我們的另一個(gè)項(xiàng)目是用go搭建的,hyperf與go之間也打算用jsonrpc,go自帶jsonrpc包,但是是jsonrpc1.0的,與hyperf不兼容,經(jīng)過(guò)努力,找到一個(gè)jsonrpc2.0的包( go-jsonrpc ),與hyperf完美兼容。

Go微服務(wù)--常見(jiàn)的微服務(wù)框架

近幾年誕生了很多微服務(wù)框架,比如JAVA的Spring Cloud、Dubbo;Golang的GoKit和GoMicro以及NodeJs的Seneca。幾乎每種主流語(yǔ)言都有其對(duì)應(yīng)的微服務(wù)框架。

Go在微服務(wù)框架中有其獨(dú)特的優(yōu)勢(shì),至于優(yōu)勢(shì)在哪,自行g(shù)oogle。

1、GoKit框架

這是一個(gè)工具包的集合,可以幫助攻城獅構(gòu)建強(qiáng)大、可靠和可維護(hù)的微服務(wù)。提供了用于實(shí)現(xiàn)系統(tǒng)監(jiān)控和彈性模式組件的庫(kù),例如日志、跟蹤、限流、熔斷等。

基于這個(gè)框架的應(yīng)用程序架構(gòu)由三個(gè)主要的部分組成:

傳輸層:用于網(wǎng)絡(luò)通信,服務(wù)通常使用HTTP或者gRPC等網(wǎng)絡(luò)傳輸協(xié)議,或者使用NATS等發(fā)布訂閱系統(tǒng)相互通信。

接口層:是服務(wù)器和客戶端的基本構(gòu)建塊。每個(gè)對(duì)外提供的接口方法都會(huì)定義為一個(gè)Endpoint,一遍在服務(wù)器和客戶端之間進(jìn)行網(wǎng)絡(luò)通信,每個(gè)端點(diǎn)使用傳輸層通過(guò)HTTP或gRPC等具體通信模式對(duì)外提供服務(wù)

服務(wù)成:具體的業(yè)務(wù)邏輯實(shí)現(xiàn)

2、GoMicro框架

這是一個(gè)基于Go語(yǔ)言實(shí)現(xiàn)的插件化RPC微服務(wù)框架。提供了服務(wù)發(fā)現(xiàn)、負(fù)載均衡、同步傳輸、異步通信以及事件驅(qū)動(dòng)等機(jī)制,嘗試簡(jiǎn)化分布式系統(tǒng)之間的通信,讓開(kāi)發(fā)者更專注于自身業(yè)務(wù)邏輯的開(kāi)發(fā)。

GoMicro的設(shè)計(jì)哲學(xué)是可插拔的架構(gòu)理念,提供了可快速構(gòu)建系統(tǒng)的組件,并且可以根據(jù)自身的需求對(duì)GoMicro提供的默認(rèn)實(shí)現(xiàn)進(jìn)行定制。所有插件都可在倉(cāng)庫(kù)github.com/micro/go-plugins 中找到。

Kitex 源碼解析 —— 將服務(wù)注冊(cè)進(jìn)入注冊(cè)中心的細(xì)節(jié)

Kitex為 字節(jié)跳動(dòng) 內(nèi)部的 Golang 微服務(wù) RPC 框架,具有 高性能 、 強(qiáng)可擴(kuò)展 的特點(diǎn),在字節(jié)內(nèi)部已廣泛使用。如果對(duì)微服務(wù)性能有要求,又希望定制擴(kuò)展融入自己的治理體系,Kitex 會(huì)是一個(gè)不錯(cuò)的選擇。

這次我們可以從 官方示例 中的 easy_note 這個(gè)demo 開(kāi)始分析,因?yàn)樗菊故玖? Kitex 的基本使用方法。

下面圖例為官方在 demo 中展示的架構(gòu)圖,通過(guò)簡(jiǎn)單的分析可得, note , user 通過(guò) 注冊(cè)中心 (Etcd) 進(jìn)行注冊(cè) , api 通過(guò) 注冊(cè)中心 來(lái)發(fā)現(xiàn) note , user 兩個(gè) rpc 服務(wù), 并進(jìn)行業(yè)務(wù)處理。

從 kitex-examples/hello 這個(gè)最簡(jiǎn)單示例分析,從 cloudwego/kitex 的快速上手可知,這里用了最簡(jiǎn)單的 直鏈 來(lái)鏈接 server 和 client。而這次的 easy_note 中使用了 注冊(cè)中心 來(lái)作為 服務(wù)之間的 橋梁 (middleware), 為什么不使用之前的方式而是使用了注冊(cè)中心?

我們搜索一下注冊(cè)中心的作用,可知: 服務(wù)注冊(cè)中心的主要作用就是「服務(wù)的注冊(cè)」和「服務(wù)的發(fā)現(xiàn)」

我們將服務(wù)交給注冊(cè)中心管理,雖然可以避免處理復(fù)雜的手動(dòng)管理,我們也許需要還要考慮更多問(wèn)題,例如:

這次目標(biāo)之一就是來(lái)解析解析服務(wù)是如何在服務(wù)啟動(dòng)時(shí)進(jìn)行 注冊(cè) ( Register ) 這個(gè)操作的, 這次我們從 easy_note/cmd/user 這個(gè)服務(wù)開(kāi)始分析, 因?yàn)樗潜? 注冊(cè) 進(jìn)入 Etcd 的服務(wù)之一。

我們從其中的 main.go 開(kāi)始下手,以下的內(nèi)容是經(jīng)過(guò)簡(jiǎn)化后的文件,是實(shí)現(xiàn)配置服務(wù),啟動(dòng)服務(wù)的文件

由注釋可知 WithRegister() 為配置 注冊(cè)信息 的函數(shù) ,那為什么直接就看這個(gè)函數(shù)呢?

一是因?yàn)橹饕渲米?cè)的主要邏輯在其中,二是因?yàn)? With... 的函數(shù)結(jié)構(gòu)都是大同小異,十分相似的。

再然后我們進(jìn)入 kitex/server/option.go ,先看看 di.Push(fmt.Sprintf("WithRegistry(%T)", r)) 這一行,

這個(gè) *util.Slice 是什么 ?進(jìn)去看看?

進(jìn)入 kitex/pkg/utils/slice.go , 我發(fā)現(xiàn)它很簡(jiǎn)短。但是它好眼熟,它好像是一個(gè)非常常見(jiàn)的數(shù)據(jù)結(jié)構(gòu) —— Stack (棧) !

在這個(gè)文件之下有它的 slice__test.go 文件 ,看到這里的朋友可以去試驗(yàn)一下是否這個(gè) Slice 和我的想法是否一致,大家看文章是要思考的嘛!最好可以動(dòng)動(dòng)手!

我們?cè)龠M(jìn)入 o.Registry = r 這一行,可以得知 Options 用于初始化 server, Option 用于配置 Options (我覺(jué)得這種命名方式很巧妙,我感覺(jué)基本達(dá)到了 見(jiàn)名知意 的作用),里面東西很多,我們今天只看 Register 部分

到了這里我們可以暫停思考一下,到達(dá)這一步是怎么個(gè)過(guò)程呢?是通過(guò) main.go/user.NewServer() 的方法進(jìn)來(lái)的。

那 NewServer() 的作用是什么?是用于配置初始化服務(wù)器的 可選參數(shù) ,

配置完了參數(shù)什么時(shí)候生效呢 ( Register 是什么時(shí)候發(fā)生的呢) ?其實(shí)配置的實(shí)現(xiàn)就在 main.go NewServer() 的下一句, Run() !

進(jìn)入Run方法的實(shí)現(xiàn),可以得知 register 是發(fā)生在 server 啟動(dòng)成功后 的,停止也是會(huì)向 Etcd 進(jìn)行注銷操作的 (大家可以在同文件的 Stop() 中查看)

至此 服務(wù)完成了向 Etcd 的注冊(cè),我忽略了許多其他細(xì)節(jié),這些細(xì)節(jié)也很有意思,希望大家可以自己試著探索

這次文章其實(shí)向大家分析了如何配置服務(wù),以及向注冊(cè)中心進(jìn)行注冊(cè)的方法和時(shí)機(jī)。

雖然省略了許多細(xì)節(jié),但是通過(guò)這篇文章可以學(xué)到什么呢?

GoLang -- gRPC框架四大服務(wù)

在 gRPC 里客戶端應(yīng)用可以像調(diào)用本地對(duì)象一樣直接調(diào)用另一臺(tái)不同的機(jī)器上服務(wù)端 應(yīng)用的方法,使得您能夠更容易地創(chuàng)建分布式應(yīng)用和服務(wù)。與許多 RPC 系統(tǒng)類似,gRPC 也是基于以下理念:定義一個(gè)服務(wù),指定其能夠被遠(yuǎn)程調(diào)用的方法(包含參數(shù)和返回類型)。在服務(wù)端實(shí)現(xiàn)這個(gè)接口,并運(yùn)行一個(gè) gRPC 服務(wù)器來(lái)處理客戶端調(diào)用。在客戶端擁有一個(gè)存根能夠像服務(wù)端一樣的方法。

gRPC 客戶端和服務(wù)端可以在多種環(huán)境中運(yùn)行和交互 - 從 google 內(nèi)部的服務(wù)器到你自己的筆記本,并且可以用任何 gRPC 支持的語(yǔ)言來(lái)編寫(xiě)。所以,你可以很容易地用 Java 創(chuàng)建一個(gè) gRPC 服務(wù)端,用 Go、Python、Ruby 來(lái)創(chuàng)建客戶端。此外,Google 最新 API 將有 gRPC 版本的接口,使你很容易地將 Google 的功能集成到你的應(yīng)用里。

gRPC 默認(rèn)使用 protocol buffers,這是 Google 開(kāi)源的一套成熟的結(jié)構(gòu)數(shù)據(jù)序列化機(jī)制(當(dāng)然也可以使用其他數(shù)據(jù)格式如 JSON)。名叫 proto3 的新風(fēng)格的 protocol buffers,它擁有輕量簡(jiǎn)化的語(yǔ)法、一些有用的新功能,并且支持更多新語(yǔ)言。當(dāng)前針對(duì) Java 和 C++ 發(fā)布了 beta 版本,針對(duì) JavaNano(即 Android Java)發(fā)布 alpha 版本,在protocol buffers Github 源碼庫(kù)里有 Ruby 支持, 在golang/protobuf Github 源碼庫(kù)里還有針對(duì) Go 語(yǔ)言的生成器, 對(duì)更多語(yǔ)言的支持正在開(kāi)發(fā)中。

有了 gRPC, 我們可以一次性的在一個(gè) .proto 文件中定義服務(wù)并使用任何支持它的語(yǔ)言去實(shí)現(xiàn)客戶端和服務(wù)器,反過(guò)來(lái),它們可以在各種環(huán)境中,從Google的服務(wù)器到你自己的平板電腦—— gRPC 幫你解決了不同語(yǔ)言及環(huán)境間通信的復(fù)雜性.使用 protocol buffers 還能獲得其他好處,包括高效的序列號(hào),簡(jiǎn)單的 IDL 以及容易進(jìn)行接口更新。

現(xiàn)在讓我們來(lái)仔細(xì)了解一下當(dāng) gRPC 客戶端調(diào)用 gRPC 服務(wù)端的方法時(shí)到底發(fā)生了什么。我們不究其實(shí)現(xiàn)細(xì)節(jié),關(guān)于實(shí)現(xiàn)細(xì)節(jié)的部分,你可以在我們的特定語(yǔ)言頁(yè)面里找到更為詳盡的內(nèi)容。

首先我們來(lái)了解一下最簡(jiǎn)單的 RPC 形式:客戶端發(fā)出單個(gè)請(qǐng)求,獲得單個(gè)響應(yīng)。

服務(wù)端流式 RPC 除了在得到客戶端請(qǐng)求信息后發(fā)送回一個(gè)應(yīng)答流之外,與我們的簡(jiǎn)單例子一樣。在發(fā)送完所有應(yīng)答后,服務(wù)端的狀態(tài)詳情(狀態(tài)碼和可選的狀態(tài)信息)和可選的跟蹤元數(shù)據(jù)被發(fā)送回客戶端,以此來(lái)完成服務(wù)端的工作。客戶端在接收到所有服務(wù)端的應(yīng)答后也完成了工作。

客戶端流式 RPC 也基本與我們的簡(jiǎn)單例子一樣,區(qū)別在于客戶端通過(guò)發(fā)送一個(gè)請(qǐng)求流給服務(wù)端,取代了原先發(fā)送的單個(gè)請(qǐng)求。服務(wù)端通常(但并不必須)會(huì)在接收到客戶端所有的請(qǐng)求后發(fā)送回一個(gè)應(yīng)答,其中附帶有它的狀態(tài)詳情和可選的跟蹤數(shù)據(jù)。

雙向流式 RPC ,調(diào)用由客戶端調(diào)用方法來(lái)初始化,而服務(wù)端則接收到客戶端的元數(shù)據(jù),方法名和截止時(shí)間。服務(wù)端可以選擇發(fā)送回它的初始元數(shù)據(jù)或等待客戶端發(fā)送請(qǐng)求。 下一步怎樣發(fā)展取決于應(yīng)用,因?yàn)榭蛻舳撕头?wù)端能在任意順序上讀寫(xiě) - 這些流的操作是完全獨(dú)立的。例如服務(wù)端可以一直等直到它接收到所有客戶端的消息才寫(xiě)應(yīng)答,或者服務(wù)端和客戶端可以像"乒乓球"一樣:服務(wù)端后得到一個(gè)請(qǐng)求就回送一個(gè)應(yīng)答,接著客戶端根據(jù)應(yīng)答來(lái)發(fā)送另一個(gè)請(qǐng)求,以此類推。

通過(guò)運(yùn)行下面的命令克隆并安裝grpc-go代碼庫(kù):

下載protobuf源碼包

安裝golang-protobuf

第一步使用 protocol buffers去定義 gRPC service 和方法 request 以及 response 的類型。

要定義一個(gè)服務(wù),必須在.proto 文件中指定 service:

然后在服務(wù)中定義 rpc 方法,指定請(qǐng)求的和響應(yīng)類型,gRPC 允許定義4種類型的 service 方法。

服務(wù).proto文件如下所示:

新聞名稱:go語(yǔ)言rpc框架 go grpc框架
文章來(lái)源:http://chinadenli.net/article46/dodcohg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、微信小程序定制開(kāi)發(fā)、網(wǎng)站營(yíng)銷、建站公司、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)