go micro 框架初探

2021-09-13 02:24:57 字數 4044 閱讀 5222

得益於go語言的編譯快效能高特點,在雲原生時代其作為服務端程式語言發展迅速,尤其是微服務領域,已逐漸形成乙個良好的生態,基於golang的微服務框架如今有很多,如go-kit、go-micro、kite、gizmo等,每一種都自有其優點。今天就來探一探go-micro框架。
go-micro是基於go語言實現的外掛程式化rpc微服務框架,與go-kit,kite等微服務框架相比,它具有易上手、部署簡單、工具外掛程式化等優點。

go-micro框架提供了服務發現、負載均衡、同步傳輸、非同步通訊以及事件驅動等機制,它嘗試去簡化分布式系統間的通訊,讓我們可以專注於自身業務邏輯的開發。所以對於新手而言,go-micro是個不錯的微服務實踐的開始。

下圖為官方部落格提供的go-micro架構圖:

go-micro是元件化的框架,每乙個基礎功能都是乙個inte***ce,方便擴充套件。同時,元件又是分層的,上層基於下層功能向上提供服務,整體構成go-micro框架。

go-micro的元件包括:

selector元件:構建在registry之上的客戶端智慧型負載均衡元件,用於client元件對registry返回的服務進行智慧型選擇。

broker元件:發布/訂閱元件,服務之間基於訊息中介軟體的非同步通訊方式,預設使用http方式,線上通常使用訊息中介軟體,如kafka、rabbitmq等。

transport元件:服務之間同步通訊方式。

codec元件:服務之間訊息的編碼/解碼。

server元件:服務主體,該元件基於上面的registry/selector/transport/broker元件,對外提供乙個統一的服務請求入口。

client元件:提供訪問微服務的客戶端。類似server元件,它也是通過registry/selector/transport/broker元件實現查詢服務、負載均衡、同步通訊、非同步訊息等功能。

所有以上元件功能共同構成乙個go-micro微服務。

兩個微服務之間的通訊是基於c/s模型,即服務發請求方充當client,服務接收方充當server。

其通訊過程大致如下圖:

上圖大致描繪了go-micro服務內各元件的職責與互動。

紙上得來終覺淺,下面就來搭建環境,實現乙個簡單的基於go-micro的微服務。

為簡單起見,client與server之間我們使用點對點的同步方式(transport),即無需訊息中介軟體(broker),註冊中心採用consul系統。

服務註冊中心我們選擇consul:

執行consul:啟動consul agent的開發模式:

consul agent -dev

該命令快速啟動乙個單節點的consul,且為集群的領袖

檢視consul集群的成員:開啟另乙個終端執行:

consul members

停止agent:使用 ctrl-c,優雅的關閉agent

也可以通過webui來檢視各service狀態:http://localhost:8500/

micro是以go-micro框架為核心的微服務管理工具,通過它可以方便檢視go-micro服務情況。

在$gopath目錄下,執行go get github.com/micro/micro,該命令會在bin目錄($gobin)下生成micro(.exe)工具

micro命令列工具可以提供諸如服務列表檢視、服務詳情檢視、呼叫服務介面等功能。

protoc-gen-go:goprotobuf 提供的 protobuf 外掛程式:在$gopath目錄下執行go get github.com/micro/protobuf/,該命令會在bin目錄下生成protoc-gen-go(.exe)工具,protoc編譯器利用protoc-gen-go外掛程式將.proto檔案轉換為golang原始檔

protoc-gen-micro(protobuf code generation for micro):在$gopath目錄下執行go get github.com/micro/protoc-gen-micro,該命令會在bin目錄下生成protoc-gen-micro(.exe),protoc編譯器利用protoc-gen-micro外掛程式將.proto檔案轉換為micro**風格檔案

goprotobuf編譯引數:

至此,go-micro框架的程式設計環境已基本搭建好,接下來就是寫**了。

下面實現乙個hello服務:它接收乙個字串型別引數請求,返回乙個字串問候語:hello 『引數值』。

1)定義api

建立proto/hello.proto檔案:

使用protobuf檔案來定義服務api介面

syntax = "proto3";

service hello

}message request

message response

執行protoc命令,生成當前pb檔案的go實現:

protoc --go_out=plugins=micro:. ./proto/hello.proto
2)建立service

建立services/hello.go檔案:

}3)模擬client

建立clients/helloclient.go檔案:

}啟動consul之後

執行micro list services檢視當前已有服務:

> micro list services

consul

執行go run services/hello.go命令,啟動hellooo服務:

>go run services/hello.go

2018/11/29 20:18:08 listening on [::]:61463

2018/11/29 20:18:08 broker listening on [::]:61464

2018/11/29 20:18:08 registering node: hellooo-74122f56-4728-4449-a9d4-6c3c85ba2fcb

....

再次執行micro list services檢視當前已有服務:

> micro list services

consul

hellooo

即hellooo服務已啟動

通過webui來檢視各service資訊:http://localhost:8500/

請求服務

執行go run clients/helloclient.go命令,向hellooo服務發起請求:

>go run clients/helloclient.go

hello world ^_^

CI框架初探

2014年7月3日 17 39 35 簡易版 index.php codeigniter.php 找到控制器類檔案並include 建立例項 執行成員函式 詳細版本 瀏覽器請求 index.php 包含codeigniter.php 接下來的步驟都是在codeigniter.php中執行 包含sys...

AIML框架 初探

建立乙個 aiml main.py 檔案 aiml由richard wallace發明。他設計了乙個名為 a.l.i.c.e.artificial linguistics internet computer entity 人工語言網計算機實體 的機械人,並獲得了多項人工智慧大獎。aiml是一種為了匹...

SilverLight框架初探

silverlight技術的出現也已經有很長一段時間了,但是卻感覺還沒有比較統一的框架模式 個人的技術水平有限 在研究它的架構模式過程中,剛開始是試想採用mvc模式來搭建系統架構,利用silverlight與webform相結合的形式,但是框架做好了之後感覺不太好使,webform與silverli...