老王學習go語言——2.1 Go Kit和Go Micro

2020-09-15 走到哪算哪

《Go語言高並發與微服務實戰》

讓開發者專注於自身業務邏輯的開發 這句話放在開篇,幾乎每個技術框架都聲稱自己可以做到這一點,以下的兩個框架也不例外。

書中雖然介紹了這兩個框架,但比較簡單。打算綜合其他社區和官網的內容,把這部分內容豐富一下,相信以後用的到。

Go Kit

Go-kit(gokit.io)是Go語言工具包的集合,可幫助工程師構建強大,可靠和可維護的微服務。Go-kit提供了用於實現系統監控和彈性模式組件的庫,例如日誌記錄、跟蹤、限流和熔斷等,這些庫協助工程師提高微服務架構的性能和穩定性

為了求甚解,建議大家可以直接去官網進行了解


https://gokit.io/


就喜歡這種風格的網站,一目了然,重點突出。

Go Kit並沒有強調自己是個FrameWork,而是「A tookit」,輕量級,讓你能夠把經歷聚焦在業務邏輯上。簡單明了。

而為什麼是Go Kit,官方給出的解釋:Go 是一種很棒的通用語言,但微服務需要一定量的專門支持。RPC 安全性、系統可觀察性、基礎結構集成、甚至程序設計 – Go kit填補了標準庫留下的空白,使 Go 成為在任何組織中編寫微服務的一流語言。用現在流行的詞來講,這個tookit是以賦能Go為使命的。這樣說起來好像「高大上」了許多。

網站簡潔到幾乎沒有一句多餘的廢話,我是誰,為什麼是我,例子,原始碼就這些,我還真喜歡這種風格。所以要分享點兒東西,我又沒有心思在這個時候直接進入編程示例,於是只能先去Github,看看readme和程序結構了。

Motivation

Go已經逐漸成為伺服器語言,但它在Facebook、Twitter、Netflix和 SoundCloud等所謂的&34;公司中仍然不足。許多這些組織都轉向基於 JVM 的技術棧來處理其業務邏輯,這主要由於直接支持其微服務體系結構的庫和生態系統。

為了取得更大的成功,Go 不僅僅要是一種程序設計語言,。它需要一個全面的工具包,用於大的分布式編程。Go kit是一組包和最佳實踐,為任何規模的組織提供全面、可靠且可信賴的構建微服務的方法。


目標

在異構 SOA 中運行 – 期望與大多數非 Go-kit 服務進行交互

RPC 作為主要消息傳遞模式

可插拔的序列化和傳輸 – 不只是 JSON 通過 HTTP

在現有基礎設施中運行 – 沒有特定工具或技術的授權


非目標

支持 RPC 以外的消息傳遞模式(目前)– 例如 MPI、酒吧/子、CQRS 等。

通過調整現有軟體來重新實現功能

對運營問題有意見:部署、配置、流程監督、編排等。

關於程序結構和其他一些介紹,可以請移步到。

https://gokit.io/faq/#introduction-mdash-understanding-go-kit-key-concepts

這裡只挑重點列一下:

1.go-Kit不是MVC框架,基礎結構是transport, EndPoint,Service,請求首先進入transport,然後是Endpoint,最後由Service來處理。響應則走相反的路徑。transport,是進行服務轉換的,可以在單一服務中同時支持多種訪問方式比如http,aRPC,transport也是為了在業務邏輯和響應方式上進行解耦和統一處理。而EndPoint很像MVC中的Controller,在這裡調用實際的Service,Service就很好理解了。


Requests enter the service at layer 1, flow down to layer 3, and responses take the reverse course.

Go-Kit分層 最上面transport,中間EndPoint,最下面Service

將所有這些概念放在一起,我們可以看到 Go kit 微服務的模型像洋蔥一樣,具有許多層。這些圖層可以分組到我們的三個域中。最內層的服務域是一切基於您的特定服務定義,以及實現所有業務邏輯的地方。中間Endpoint是將服務的每個方法抽象到通用Endpoint域。。最後,最外層的傳輸域是端點綁定到具體傳輸(如 HTTP 或 gRPC)的地方。

通過定義服務接口並提供具體實現,實現核心業務邏輯。然後,編寫服務中間件以提供其他功能,如日誌記錄、分析、檢測等,即任何需要了解業務領域的信息。

Go 套件提供端點和傳輸域中間件,用於速率限制、電路中斷、負載平衡和分布式跟蹤等功能,所有這些功能通常與您的業務領域無關。

好吧,Go-Kit先介紹到這裡吧,後續具體實現微服務的時候,再分析學習搭建開發環境,say helloworld的方法。


Go Micro

Go Micro是一個插件化的基礎框架,基於此可以構建微服務。Micro的設計哲學是『可插拔』的插件化架構。在架構之外,它默認實現了consul作為服務發現,通過http進行通信,通過protobuf和json進行編解碼。

這裡是每個技術框架共同的追求:讓開發者專注於自身業務邏輯的開發

go-micro的主要功能

  • 服務發現:自動服務註冊和名稱解析。服務發現是微服務開發的核心。當服務A需要與服務B通話時,它需要該服務的位置。默認發現機制是多播DNS(mdns),一種零配置系統。您可以選擇使用SWIM協議為p2p網絡設置八卦,或者為彈性雲原生設置設置consul
  • 負載均衡:基於服務發現構建的客戶端負載均衡。一旦我們獲得了服務的任意數量實例的地址,我們現在需要一種方法來決定要路由到哪個節點。我們使用隨機散列負載均衡來提供跨服務的均勻分布,並在出現問題時重試不同的節點
  • 消息編碼:基於內容類型的動態消息編碼。客戶端和伺服器將使用編解碼器和內容類型為您無縫編碼和解碼Go類型。可以編碼任何種類的消息並從不同的客戶端發送。客戶端和伺服器默認處理此問題。這包括默認的protobuf和json
  • 請求/響應:基於RPC的請求/響應,支持雙向流。我們提供了同步通信的抽象。對服務的請求將自動解決,負載平衡,撥號和流式傳輸。啟用tls時,默認傳輸為http / 1.1或http2
  • Async Messaging:PubSub是異步通信和事件驅動架構的一流公民。事件通知是微服務開發的核心模式。啟用tls時,默認消息傳遞是點對點http / 1.1或http2
  • 可插拔接口:Go Micro為每個分布式系統抽象使用Go接口,因此,這些接口是可插拔的,並允許Go Micro與運行時無關,可以插入任何基礎技術
  • go-micro之所以可以高度訂製和他的框架結構是分不開的,go-micro由8個關鍵的interface組成,每一個interface都可以根據自己的需求重新實現,這8個主要的inteface也構成了go-micro的框架結構

圖片來源於網絡

  • Server監聽客戶端的調用,和Brocker推送過來的信息進行處理。並且Server端需要向Register註冊自己的存在或消亡,這樣Client才能知道自己的狀態
  • Register服務的註冊的發現,Client端從Register中得到Server的信息,然後每次調用都根據算法選擇一個的Server進行通信,當然通信是要經過編碼/解碼,選擇傳輸協議等一系列過程的
  • 如果有需要通知所有的Server端可以使用Brocker進行信息的推送,Brocker 信息隊列進行信息的接收和發布。


Go -kit 於Go Mirco區別: Go-Kit為多數業務場景下實施微服務軟體架構提供指導和解決方案。

而Go Micro則是一個面向微服務的可插拔RPC框架,他是只在特殊細分領域上努力的框架。他嘗試簡化分布式系統之間的通信。


微服務設計的六大原則:


1.高內聚,低耦合

緊密關聯的事務應該放在一起,每個服務針對一個單一職責的業務能力封裝。服務間通過輕量級的通訊方式進行通信,服務間相對獨立。低耦合。

2.高度自治

1)服務獨立部署運行和擴展。而提使得代碼組織,發布節奏,快速交付和快速應對變化等有各大的靈活性。

2)獨立開發和演進。服務和服務之間採取語言無關的網絡通信進行交互。不受遺留系統技術棧的約束。

3)獨立的團隊。工作在獨立的上下文中

3.以業務為中心

每個服務代表了特定的業務邏輯,有明顯的邊界上下文。

4.彈性設計

容錯設計,防止級聯的服務雪崩。

5.日誌與監控

微服務架構天生在定位錯誤和進行追蹤的過程中相對繁瑣,所以對於日誌和監控的能力要求也就交到。結構化的日誌和服務依賴關心,方便快速發現問題及時修復。

6.自動化

微服務架構的複雜性,要求運維及管理能夠實現自動化,要不然服務和節點大到一定程度,維護和管理工作將具有非常大的難度。


領域驅動設計(DDD Domain Drive Design)


DDD不是語言,不是框架,也不是架構,而是一種思想,一種方法論,主要用於合理地劃分業務系統以及保持業務架構和系統架構的一致性這兩個領域。

DDD其實2003年就出現了,但是由於自身的問題,導致一直不溫不火,而這次被提起,就是借著微服務的東風。因為DDD的界限上下文可以很好的判定微服務劃分的粒度。

而無論是微服務還是SOA一直在服務劃分粒度上沒有統一標準,更多的憑團隊經驗,劃分打了不符合服務化的初衷,充分發揮架構的優勢,而劃分的過於小,無端增加複雜度,還使得系統過於凌亂,增大管理成本。

但DDD理解起來容易,實際落地到真正實踐中卻仍然十分困難。

DDD中根據問題域,將問題劃分為領域/子域,通用語言,限界上下文和架構風格等概念


大家只要記住DDD可以被用來指導進行微服務粒度的劃分,但DDD其實也有很大的工程量,個人並不知道是先跟著感覺走,遇到問題再調整力度是最合適的實踐方法論,還是先學習DDD,然後投入很多的經歷試圖找出最合適的劃分方法。見仁見智吧,但是DDD並不影響我們學習Go,先放一放吧。關於DDD就不發散了。


把上下文相關的和不相關的總算結束了。明天正式進入Go語言本身。


最後還是抽出一個題來擴展一下,那就是RPC,dubbo是RPC框架,Go Micro也是RPC,那麼RPC是什麼呢

RPC(Remote Procedure Call)遠程過程調用


進程間通信(IPC)是在多任務作業系統或聯網的計算機之間運行的程序和進程所用的通信技術。有兩種類型的進程間通信(IPC)。

本地過程調用(LPC)LPC用在多任務作業系統中,使得同時運行的任務能互相會話。這些任務共享內存空間使任務同步和互相發送信息。RPC調用的模型遠程過程調用(RPC)RPC類似於LPC,只是在網上工作。RPC開始是出現在Sun微系統公司和HP公司的運行UNⅨ作業系統的計算機中。

RPC的概念與技術早在1981年由Nelson提出。1984年,Birrell和Nelson把其用於支持異構型分布式系統間的通訊。Birrell的RPC 模型引入存根進程( stub) 作為遠程的本地代理,調用RPC運行時庫來傳輸網絡中的調用。Stub和RPC runtime屏蔽了網絡調用所涉及的許多細節,特別是,參數的編碼/解碼及網絡通訊是由stub和RPC runtime完成的,因此這一模式被各類RPC所採用。由於分布式系統的異構性及分布式計算模式與計算任務的多樣性,RPC作為網絡通訊與委託計算的實現機制,在方法、協議、語義、實現上不斷發展,種類繁多,其中SUN公司和開放軟體基金會在其分布式產品中所建立和實用的RPC較為典型。 [1]

在SUN公司的網絡文件系統NFS及開放網絡計算環境ONC中,RPC是基本實現技術。OSF醞釀和發展的另一個重要的分布式計算軟體環境DCE也是基於RPC的。在這兩個系統中,RPC既是其自身的實現機制,又是提供給用戶設計分布式應用程式的高級工具。由於對分布式計算的廣泛需求,ONC和DCE成為Client/Server模式分布式計算環境的主流產品,而RPC也成為實現分布式計算的事實標準之一。


以上內容是不是特別清楚,他來源於百科百科,囧。


RPC 是一種技術思想而非一種規範或協議,常見 RPC 技術和框架有:

應用級的服務框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。

遠程通信協議:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。

通信框架:MINA 和 Netty。

目前流行的開源 RPC 框架還是比較多的,有阿里巴巴的 Dubbo、Facebook 的 Thrift、Google 的 gRPC、Twitter 的 Finagle 等。

下面重點介紹三種:

gRPC:是 Google 公布的開源軟體,基於***的 HTTP 2.0 協議,並支持常見的眾多程式語言。RPC 框架是基於 HTTP 協議實現的,底層使用到了 Netty 框架的支持。

Thrift:是 Facebook 的開源 RPC 框架,主要是一個跨語言的服務開發框架。

用戶只要在其之上進行二次開發就行,應用對於底層的 RPC 通訊等都是透明的。不過這個對於用戶來說需要學習特定領域語言這個特性,還是有一定成本的。

Dubbo:是阿里集團開源的一個極為出名的 RPC 框架,在很多網際網路公司和企業應用中廣泛使用。協議和序列化框架都可以插拔是極其鮮明的特色。


在一個典型 RPC 的使用場景中,包含了服務發現、負載、容錯、網絡傳輸、序列化等組件,其中「RPC 協議」就指明了程序如何進行網絡傳輸和序列化。

RPC 的核心功能是指實現一個 RPC 最重要的功能模塊,就是上圖中的」RPC 協議」部分

一個 RPC 的核心功能主要有 5 個部分組成,分別是:客戶端、客戶端 Stub、網絡傳輸模塊、服務端 Stub、服務端等。

圖 4:RPC 核心功能圖

下面分別介紹核心 RPC 框架的重要組成:

  • 客戶端(Client):服務調用方。
  • 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數數據信息打包成網絡消息,再通過網絡傳輸發送給服務端。
  • 服務端存根(Server Stub):接收客戶端發送過來的請求消息並進行解包,然後再調用本地服務進行處理。
  • 服務端(Server):服務的真正提供者。
  • Network Service:底層傳輸,可以是 TCP 或 HTTP。

一次 RPC 調用流程如下:

  • 服務消費者(Client 客戶端)通過本地調用的方式調用服務。
  • 客戶端存根(Client Stub)接收到調用請求後負責將方法、入參等信息序列化(組裝)成能夠進行網絡傳輸的消息體。
  • 客戶端存根(Client Stub)找到遠程的服務地址,並且將消息通過網絡發送給服務端。
  • 服務端存根(Server Stub)收到消息後進行解碼(反序列化操作)。
  • 服務端存根(Server Stub)根據解碼結果調用本地的服務進行相關處理
  • 服務端(Server)本地服務業務處理。
  • 處理結果返回給服務端存根(Server Stub)。
  • 服務端存根(Server Stub)序列化結果。
  • 服務端存根(Server Stub)將結果通過網絡發送至消費方。
  • 客戶端存根(Client Stub)接收到消息,並進行解碼(反序列化)。
  • 服務消費方得到最終結果。

懶得一個字一個字的打了,內容來源於網絡,說的比我清楚,我就不用重複勞動了,介紹了RPC的主流框架和技術。我們說的比較多的是dubbo,gRPC.

相關焦點

  • 老王學習go語言——3.Go語言基礎 -第一個go程序
    接著,Go用自己的優勢,又孵化了Docker,Kubernetes和Etcd等現在縱橫江湖的開源項目。一段生平介紹完,不能免俗還得先安裝個環境,輸出個helloWorld,因為本文不是教人安環境的教程。而且這個未免太基礎,不適合在這麼「...」的文章裡講。請各位自行學習吧。
  • go微服務框架go-micro深度學習(三)Registry服務的註冊和發現
    go-micro框架的服務發現有自己能用的接口Registry。只要實現這個接口就可以定製自己的服務註冊和發現。go-micro在客戶端做的負載,典型的Balancing-aware Client模式。服務端把服務的地址信息保存到Registry, 然後定時的心跳檢查,或者定時的重新註冊服務。
  • Go-Micro微服務入門(二):創建一個go-micro項目
    Go 1.11 Modules 官方說明文檔(https://github.com/golang/go/wiki/Modules)Protobuf3文檔(https://developers.google.cn/protocol-buffers/docs/proto3)micro中文文檔(https://micro.mu/docs/cn/index.html
  • 老王學習go語言——2.1 微服務
    慣例還是把書名放在前面《go語言高並發與微服務實戰》 朱榮鑫 黃迪璇 張天這一章最主要還是普及微服務的知識,介紹SpringCloud和Dubbo以及基於Go語言實現的Go kit 和Go Micro,最後有一部分是DDD(領域驅動開發)和微服務設計原則的相關內容。
  • 老王學習go語言-- 1. 語言認知--解讀序言
    以示尊重,書名放最上面《go語言高並發與微服務實戰》本來以為隨便翻翻就能寫出點兒見解來,無非是語言,解決特點環境的特定問題。帶著這種先入為主的看法,因為要分享學習過程,所以算的上精讀了,看書從來都是拿來主義,從來不看作者,從來不看序言的我,很反常閱讀了續言。
  • 老王學習go語言——3.go語言基礎語法和關鍵字 gdb調試
    慣例書名放在最上面《go語言高並發與微服務實戰》開始基礎語法和關鍵字之前,上一篇遺留了幾個問題:go語言debug之Gdb Version,之前沒用過C++和C,所以對於Gdb不是很熟悉,也不想特別麻煩去搞,於是想偷個懶,利用網上的方法,去下載liteidex,準備利用裡面的gdb64.exe,但下載了最新版,裡面沒有gdb的可執行文件。
  • 2019 Go 開發者路線圖,請收下這份指南!
    作為熱門的程式語言之一,Go語言吸引了很多關注。根據TIOBE編程排行榜,2016年,Go語言成為年度最受歡迎的程式語言;2019年,Go語言的熱度不減,仍穩居排行榜前20名。在基於雲的服務中,Go語言因其在編譯速度和執行性能上的優越性,具有其他程式語言無法比擬的優勢。隨著雲計算的迅速發展,更多基於Go語言的項目正在不斷湧現。
  • Go-Micro 集成 Nacos 實戰之服務註冊與發現
    作者 | 張斌斌背景知識:Go-MicroGo Micro 是一個基於 Go 語言編寫的、用於構建微服務的基礎框架,提供了分布式開發所需的核心組件,包括 RPC 和事件驅動通信等。它提供了用於服務發現,客戶端負載平衡,編碼,同步和異步通信庫。go-micro 是一個獨立的庫,可以獨立於其他工具包使用。
  • 「Go 語言教程」 Go語言結構
    Go 語言教程學習一門程式語言,除了學習語法,詞法,以及寫法等和編譯器有關的特性(就是什麼是語法錯誤)之外,需要對這個語言的結構有個清晰的認識,其中包括代碼目錄結構,源碼文件,以及代碼結構組織等。1 目錄和源碼首先我門看目錄和源碼,從之前的Go 語言教程我們知道,Go語言有工程目錄,和GOPATH環境變量對應,工程目錄結構有bin 存放編譯後的可執行文件src 存放實現源碼,go get工具獲取的web上的模塊包都會放到這個目錄下,並有對應的目錄結構pkg 存放編譯後的庫文件(分不同平臺)Go語言的源碼文件格式為.go格式。
  • Go語言開發環境:Goland安裝
    一、下載安裝開發環境golandgo語言sdk(go的標準庫)安裝sdk的時候,注意安裝的位置,後面要用到,我這裡安裝到了C盤,目錄為: C:\Go二、配置環境GOROOT在goland中配置sdk:software development kit(軟體開發工具包)三、創建工程目錄創建一個工程目錄,我這裡為: C:\goworkstation,這個目錄會作為環境變量GOPATH的值(馬上講到),同時創建下面三個子目錄
  • Mix PHP V2.2 發布,與 go-micro 深度集成的 PHP 微服務開發框架
    *: 基於 Swoole 的常駐內存型 PHP 高性能框架 V2.0: 基於 Swoole 的 FastCGI、常駐內存、協程三模 PHP 高性能框架 V2.1: 基於 Swoole 4.4+ 單線程協程 PHP 框架 V2.2: 基於 Swoole 4.4+ 單線程協程 PHP 微服務框架 🆕微服務開發
  • Mix PHP V2.2 發布,與 go-micro 深度集成的 PHP 微服務開發框架...
    的常駐內存型 PHP 高性能框架 V2.0: 基於 Swoole 的 FastCGI、常駐內存、協程三模 PHP 高性能框架 V2.1: 基於 Swoole 4.4+ 單線程協程 PHP 框架 V2.2: 基於 Swoole 4.4+ 單線程協程 PHP 微服務框架 🆕微服務開發本次版本更新主要是增加微服務開發相關的組件與開發骨架,從上一次 Mix V2.1 非常激進的切換為單線程協程後
  • Go-Micro微服務入門(一):環境搭建
    安裝GO(golang)下載go安裝包:wget https://studygolang.com/dl/golang/go1.13.3.linux-amd64.tar.gz解壓安裝包到/usr/local目錄:tar -C /usr/local -zxvf go1.13.3.linux-amd64.tar.gz
  • [Go 語言教程] Go 語言簡介
    Go 語言教程1 Go 語言介紹Go 即Golang,是Google公司2009年11月正式對外公開的一門程式語言。Go是靜態強類型語言,是區別於解析型語言的編譯型語言。2 Go語言特性跨平臺的編譯型語言語法接近C語言管道(channel),切片(slice),並發(routine)有垃圾回收的機制支持面向對象和面向過程的編程模式3 Go 語言特色編程模式比較簡單,沒有複雜的設計模式全部源碼編譯到一個文件,編譯速度很快最新版本也有動態庫形式
  • 「Go 語言教程」Go語言函數說明
    函數設計也有很多方法和規定,以及設計原則。那麼go語言的函數都是怎麼樣子的,都有些什麼原則和要求呢,那麼怎麼做好函數方法設計呢,就讓我們一起來學習學習。1 入口函數作為編譯型的程式語言,go語言和其他流行的語言(C/C++, JAVA等)都有程序入口,就是所謂的入口函數main。go語言程序作為一個可執行程序需要至少有一個且僅為一個main方法。
  • 老王學習go語言-- 1.go語言的發展和淵源
    慣例還是把書名放在最前面《go語言高並發與微服務實戰》扭捏了半天,還是進入了正文部分,往往書的第一章總是要去回答幾個傳統問題,我是誰,從哪裡來,到哪裡去。而本書作者秉持著對血緣宗親的敬畏,先介紹了go語言的叔叔大爺,以及所處的時代,好吧,好飯不拍晚,這就像相親,咱們有點兒耐心,先了解了解雲原生和微服務。
  • Go 語言打包靜態文件和與Gin一起使用Go-bindata
    二、使用步驟1. 安裝2. 使用3. 讀取文件三、和 Gin 一起使用1. 使用 go-bindata-assetfs 進行打包2. 安裝 go-bindata-assetfs3. 打包文件4.日常開發總結題外參考前言前幾天,開始學習用 Go 語言開發一個內部項目來幫助解決測試環境中的一些不便利的問題。
  • go語言學習總結(四十七)Go Interface 源碼剖析
    在上一篇文章 《深入理解 Go Interface》中從設計和使用的角度介紹了 Golang 的 interface,作為補充,這篇文章將從源碼級別來看看 interface 的具體實現。所有源碼分析都是基於 Go 1.8.3。在開始之前,我們先看一個例子。
  • go語言學習總結(五十)Uber Go 語言編程規範
    相信很多人前兩天都看到 Uber 在 github 上面開源的 Go 語言編程規範了,原文在這裡:https://github.com/uber-go/guide/blob/master/style.md 。我們今天就來簡單了解一下國外大廠都是如何來寫代碼的。行文倉促,錯誤之處,多多指正。另外如果覺得還不錯,也歡迎分享給更多的人。1.
  • GO語言入門
    一、GO基礎1. GOPATH2.GO 命令源碼文件1)命令源碼文件定義:命令源碼文件是程序的運行入口,如果一個源碼文件聲明屬於main包,並且包含一個無參數聲明的main函數,那麼它就是命令源碼文件2)命令源碼文件接收參數的包:GO語言標準庫中有一個代碼包flag專門用於接收和解析程序參數A. flag.StringVar()flag.StringVar