溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

go micro整體架構(gòu)是怎樣的

發(fā)布時間:2022-03-04 13:57:10 來源:億速云 閱讀:138 作者:iii 欄目:web開發(fā)

這篇文章主要講解了“go micro整體架構(gòu)是怎樣的”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“go micro整體架構(gòu)是怎樣的”吧!

  微服務(wù)化項目除了穩(wěn)定性我個人還比較關(guān)心的幾個問題:

  一:服務(wù)間數(shù)據(jù)傳輸?shù)男屎桶踩浴?/p>

  二:服務(wù)的動態(tài)擴充,也就是服務(wù)的注冊和發(fā)現(xiàn),服務(wù)集群化。

  三:微服務(wù)功能的可訂制化,因為并不是所有的功能都會很符合你的需求,難免需要根據(jù)自己的需要二次開發(fā)一些功能。

  go-micro是go語言下的一個很好的rpc微服務(wù)框架,功能很完善,而且我關(guān)心的幾個問題也解決的很好:

  一:服務(wù)間傳輸格式為protobuf,效率上沒的說,非常的快,也很安全。

  二:go-micro的服務(wù)注冊和發(fā)現(xiàn)是多種多樣的。我個人比較喜歡etcdv3的服務(wù)服務(wù)發(fā)現(xiàn)和注冊。

  三:主要的功能都有相應(yīng)的接口,只要實現(xiàn)相應(yīng)的接口,就可以根據(jù)自己的需要訂制插件。

  Server監(jiān)聽客戶端的調(diào)用,和Brocker推送過來的信息進(jìn)行處理。并且Server端需要向Register注冊自己的存在或消亡,這樣Client才能知道自己的狀態(tài)。

  Register服務(wù)的注冊的發(fā)現(xiàn)。

  Client端從Register中得到Server的信息,然后每次調(diào)用都根據(jù)算法選擇一個的Server進(jìn)行通信,當(dāng)然通信是要經(jīng)過編碼/解碼,選擇傳輸協(xié)議等一系列過程的。

  如果有需要通知所有的Server端可以使用Brocker進(jìn)行信息的推送。

  Brocker信息隊列進(jìn)行信息的接收和發(fā)布。

  go-micro之所以可以高度訂制和他的框架結(jié)構(gòu)是分不開的,go-micro由8個關(guān)鍵的interface組成,每一個interface都可以根據(jù)自己的需求重新實現(xiàn),這8個主要的inteface也構(gòu)成了go-micro的框架結(jié)構(gòu)。

  Transort

  服務(wù)之間通信的接口。也就是服務(wù)發(fā)送和接收的最終實現(xiàn)方式,是由這些接口定制的。

  源碼:

  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端進(jìn)行調(diào)用的,他監(jiān)聽一個端口,等待客戶端調(diào)用。

  Transport的Dial就是客戶端進(jìn)行連接服務(wù)的方法。他返回一個Client接口,這個接口返回一個Client接口,這個Client嵌入了Socket接口,這個接口的方法就是具體發(fā)送和接收通信的信息。

  http傳輸是go-micro默認(rèn)的同步通信機制。當(dāng)然還有很多其他的插件:grpc,nats,tcp,udp,rabbitmq,nats,都是目前已經(jīng)實現(xiàn)了的方式。在go-plugins里你都可以找到。

  Codec

  有了傳輸方式,下面要解決的就是傳輸編碼和解碼問題,go-micro有很多種編碼解碼方式,默認(rèn)的實現(xiàn)方式是protobuf,當(dāng)然也有其他的實現(xiàn)方式,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

  服務(wù)的注冊和發(fā)現(xiàn),目前實現(xiàn)的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進(jìn)行Register,來進(jìn)行注冊,Client使用watch方法進(jìn)行監(jiān)控,當(dāng)有服務(wù)加入或者刪除時這個方法會被觸發(fā),以提醒客戶端更新Service信息。

  默認(rèn)的是服務(wù)注冊和發(fā)現(xiàn)是consul,但是個人不推薦使用,因為你不能直接使用consul集群

  5.jpg

  我個人比較喜歡etcdv3集群。大家可以根據(jù)自己的喜好選擇。

  Selector

  以Registry為基礎(chǔ),Selector是客戶端級別的負(fù)載均衡,當(dāng)有客戶端向服務(wù)發(fā)送請求時,selector根據(jù)不同的算法從Registery中的主機列表,得到可用的Service節(jié)點,進(jìn)行通信。目前實現(xiàn)的有循環(huán)算法和隨機算法,默認(rèn)的是隨機算法。

  源碼:

  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

  }

  默認(rèn)的是實現(xiàn)是本地緩存,當(dāng)前實現(xiàn)的有blacklist,label,named等方式。

  Broker

  Broker是消息發(fā)布和訂閱的接口。很簡單的一個例子,因為服務(wù)的節(jié)點是不固定的,如果有需要修改所有服務(wù)行為的需求,可以使服務(wù)訂閱某個主題,當(dāng)有信息發(fā)布時,所有的監(jiān)聽服務(wù)都會收到信息,根據(jù)你的需要做相應(yīng)的行為。

  源碼

  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默認(rèn)的實現(xiàn)方式是http方式,但是這種方式不要在生產(chǎn)環(huán)境用。go-plugins里有很多成熟的消息隊列實現(xiàn)方式,有kafka、nsq、rabbitmq、redis,等等。

  Client

  Client是請求服務(wù)的接口,他封裝Transport和Codec進(jìn)行rpc調(diào)用,也封裝了Brocker進(jìn)行信息的發(fā)布。

  源碼

  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

  }

  當(dāng)然他也支持雙工通信Stream這些具體的實現(xiàn)方式和使用方式,以后會詳細(xì)解說。

  默認(rèn)的是rpc實現(xiàn)方式,他還有g(shù)rpc和http方式,在go-plugins里可以找到

  Server

  Server看名字大家也知道是做什么的了。監(jiān)聽等待rpc請求。監(jiān)聽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

  }

  默認(rèn)的是rpc實現(xiàn)方式,他還有g(shù)rpc和http方式,在go-plugins里可以找到

  Service

  Service是Client和Server的封裝,他包含了一系列的方法使用初始值去初始化Service和Client,使我們可以很簡單的創(chuàng)建一個rpc服務(wù)。

  源碼:

  typeServiceinterface{

  Init(...Option)

  Options()Options

  Client()client.Client

  Server()server.Server

  Run()error

  String()string

  }
go micro整體架構(gòu)是怎樣的


感謝各位的閱讀,以上就是“go micro整體架構(gòu)是怎樣的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對go micro整體架構(gòu)是怎樣的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI