首頁 後端開發 Golang go微服務框架go-micro整體架構介紹

go微服務框架go-micro整體架構介紹

Nov 26, 2019 pm 01:19 PM
go 框架

go微服務框架go-micro整體架構介紹

產品嘴裡的一個小項目,從立項到開發上線,隨著時間和需求的不斷激增,會越來越複雜,變成一個大項目,如果前期項目架構沒設計的不好,程式碼會越來越臃腫,難以維護,後期的每次產品迭代上線都會牽一發而動全身。

專案微服務化,鬆散耦合模組間的關係,是一個很好的選擇,雖然增加了維護成本,但是還是很值得的。 

go微服務框架go-micro整體架構介紹

微服務化專案除了穩定性我個人也比較關心的幾個問題:

一: 服務間資料傳輸的效率與安全性。

二: 服務的動態擴充,也就是服務的註冊與發現,服務群聚化。

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

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

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

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

三:主要的功能都有對應的接口,只要實作對應的接口,就可以依照自己的需求訂做插件。

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

go-micro的通訊流程大至如下

go微服務框架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微服務框架go-micro整體架構介紹

這些介面go-micir都有他自己預設的實作方式,還有一個go-plugins是這些介面實現的可替換項目。你也可以依照需求實現自己的插件。

go微服務框架go-micro整體架構介紹

這篇文章主要是跟大家介紹go-micro的主體結構和這些介面的功能,具體細節以後的文章我們再慢慢說:

Transort

服務之間通訊的介面。也就是服務發送和接收的最終實作方式,是由這些介面定制的。

原始碼:

type Socket interface {
    Recv(*Message) error
    Send(*Message) error
    Close() error
}

type Client interface {
    Socket
}

type Listener interface {
    Addr() string
    Close() error
    Accept(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) error
    ReadBody(interface{}) error
    Write(*Message, interface{}) error
    Close() error
    String() string
}

type Message struct {
    Id     uint64
    Type   MessageType
    Target string
    Method string
    Error  string
    Header map[string]string
}
登入後複製

Codec介面的Write方法就是編碼過程,兩個Read是解碼過程。

Registry

服務的註冊與發現,目前實現的consul,mdns, etcd,etcdv3,zookeeper,kubernetes.等等,

type Registry interface {
    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群集

go微服務框架go-micro整體架構介紹

我个人比较喜欢etcdv3集群。大家可以根据自己的喜好选择。

Selector

以Registry为基础,Selector 是客户端级别的负载均衡,当有客户端向服务发送请求时, selector根据不同的算法从Registery中的主机列表,得到可用的Service节点,进行通信。目前实现的有循环算法和随机算法,默认的是随机算法。

源码:

type Selector interface {
    Init(opts ...Option) error
    Options() Options
    // Select returns a function which should return the next node
    Select(service string, opts ...SelectOption) (Next, error)
    // Mark sets the success/error against a node
    Mark(service string, node *registry.Node, err error)
    // Reset returns state back to zero for a service
    Reset(service string)
    // Close renders the selector unusable
    Close() error
    // Name of the selector
    String() string
}
登入後複製

默认的是实现是本地缓存,当前实现的有blacklist,label,named等方式。

 Broker

Broker是消息发布和订阅的接口。很简单的一个例子,因为服务的节点是不固定的,如果有需要修改所有服务行为的需求,可以使服务订阅某个主题,当有信息发布时,所有的监听服务都会收到信息,根据你的需要做相应的行为。

源码

type Broker interface {
    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进行信息的发布。

源码

type Client interface {
    Init(...Option) error
    Options() Options
    NewMessage(topic string, msg interface{}, opts ...MessageOption) Message
    NewRequest(service, method string, req interface{}, reqOpts ...RequestOption) Request
    Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error
    Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error)
    Publish(ctx context.Context, msg Message, opts ...PublishOption) error
    String() string
}
登入後複製

当然他也支持双工通信 Stream 这些具体的实现方式和使用方式,以后会详细解说。

默认的是rpc实现方式,他还有grpc和http方式,在go-plugins里可以找到

Server

Server看名字大家也知道是做什么的了。监听等待rpc请求。监听broker的订阅信息,等待信息队列的推送等。

源码 

type Server interface {
    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服务。

源码:

type Service interface {
    Init(...Option)
    Options() Options
    Client() client.Client
    Server() server.Server
    Run() error
    String() string
}
登入後複製

以上是go微服務框架go-micro整體架構介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何評估Java框架商業支援的性價比 如何評估Java框架商業支援的性價比 Jun 05, 2024 pm 05:25 PM

評估Java框架商業支援的性價比涉及以下步驟:確定所需的保障等級和服務等級協定(SLA)保證。研究支持團隊的經驗和專業知識。考慮附加服務,如昇級、故障排除和效能最佳化。權衡商業支援成本與風險緩解和提高效率。

PHP 框架的學習曲線與其他語言框架相比如何? PHP 框架的學習曲線與其他語言框架相比如何? Jun 06, 2024 pm 12:41 PM

PHP框架的學習曲線取決於語言熟練度、框架複雜性、文件品質和社群支援。與Python框架相比,PHP框架的學習曲線較高,而與Ruby框架相比,則較低。與Java框架相比,PHP框架的學習曲線中等,但入門時間較短。

PHP 框架的輕量級選項如何影響應用程式效能? PHP 框架的輕量級選項如何影響應用程式效能? Jun 06, 2024 am 10:53 AM

輕量級PHP框架透過小體積和低資源消耗提升應用程式效能。其特點包括:體積小,啟動快,記憶體佔用低提升響應速度和吞吐量,降低資源消耗實戰案例:SlimFramework創建RESTAPI,僅500KB,高響應性、高吞吐量

如何在 Golang 單元測試中使用 gomega 進行斷言? 如何在 Golang 單元測試中使用 gomega 進行斷言? Jun 05, 2024 pm 10:48 PM

如何在Golang單元測試中使用Gomega進行斷言在Golang單元測試中,Gomega是一個流行且功能強大的斷言庫,它提供了豐富的斷言方法,使開發人員可以輕鬆驗證測試結果。安裝Gomegagoget-ugithub.com/onsi/gomega使用Gomega進行斷言以下是使用Gomega進行斷言的一些常用範例:1.相等斷言import"github.com/onsi/gomega"funcTest_MyFunction(t*testing.T){

Go WebSocket 如何與資料庫整合? Go WebSocket 如何與資料庫整合? Jun 05, 2024 pm 03:18 PM

如何將GoWebSocket與資料庫整合:設定資料庫連線:使用database/sql包連接到資料庫。將WebSocket訊息儲存到資料庫:使用INSERT語句將訊息插入資料庫。從資料庫檢索WebSocket訊息:使用SELECT語句檢索資料庫中的消息。

如何為不同的應用場景選擇最佳的golang框架 如何為不同的應用場景選擇最佳的golang框架 Jun 05, 2024 pm 04:05 PM

根據應用場景選擇最佳Go框架:考慮應用類型、語言特性、效能需求、生態系統。常見Go框架:Gin(Web應用)、Echo(Web服務)、Fiber(高吞吐量)、gorm(ORM)、fasthttp(速度)。實戰案例:建構RESTAPI(Fiber),與資料庫互動(gorm)。選擇框架:效能關鍵選fasthttp,靈活Web應用選Gin/Echo,資料庫互動選gorm。

Java框架學習路線圖:不同領域中的最佳實踐 Java框架學習路線圖:不同領域中的最佳實踐 Jun 05, 2024 pm 08:53 PM

針對不同領域的Java框架學習路線圖:Web開發:SpringBoot和PlayFramework。持久層:Hibernate和JPA。服務端響應式程式設計:ReactorCore和SpringWebFlux。即時計算:ApacheStorm和ApacheSpark。雲端運算:AWSSDKforJava和GoogleCloudJava。

Golang在爬蟲開發的應用案例詳解 Golang在爬蟲開發的應用案例詳解 Jun 05, 2024 pm 10:12 PM

Go语言以并发性和高性能著称,使其成为网络爬虫开发的理想选择。创建网站爬虫:Go语言提供简洁易学的语法,适用于快速编写爬虫。分布式爬虫:Go语言的goroutine和消息队列支持创建可扩展且可靠的分布式爬虫。部署和监控:Go语言的可移植性和监控工具支持轻松部署和监控爬虫的性能和可靠性。

See all articles