您好,登錄后才能下訂單哦!
這篇文章主要講解了“go micro整體架構是怎樣的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“go micro整體架構是怎樣的”吧!
微服務化項目除了穩定性我個人還比較關心的幾個問題:
一:服務間數據傳輸的效率和安全性。
二:服務的動態擴充,也就是服務的注冊和發現,服務集群化。
三:微服務功能的可訂制化,因為并不是所有的功能都會很符合你的需求,難免需要根據自己的需要二次開發一些功能。
go-micro是go語言下的一個很好的rpc微服務框架,功能很完善,而且我關心的幾個問題也解決的很好:
一:服務間傳輸格式為protobuf,效率上沒的說,非常的快,也很安全。
二:go-micro的服務注冊和發現是多種多樣的。我個人比較喜歡etcdv3的服務服務發現和注冊。
三:主要的功能都有相應的接口,只要實現相應的接口,就可以根據自己的需要訂制插件。
Server監聽客戶端的調用,和Brocker推送過來的信息進行處理。并且Server端需要向Register注冊自己的存在或消亡,這樣Client才能知道自己的狀態。
Register服務的注冊的發現。
Client端從Register中得到Server的信息,然后每次調用都根據算法選擇一個的Server進行通信,當然通信是要經過編碼/解碼,選擇傳輸協議等一系列過程的。
如果有需要通知所有的Server端可以使用Brocker進行信息的推送。
Brocker信息隊列進行信息的接收和發布。
go-micro之所以可以高度訂制和他的框架結構是分不開的,go-micro由8個關鍵的interface組成,每一個interface都可以根據自己的需求重新實現,這8個主要的inteface也構成了go-micro的框架結構。
Transort
服務之間通信的接口。也就是服務發送和接收的最終實現方式,是由這些接口定制的。
源碼:
typeSocketinterface{
Recv(*Message)error
Send(*Message)error
Close()error
}
typeClientinterface{
Socket
}
typeListenerinterface{
Addr()string
Close()error
Accept(func(Socket))error
}
typeTransportinterface{
Dial(addrstring,opts...DialOption)(Client,error)
Listen(addrstring,opts...ListenOption)(Listener,error)
String()string
}
Transport的Listen方法是一般是Server端進行調用的,他監聽一個端口,等待客戶端調用。
Transport的Dial就是客戶端進行連接服務的方法。他返回一個Client接口,這個接口返回一個Client接口,這個Client嵌入了Socket接口,這個接口的方法就是具體發送和接收通信的信息。
http傳輸是go-micro默認的同步通信機制。當然還有很多其他的插件:grpc,nats,tcp,udp,rabbitmq,nats,都是目前已經實現了的方式。在go-plugins里你都可以找到。
Codec
有了傳輸方式,下面要解決的就是傳輸編碼和解碼問題,go-micro有很多種編碼解碼方式,默認的實現方式是protobuf,當然也有其他的實現方式,json、protobuf、jsonrpc、mercury等等。
源碼
typeCodecinterface{
ReadHeader(*Message,MessageType)error
ReadBody(interface{})error
Write(*Message,interface{})error
Close()error
String()string
}
typeMessagestruct{
Iduint64
TypeMessageType
Targetstring
Methodstring
Errorstring
Headermap[string]string
}
Codec接口的Write方法就是編碼過程,兩個Read是解碼過程。
Registry
服務的注冊和發現,目前實現的consul,mdns,etcd,etcdv3,zookeeper,kubernetes.等等,
typeRegistryinterface{
Register(*Service,...RegisterOption)error
Deregister(*Service)error
GetService(string)([]*Service,error)
ListServices()([]*Service,error)
Watch(...WatchOption)(Watcher,error)
String()string
Options()Options
}
簡單來說,就是Service進行Register,來進行注冊,Client使用watch方法進行監控,當有服務加入或者刪除時這個方法會被觸發,以提醒客戶端更新Service信息。
默認的是服務注冊和發現是consul,但是個人不推薦使用,因為你不能直接使用consul集群
5.jpg
我個人比較喜歡etcdv3集群。大家可以根據自己的喜好選擇。
Selector
以Registry為基礎,Selector是客戶端級別的負載均衡,當有客戶端向服務發送請求時,selector根據不同的算法從Registery中的主機列表,得到可用的Service節點,進行通信。目前實現的有循環算法和隨機算法,默認的是隨機算法。
源碼:
typeSelectorinterface{
Init(opts...Option)error
Options()Options
//Selectreturnsafunctionwhichshouldreturnthenextnode
Select(servicestring,opts...SelectOption)(Next,error)
//Marksetsthesuccess/erroragainstanode
Mark(servicestring,node*registry.Node,errerror)
//Resetreturnsstatebacktozeroforaservice
Reset(servicestring)
//Closerenderstheselectorunusable
Close()error
//Nameoftheselector
String()string
}
默認的是實現是本地緩存,當前實現的有blacklist,label,named等方式。
Broker
Broker是消息發布和訂閱的接口。很簡單的一個例子,因為服務的節點是不固定的,如果有需要修改所有服務行為的需求,可以使服務訂閱某個主題,當有信息發布時,所有的監聽服務都會收到信息,根據你的需要做相應的行為。
源碼
typeBrokerinterface{
Options()Options
Address()string
Connect()error
Disconnect()error
Init(...Option)error
Publish(string,*Message,...PublishOption)error
Subscribe(string,Handler,...SubscribeOption)(Subscriber,error)
String()string
}
Broker默認的實現方式是http方式,但是這種方式不要在生產環境用。go-plugins里有很多成熟的消息隊列實現方式,有kafka、nsq、rabbitmq、redis,等等。
Client
Client是請求服務的接口,他封裝Transport和Codec進行rpc調用,也封裝了Brocker進行信息的發布。
源碼
typeClientinterface{
Init(...Option)error
Options()Options
NewMessage(topicstring,msginterface{},opts...MessageOption)Message
NewRequest(service,methodstring,reqinterface{},reqOpts...RequestOption)Request
Call(ctxcontext.Context,reqRequest,rspinterface{},opts...CallOption)error
Stream(ctxcontext.Context,reqRequest,opts...CallOption)(Stream,error)
Publish(ctxcontext.Context,msgMessage,opts...PublishOption)error
String()string
}
當然他也支持雙工通信Stream這些具體的實現方式和使用方式,以后會詳細解說。
默認的是rpc實現方式,他還有grpc和http方式,在go-plugins里可以找到
Server
Server看名字大家也知道是做什么的了。監聽等待rpc請求。監聽broker的訂閱信息,等待信息隊列的推送等。
源碼
typeServerinterface{
Options()Options
Init(...Option)error
Handle(Handler)error
NewHandler(interface{},...HandlerOption)Handler
NewSubscriber(string,interface{},...SubscriberOption)Subscriber
Subscribe(Subscriber)error
Register()error
Deregister()error
Start()error
Stop()error
String()string
}
默認的是rpc實現方式,他還有grpc和http方式,在go-plugins里可以找到
Service
Service是Client和Server的封裝,他包含了一系列的方法使用初始值去初始化Service和Client,使我們可以很簡單的創建一個rpc服務。
源碼:
typeServiceinterface{
Init(...Option)
Options()Options
Client()client.Client
Server()server.Server
Run()error
String()string
}
感謝各位的閱讀,以上就是“go micro整體架構是怎樣的”的內容了,經過本文的學習后,相信大家對go micro整體架構是怎樣的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。