Go語言微服務系列文章,使用golang實現微服務,這里選用的是go-micro
框架,本文主要是對該框架的一個架構簡單介紹。
1. 概述
go-micro
是go語言
下的一個很好的微服務框架。
- 1.服務間傳輸格式為
protobuf
,效率上沒的說,非常的快,也很安全。 - 2.go-micro的
服務注冊
和發現
是多種多樣的。我個人比較喜歡etcdv3
的服務服務發現和注冊。 - 3.主要的功能都有相應的接口,只要實現相應的接口,就可以根據自己的需要訂制插件。
2. 通信流程
go-micro的通信流程大至如下
Server
端需要向Register
注冊自己的存在或消亡,這樣Client才能知道自己的狀態。
同時Server監聽客戶端的調用
和Brocker
推送過來的信息進行處理。
Client
端從Register
中得到Server
的信息,然后每次調用都根據算法選擇一個的Server
進行通信,當然通信是要經過編碼/解碼,選擇傳輸協議等一系列過程的。
3. 框架結構
go-micro 之所以可以高度訂制和他的框架結構是分不開的,go-micro 由8個
關鍵的 interface
組成,每一個interface 都可以根據自己的需求重新實現,這8個主要的inteface也構成了go-micro的框架結構。
1.Transort
服務之間通信的接口。
也就是服務發送和接收的最終實現方式,是由這些接口定制的
1 |
type Socket interface { |
Transport 的Listen方法是一般是Server端進行調用的,他監聽一個端口,等待客戶端調用。
Transport 的Dial就是客戶端進行連接服務的方法。他返回一個Client接口,這個接口返回一個Client接口,這個Client嵌入了Socket接口,這個接口的方法就是具體發送和接收通信的信息。
是go-micro默認的同步通信機制是http傳輸
。當然還有很多其他的插件:grpc
,nats,tcp,udp,rabbitmq,都是目前已經實現了的方式。
2. Codec
有了傳輸方式,下面要解決的就是傳輸編碼和解碼問題,go-micro有很多種編碼解碼方式,默認的實現方式是protobuf
,當然也有其他的實現方式,json、protobuf、jsonrpc、mercury等等。
1 |
type Codec interface { |
Codec接口的Write方法就是編碼過程,兩個Read是解碼過程。
3. Registry
服務的注冊和發現,目前實現的consul,mdns, etcd,etcdv3
,zookeeper,kubernetes.等
1 |
type Registry interface { |
簡單來說就是Service 進行Register,來進行注冊,Client 使用watch方法進行監控,當有服務加入或者刪除時這個方法會被觸發,以提醒客戶端更新Service信 大專欄 Go-Micro框架入門教程(一)---框架結構息
。
默認的是服務注冊和發現是consul
, 我個人比較喜歡etcdv3集群
。大家可以根據自己的喜好選擇。
4. Selector
以Registry為基礎,Selector 是客戶端級別的負載均衡,當有客戶端向服務發送請求時, selector根據不同的算法從Registery中的主機列表,得到可用的Service節點,進行通信。目前實現的有循環算法
和隨機算法
,默認的是隨機算法
1 |
type Selector interface { |
默認的是實現是本地緩存,當前實現的有blacklist,label,named等方式。
5. Broker
Broker是消息發布和訂閱的接口。很簡單的一個例子,因為服務的節點是不固定的,如果有需要修改所有服務行為的需求,可以使服務訂閱某個主題,當有信息發布時,所有的監聽服務都會收到信息,根據你的需要做相應的行為。
1 |
type Broker interface { |
Broker默認的實現方式是http方式
,但是這種方式不要在生產環境用。go-plugins里有很多成熟的消息隊列實現方式,有kafka、nsq、rabbitmq、redis等等。
6. Client
Client是請求服務的接口。
他封裝 Transport 和 Codec 進行rpc調用,也封裝了Brocker進行信息的發布。
1 |
type Client interface { |
當然他也支持雙工通信 Stream 這些具體的實現方式和使用方式,默認的是rp
c實現方式,他還有grpc
和http方式,在go-plugins里可以找到
7. Server
Server看名字大家也知道是做什么的了。監聽等待rpc請求。監聽broker的訂閱信息,等待信息隊列的推送等。
1 |
type Server interface { |
默認的是rpc實現方式,他還有grpc和http方式,在go-plugins里可以找到
8. Service
Service是Client和Server的封裝,他包含了一系列的方法使用初始值去初始化Service和Client,使我們可以很簡單的創建一個rpc服務。
1 |
type Service interface { |
4. 參考
https://blog.csdn.net/mi_duo/article/details/82701732