本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。
(資料圖)
什么是微服務(wù)
微服務(wù)(Microservices Architecture)是一種軟件架構(gòu)風(fēng)格,面向服務(wù)的體系結(jié)構(gòu)(SOA)架構(gòu)樣式的一種變體,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶(hù)提供最終價(jià)值。每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)與服務(wù)間采用輕量級(jí)的通信機(jī)制互相溝通(通常是基于HTTP的RESTful API)。每個(gè)服務(wù)都圍繞著具體業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠獨(dú)立地部署到生產(chǎn)環(huán)境、類(lèi)生產(chǎn)環(huán)境等。另外,應(yīng)盡量避免統(tǒng)一的、集中式的服務(wù)管理機(jī)制,對(duì)具體的一個(gè)服務(wù)而言,應(yīng)根據(jù)上下文,選擇合適的語(yǔ)言、工具對(duì)其進(jìn)行構(gòu)建。
微服務(wù)(或微服務(wù)架構(gòu))是一種云原生架構(gòu)方法,其中單個(gè)應(yīng)用程序由許多松散耦合且可獨(dú)立部署的較小組件或服務(wù)組成。這些服務(wù)通常
有自己的堆棧,包括數(shù)據(jù)庫(kù)和數(shù)據(jù)模型;
通過(guò)REST API,事件流和消息代理的組合相互通信;
它們是按業(yè)務(wù)能力組織的,分隔服務(wù)的線(xiàn)通常稱(chēng)為有界上下文。
盡管有關(guān)微服務(wù)的許多討論都圍繞體系結(jié)構(gòu)定義和特征展開(kāi),但它們的價(jià)值可以通過(guò)相當(dāng)簡(jiǎn)單的業(yè)務(wù)和組織收益更普遍地理解:
可以更輕松地更新代碼。
團(tuán)隊(duì)可以為不同的組件使用不同的堆棧。
組件可以彼此獨(dú)立地進(jìn)行縮放,從而減少了因必須縮放整個(gè)應(yīng)用程序而產(chǎn)生的浪費(fèi)和成本,因?yàn)閱蝹€(gè)功能可能面臨過(guò)多的負(fù)載。
我們?yōu)槭裁词褂梦⒎?wù)?
這種架構(gòu)有助于我們用各部分、小型模塊描繪整個(gè)應(yīng)用程序,使其更容易理解、開(kāi)發(fā)和測(cè)試;有助于我們將各個(gè)服務(wù)視為獨(dú)立且又清晰指明其用途的服務(wù)。更進(jìn)一步地,它有助于保持項(xiàng)目架構(gòu)的一致性(最初設(shè)計(jì)的架構(gòu)和實(shí)際開(kāi)發(fā)完成的架構(gòu)差別不大)。它還可以通過(guò)建立不同的獨(dú)立團(tuán)隊(duì)來(lái)進(jìn)行服務(wù)的部署和擴(kuò)展,從而各團(tuán)隊(duì)能夠并行地開(kāi)發(fā)。在這個(gè)架構(gòu)中重構(gòu)代碼更容易。它也支持連續(xù)交付和部署流程(CI/CD)。
為什么使用 go 構(gòu)建微服務(wù)?
在深入研究這個(gè)問(wèn)題之前。首先,我說(shuō)一下 Golang 的優(yōu)勢(shì)。雖然 Golang 是一門(mén)新的語(yǔ)言,但是與其他語(yǔ)言相比,它有很多優(yōu)勢(shì)。用 Golang 編寫(xiě)的程序更加健壯。它們能夠承受程序使用運(yùn)行的服務(wù)構(gòu)建的繁重負(fù)載。Golang 更適合多處理器系統(tǒng)和 web 應(yīng)用程序。此外,它容易地與 GitHub 集成,管理非集中的代碼包。微服務(wù)架構(gòu)的用處大部分體現(xiàn)在當(dāng)程序需要伸縮(scalable)時(shí)。如果有一種語(yǔ)言可以完全符合標(biāo)準(zhǔn),那么它就是 Golang。原因是它繼承自 C-family 編程語(yǔ)言,用 Golang 編寫(xiě)的組件更容易與同一家族中其他語(yǔ)言編寫(xiě)的組件相結(jié)合。
盡管 Go 出身于 C-family,但它比 C / C ++更高效。 它語(yǔ)法更簡(jiǎn)單,有點(diǎn)像 Python。它穩(wěn)定語(yǔ)法, 自第一次公開(kāi)發(fā)布以來(lái),它沒(méi)有太大變化,也就是說(shuō)它是后向兼容的。與其他語(yǔ)言相比,這讓 golang 占了上風(fēng)。 除此之外,Golang 的性能比 python 和 java 高出不少。錦上添花的是,它又像 C/C++ 簡(jiǎn)單的同時(shí)又易于閱讀和理解,使它成為開(kāi)發(fā)微服務(wù)應(yīng)用的絕佳選擇。
Golang中的微服務(wù)架構(gòu)框架
下面,我們討論一下可以用于微服務(wù)架構(gòu)的框架。有以下些框架:
Go Micro
Go Micro 是目前為止我遇到的最流行的RPC框架。它是一個(gè)可插拔的RPC框架。Go Micro 為我們提供了以下功能:
服務(wù)發(fā)現(xiàn): 程序自動(dòng)注冊(cè)到服務(wù)發(fā)現(xiàn)系統(tǒng)
負(fù)載均衡: 它提供了客戶(hù)端負(fù)載均衡,這有助于平衡服務(wù)實(shí)例之間的請(qǐng)求
同步通信: 提供 Request/Response 傳輸層
異步通信: 具有內(nèi)置的發(fā)布和訂閱功能
消息編碼: 可以利用 header 中 Content-Type 進(jìn)行編碼和解碼
RPC客戶(hù)端/服務(wù)器端: 利用上述功能并提供構(gòu)建微服務(wù)需要的接口
Go Micro 架構(gòu)由三層組成。第一層抽象為服務(wù)層。第二層為 client-server 模型層。serrver 用于編寫(xiě)服務(wù)的塊組成,而 client 為我們提供接口,其唯一目的是向 server model 中編寫(xiě)的服務(wù)發(fā)出請(qǐng)求。
第三層有以下類(lèi)型的插件:
Broker: 在異步通信中為 message broker(消息代理)提供接口
Codec: 用于加密或解密消息
Registry: 提供服務(wù)搜索功能
Selector: 在 register 上構(gòu)建了負(fù)載均衡
Transport: Transport是服務(wù)與服務(wù)之間同步請(qǐng)求/響應(yīng)的通信接口
它還提供了一個(gè)名為 Sidecar 的功能。Sidecar 使您能夠集成以Go以外的語(yǔ)言編寫(xiě)的服務(wù)。它還為我們提供了gRPC編碼/解碼、服務(wù)注冊(cè)和HTTP 請(qǐng)求處理
GO Kit
Go Kit 是一個(gè)用于構(gòu)建微服務(wù)的編程工具包。與 Go Micro不同,它是一個(gè)可以以二進(jìn)制包導(dǎo)入的庫(kù)。Go Kit 規(guī)則很簡(jiǎn)單。如下:
沒(méi)有全局變量
聲明式組合
顯式依賴(lài)
Interface as Contracts (接口合約)
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)
Go Kit 提供以下代碼包:
Authentication 鑒權(quán): BasicAuth 和 JWT
Transport 協(xié)議: HTTP, gRPC 等
Logging 日志: 服務(wù)中的結(jié)構(gòu)化日志接口
Metrics 度量: CloudWatch,Statsd, Graphite等
Tracing 分布式追蹤: Zipkin and Opentracing
Service discovery 服務(wù)發(fā)現(xiàn): Consul, Etcd, Eureka等
Circuitbreaker 限流熔斷: Hystrix 在 Go 語(yǔ)言的實(shí)現(xiàn)
Go Kit 服務(wù)架構(gòu)如下
Gizmo
Gizmo 是來(lái)自《紐約時(shí)報(bào)》的一個(gè)微服務(wù)工具包。它提供了將服務(wù)器守護(hù)進(jìn)程和 pubsub 守護(hù)進(jìn)程放在一起的包。它公開(kāi)了以下包:
Server: 提供兩個(gè)服務(wù)器實(shí)現(xiàn): SimpleServer(HTTP)和 RPCServer(gRPC)
Server/kit: 基于Go Kit的實(shí)驗(yàn)代碼包
Config 配置: 包含來(lái)自 JSON文件、Consul k/v 中的 JSON blob 或環(huán)境變量的配置功能
Pubsub: 提供用于從隊(duì)列中發(fā)布和使用數(shù)據(jù)的通用接口
Pubsub/pubsubtest: 包含發(fā)布者和訂閱者接口的測(cè)試實(shí)現(xiàn)
Web: 用于從請(qǐng)求查詢(xún)和有效負(fù)載解析類(lèi)型的外部函數(shù)
Pubsub包提供了處理以下隊(duì)列的接口:
pubsub/aws: 用于 Amazon SNS/SQS
pubsub/gcp: 用于 Google Pubsub
pubsub/kafka: 用于 Kafka topics
pubsub/http: 用戶(hù) HTTP 推送
所以,在我看來(lái),Gizmo 介于 Go Micro 和 Go Kit 之間。它不像 Go Micro 那樣是一個(gè)完全的黑盒。同時(shí),它也不像 Go Kit 那么原始。它提供了更高級(jí)別的構(gòu)建組件,比如配置和 pubsub 包
Kite
Kite 是一個(gè)在 Go 中開(kāi)發(fā)微服務(wù)的框架。它公開(kāi)RPC client 和 Server 端代碼包。創(chuàng)建的服務(wù)將自動(dòng)注冊(cè)到服務(wù)發(fā)現(xiàn)系統(tǒng) Kontrol。Kontrol 是用 Kite 編寫(xiě)的,它本身就是一個(gè) Kite service。這意味著 Kite 微服務(wù)在自身的環(huán)境中運(yùn)行良好。如果需要將 Kite 微服務(wù)連接到另一個(gè)服務(wù)發(fā)現(xiàn)系統(tǒng),則需要定制。這是我從列表中選擇 Kite 并決定不介紹這個(gè)框架的重要原因之一
以上就是golang中什么是微服務(wù)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!