中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

go micro整體架構是怎樣的

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

這篇文章主要講解了“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整體架構是怎樣的”的內容了,經過本文的學習后,相信大家對go micro整體架構是怎樣的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

津市市| 镇康县| 繁峙县| 高唐县| 海原县| 宝鸡市| 霍州市| 民县| 沅江市| 六枝特区| 五峰| 昌江| 左云县| 二连浩特市| 泗水县| 桃江县| 东安县| 永丰县| 衡阳县| 盐城市| 永济市| 长武县| 宿松县| 保亭| 孝感市| 镶黄旗| 板桥市| 阆中市| 塔河县| 延长县| 临沂市| 大理市| 吴江市| 南澳县| 望都县| 诏安县| 阳春市| 博白县| 揭西县| 正安县| 西和县|