go微服務框架go-micro深度學習(一) 整體架構介紹

? 產品嘴里的一個小項目,從立項到開發上線,隨著時間和需求的不斷激增,會越來越復雜,變成一個大項目,如果前期項目架構沒設計的不好,代碼會越來越臃腫,難以維護,后期的每次產品迭代上線都會牽一發而動全身。項目微服務化,松耦合模塊間的關系,是一個很好的選擇,隨然增加了維護成本,但是還是很值得的。?

?

? ? ?微服務化項目除了穩定性我個人還比較關心的幾個問題:

? ? ?一: 服務間數據傳輸的效率和安全性。

? ? ?二: 服務的動態擴充,也就是服務的注冊和發現,服務集群化。

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

?

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

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

? ? ?二:go-micro的服務注冊和發現是多種多樣的。我個人比較喜歡etcdv3的服務服務發現和注冊。

? ? ?三:主要的功能都有相應的接口,只要實現相應的接口,就可以根據自己的需要訂制插件。

? ? ?

? ? ?業余時間把go-micro的源碼系統地讀了一遍,越讀越感覺這個框架寫的好,從中也學到了很多東西。就想整理一系列的帖子,把學習go-micro的心得和大家分享。

通信流程

? ? ?go-micro的通信流程大至如下

?

? ? Server監聽客戶端的調用,和Brocker推送過來的信息進行處理。并且Server端需要向Register注冊自己的存在或消亡,這樣Client才能知道自己的狀態。

? ? Register服務的注冊的發現。

? ? Client端從Register中得到Server的信息,然后每次調用都根據算法選擇一個的Server進行通信,當然通信是要經過編碼/解碼,選擇傳輸協議等一系列過程的。

? ? 如果有需要通知所有的Server端可以使用Brocker進行信息的推送。

? ? Brocker 信息隊列進行信息的接收和發布。

?

? ? ?go-micro之所以可以高度訂制和他的框架結構是分不開的,go-micro由8個關鍵的interface組成,每一個interface都可以根據自己的需求重新實現,這8個主要的inteface也構成了go-micro的框架結構。?

?

? ? 這些接口go-micir都有他自己默認的實現方式,還有一個go-plugins是對這些接口實現的可替換項。你也可以根據需求實現自己的插件。

?

?

? ?這篇帖子主要是給大家介紹go-micro的主體結構和這些接口的功能,具體細節以后的文章我們再慢慢說:

? ?Transort

? ? 服務之間通信的接口。也就是服務發送和接收的最終實現方式,是由這些接口定制的。

? ?源碼:

復制代碼
type Socket interface {Recv(*Message) errorSend(*Message) errorClose() error
}type Client interface {Socket
}type Listener interface {Addr() stringClose() errorAccept(func(Socket)) error
}type Transport interface {Dial(addr string, opts ...DialOption) (Client, error)Listen(addr string, 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等等。

源碼

復制代碼
type Codec interface {ReadHeader(*Message, MessageType) errorReadBody(interface{}) errorWrite(*Message, interface{}) errorClose() errorString() string
}type Message struct {Id     uint64Type   MessageTypeTarget stringMethod stringError  stringHeader map[string]string
}
復制代碼

? ? ?Codec接口的Write方法就是編碼過程,兩個Read是解碼過程。

Registry

? ? ?服務的注冊和發現,目前實現的consul,mdns, etcd,etcdv3,zookeeper,kubernetes.等等,

復制代碼
type Registry interface {Register(*Service, ...RegisterOption) errorDeregister(*Service) errorGetService(string) ([]*Service, error)ListServices() ([]*Service, error)Watch(...WatchOption) (Watcher, error)String() stringOptions() Options
}
復制代碼

? ? ?簡單來說,就是Service 進行Register,來進行注冊,Client 使用watch方法進行監控,當有服務加入或者刪除時這個方法會被觸發,以提醒客戶端更新Service信息。

? ? ?默認的是服務注冊和發現是consul,但是個人不推薦使用,因為你不能直接使用consul集群

? ? ?

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

?

Selector

? ? 以Registry為基礎,Selector 是客戶端級別的負載均衡,當有客戶端向服務發送請求時, selector根據不同的算法從Registery中的主機列表,得到可用的Service節點,進行通信。目前實現的有循環算法和隨機算法,默認的是隨機算法。

? ? 源碼:

復制代碼
type Selector interface {Init(opts ...Option) errorOptions() Options// Select returns a function which should return the next nodeSelect(service string, opts ...SelectOption) (Next, error)// Mark sets the success/error against a nodeMark(service string, node *registry.Node, err error)// Reset returns state back to zero for a serviceReset(service string)// Close renders the selector unusable
    Close() error// Name of the selectorString() string
}
復制代碼

? ? ?默認的是實現是本地緩存,當前實現的有blacklist,label,named等方式。

?Broker

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

源碼

復制代碼
type Broker interface {Options() OptionsAddress() stringConnect() errorDisconnect() errorInit(...Option) errorPublish(string, *Message, ...PublishOption) errorSubscribe(string, Handler, ...SubscribeOption) (Subscriber, error)String() string
}
復制代碼

? ? ?Broker默認的實現方式是http方式,但是這種方式不要在生產環境用。go-plugins里有很多成熟的消息隊列實現方式,有kafka、nsq、rabbitmq、redis,等等。

?Client

? ? Client是請求服務的接口,他封裝Transport和Codec進行rpc調用,也封裝了Brocker進行信息的發布。

源碼

復制代碼
type Client interface {Init(...Option) errorOptions() OptionsNewMessage(topic string, msg interface{}, opts ...MessageOption) MessageNewRequest(service, method string, req interface{}, reqOpts ...RequestOption) RequestCall(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) errorStream(ctx context.Context, req Request, opts ...CallOption) (Stream, error)Publish(ctx context.Context, msg Message, opts ...PublishOption) errorString() string
}
復制代碼

? ? ?當然他也支持雙工通信 Stream 這些具體的實現方式和使用方式,以后會詳細解說。

? ? ?默認的是rpc實現方式,他還有grpc和http方式,在go-plugins里可以找到

Server

? ? ?Server看名字大家也知道是做什么的了。監聽等待rpc請求。監聽broker的訂閱信息,等待信息隊列的推送等。

源碼?

復制代碼
type Server interface {Options() OptionsInit(...Option) errorHandle(Handler) errorNewHandler(interface{}, ...HandlerOption) HandlerNewSubscriber(string, interface{}, ...SubscriberOption) SubscriberSubscribe(Subscriber) errorRegister() errorDeregister() errorStart() errorStop() errorString() string
}
復制代碼

? ? ?默認的是rpc實現方式,他還有grpc和http方式,在go-plugins里可以找到

?

Service

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

源碼:

復制代碼
type Service interface {Init(...Option)Options() OptionsClient() client.ClientServer() server.ServerRun() errorString() string
}
復制代碼

? ? ?具體的細節,我以后的帖子會給大家一一展開,希望這篇帖子,可以幫助你對go-micro的整體框架有個初步了解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253595.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253595.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

雜記---待整理

---恢復內容開始--- shell高亮顯示 echo -e 終端顏色 顯示內容 結束后的顏色 \e[1;31m content \e[1;0m 1為設置,0為不設置。 31m 0m為顏色 [ucmMacBook-Pro testpace]$ echo -e "\e[1;31m consumer huawei com \e[1;0m"consumer huawei com [ucmMacBook…

(轉載)項目實戰工具類(一):PhoneUtil(手機信息相關)

項目實戰工具類(一):PhoneUtil(手機信息相關) 可以使用的功能: 1、獲取手機系統版本號 2、獲取手機型號 3、獲取手機寬度 4、獲取手機高度 5、獲取手機imei串號 ,GSM手機的 IMEI 和 CDMA手機的 MEID. 6、…

手把手教你寫Linux I2C設備驅動

手把手教你寫Linux I2C設備驅動 標簽:Linux 設備 驅動 詳解 i2c 原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://ticktick.blog.51cto.com/823160/760020 Linux I2C驅動是嵌入…

HDR 成像技術學習(三)—— LOFIC

HDR 成像技術學習(一) HDR 成像技術學習(二) 我們拍攝的照片來自傳感器上的像素,它們將光處理為電信號,組合起來輸出畫面。當捕捉對象亮度過強,大量電荷擠在單個像素內,生成的圖像就會過曝。 LOFIC(Lateral Overflow Integration Capacitor,橫向溢出集合電容…

[模板]平面最近點對

實現 將平面內點按$x$坐標排序,分治$x$坐標,設$retmin(f(l,mid),f(mid1,r))$, 將$x\in[mid-ret,midret]$內的點按$y$坐標排序,算每個點與相鄰的$6$個點的距離找最優解即可. 時間復雜度:$O(nlogn)$. #define N 100005 #define INF 1e15 struct point{double x,y; }p[N]; inline …

人工智能與圖像傳感器

隨著人工智能時代的來臨,相應的芯片產品和行業也產生了相應的新方向。 在人工智能的各個分支中,機器視覺無疑是應用最廣泛的方向,它支撐著諸如人臉檢測、工業異常檢測、手勢識別等諸多重要的應用。顧名思義,機器視覺是使用機器學習/人工智能的方法來分析視覺信號,并且通過…

用戶空間訪問I2C設備驅動

2012-01-11 15:33:43標簽:Linux I2C 字符設備 設備驅動 用戶空間 原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://ticktick.blog.51cto.com/823160/761830 關于Linux下如何編…

097實戰 關于ETL的幾種運行方式

一:代碼部分 1.新建maven項目 2.添加需要的java代碼   3.書寫mapper類 4.書寫runner類 二:運行方式 1.本地運行 2.集群運行 3.本地提交集群運行 三:本地運行方式 1.解壓hadoop到本地 2.修改配置文件HADOOP_HOME 3.解壓common的壓縮包 4.將壓…

模擬ssh, hashlib模塊, struct模塊, subprocess模塊

一. 模擬ssh # 服務器端 import socket import subprocess # 系統操作server socket.socket()server.bind((127.0.0.1,8008))server.listen(5)while True:print("server is working.....")conn,addr server.accept()# 字節類型while True:# 針對window系統try:…

使用pssh進行并行批量操作

假如同時給上千臺服務器執行一個命令,拷貝一個文件,殺一個進程等,有什么簡化運維管理的工具呢?在小型使用中我都是使用for循 環,數量巨大,一方面不確定操作是否成功,一方面for循環語句性能不好估計且是不是同步并行執行.,這類工具比如 pdsh,mussh&#…

圖像清晰度評價函數

概述 圖像清晰度是用來指導調焦機構找到正焦位置的評價函數。理想的清晰度評價曲線如下圖所示,其中P 是評價函數最大值的位置,其對應正焦位置,P1 和P2 為正焦位置焦前和焦后采集到圖像的清晰度評價結果。 為了指導調焦機構找到正焦位置,清晰度曲線須具有以下特點: 單…

Linux下讀寫芯片的I2C寄存器

Linux下讀寫芯片的I2C寄存器 2012-01-10 11:40:18 標簽:Linux 寄存器 驅動 讀寫 I2C 原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://ticktick.blog.51cto.com/823160/76096…

列表和表格---學習筆記02

第7章 列表和表格 7.1 有序列表<ol type"A"><li>這里是第1個li</li><li>這里是第2個li</li><li>這里是第3個li</li></ol> ol屬性&#xff1a;type : 數字(1),大小寫字母(A,a),大小寫羅馬數字(I,i)start: "起始…

(下)挖掘傳統行業日志大數據的無限價值

&#xfffc;8 月 27 日晚上八點&#xff0c;七牛云高級解決方案架構師程雪松在 IT 大咖說進行了題為《挖掘傳統行業日志大數據的無限價值》的直播&#xff0c;對傳統行業運維常見困境和統一日志管理的必要性進行了深入解析&#xff0c;并通過 Pandora 的一些真實用戶案例和大家…

CMOS圖像傳感器 —— ISOCELL

最近,外媒曝光了三星最新的CIS傳感器路線圖,路線圖顯示,三星在2億像素之外已經規劃2025年推出576MP像素的傳感器,也就是5億7千6百萬像素。 若5.76億像素的傳感器推出,意味著手機傳感器可媲美中高端單反水平了。三星沒有提及這個5.76億像素的傳感器是怎樣實現的。因…

LeetCode 153. Find Minimum in Rotated Sorted Array (在旋轉有序數組中找到最小值)

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 題目標簽&#xff1a;Array, Binary Se…

YUV圖像

YUV420P&#xff0c;Y&#xff0c;U&#xff0c;V三個分量都是平面格式&#xff0c;分為 I420 和 YV12 。 I420 格式和 YV12 格式的不同處在U平面和V平面的位置不同。在I420格式中&#xff0c;U平面緊跟在Y平面之后&#xff0c;然后才是V平面&#xff08;即&#xff1a;YUV&…

色調映射(Tone Mapping)

一、概述 雖然HDR 圖像有較大的動態范圍,能更細致地反映真實場景,但他的缺點也很明顯。一是同尺寸的數據比低動態范圍圖像大,需要更大的存儲空間與傳輸帶寬。二是難以輸出,目前大多數顯示器、打印機等圖形輸出設備的動態范圍要比普通的高動態范圍圖像小得多。。因此,色調映…

實用軟件工具

1.突破百度網盤下載速度現在&#xff0c;使用 Aria2下載 Aria2-不限速全平臺下載利器但是百度網盤賬號會被限速 &#xff0c;沖會員解除正常限制網速2.Safari 預覽&#xff0c;將網頁轉化為自定義尺寸 PDF 3.清除Xcode 緩存 刪除模擬器運行緩存&#xff0c;找到Developer->…

[原創]Toolbar setNavigationIcon無效

最近在做一個Toolbar&#xff0c;setNavigationIcon()這個方法一直無效&#xff0c;說什么的都有&#xff0c;什么getSupportActionBar().setNavigationIcon()的&#xff0c;說設置style的&#xff0c;說放到setSupportActionBar()之后的。 其實沒有說全&#xff0c;還應該放到…