這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
go-kit 入門
1. microservice
Go-Kit
go kit 是一個分布式的開發工具集,在大型的組織(業務)中可以用來構建微服務。其解決了分布式系統中的大多數常見問題,因此,使用者可以將精力集中在商務邏輯上。
2. go-kit 組件介紹
2.1 Endpoint(端點)
Go kit首先解決了RPC訊息模式。其使用了一個抽象的 endpoint 來為每一個RPC建立模型。
endpoint通過被一個server進行實現(implement),或是被一個client調用。這是很多 Go kit組件的基本構建代碼塊。
2.2 Circuit breaker(迴路斷路器)
Circuitbreaker(迴路斷路器) 模組提供了很多流行的迴路斷路lib的端點(endpoint)適配器。迴路斷路器可以避免雪崩,並且提高了針對間歇性錯誤的彈性。每一個client的端點都應該封裝(wrapped)在迴路斷路器中。
2.3 Rate limiter(限流器)
ratelimit模組提供了到限流器程式碼封裝的端點適配器。限流器對服務端(server-client)和用戶端(client-side)同等生效。使用限流器可以強制進、出請求量在閾值上限以下。
2.4 Transport(傳輸層)
transport 模組提供了將特定的序列化演算法綁定到端點的輔助方法。當前,Go kit只針對JSON和HTTP提供了輔助方法。如果你的組織使用完整功能的傳輸層,典型的方案是使用Go在傳輸層提供的函數庫,Go kit並不需要來做太多的事情。這些情況,可以查閱代碼例子來理解如何為你的端點寫一個適配器。目前,可以查看 addsvc的代碼來理解Transport綁定是如何工作的。我們還提供了針對Thirft,gRPC,net/rpc,和http json的特殊例子。對JSON/RPC和Swagger的支援在計劃中。
2.5 Logging(日誌)
服務產生的日誌是會被延遲消費(使用)的,或者是人或者是機器(來使用)。人可能會對調試錯誤、跟蹤特殊的請求感興趣。機器可能會對統計那些有趣的事件,或是對離線處理的結果進行彙總。這兩種情況,日誌訊息的結構化和可操作性是很重要的。Go kit的log 模組針對這些實踐提供了最好的設計。
2.6 Metrics(Instrumentation)度量/儀錶盤
直到服務經過了跟蹤計數、延遲、健康情況和其他的周期性的或針對每個請求資訊的儀錶盤化,才能被認為是“生產環境”完備的。Go kit 的 metric 模組為你的服務提供了通用並健壯的介面集合。可以綁定到常用的後端服務,比如 expvar、statsd、Prometheus。
2.7 Request tracing(請求跟蹤)
隨著你的基礎設施的增長,能夠跟蹤一個請求變得越來越重要,因為它可以在多個服務中進行穿梭並回到使用者。Go kit的tracing 模組提供了為端點和傳輸的增強性的綁定功能,以捕捉關於請求的資訊,並把它們發送到跟蹤系統中。(當前支援Zipkin,計劃支援Appdash
2.8 Service discovery and load balancing(服務發現和負載平衡)
如果你的服務調用了其他的服務,需要知道如何找到它(另一個服務),並且應該智能的將負載在這些發現的執行個體上鋪開(即,讓被發現的執行個體智能的分擔服務壓力)。Go kit的 loadbalancer模組提供了用戶端端點的中介軟體來解決這類問題,無論你是使用的靜態主機名稱還是IP地址,或是 DNS的 SRV 記錄,Consul,etcd 或是 Zookeeper。並且,如果你使用定製的系統,也可以非常容易的編寫你自己的 Publisher,以使用 Go kit 提供的負載平衡策略。(目前,支援靜態主機名稱、etcd、Consul、Zookeeper)
3 目標
- 在各種SOA架構中操作–預期會與各種非Go kit服務進行互動
- 使用RPC作為最主要的訊息模式
- 可插拔的序列化和傳輸–不僅僅只有JSON和HTTP
- 簡單便可融入現有的架構–沒有任何特殊工具、技術的相關指令
4 目標之外(不考慮做的事情)
- 支援除RPC之外的訊息模式(至少目前是)–比如 MPI、pub/sub,CQRS,等
- 除適配現有軟體外,重新實現一些功能
- 在營運方面進行評論:部署、配置、進程管理、服務編排等
5 依賴管理
Go kit 是一個函數庫,設計的目標是引入到二進位檔案中。對於二進位軟體包的作者來講,Vendoring是目前用來確保軟體可靠、可重新構建的最好的機制。因此,我們強烈的建議我們的使用者使用vendoring機制來管理他們軟體的依賴,包括Go kit。
為了避免相容性和可用性的問題,Go kit沒有vendor它自己的依賴,並且並不推薦使用第三方的引用代理。
有一些工具可以讓vendor機制更簡單,包括 gb、glide、gvt、govendor 和 vendetta。另外,Go kit使用了一系列的持續整合的機制來確保在儘快地修複那些複雜問題。
5 相關項目
標註有 ★ 的項目對 Go kit 的設計有著特別的影響 (反之亦然)
-
服務架構
- gizmo, a microservice toolkit from The New York Times ★
- go-micro, a microservices client/server library ★
- gocircuit, dynamic cloud orchestration
- gotalk, async peer communication protocol & library
- h2, a microservices framework ★
- Kite, a micro-service framework
-
獨立組件
afex/hystrix-go, client-side latency and fault tolerance library
armon/go-metrics, library for exporting performance and runtime metrics to external metrics systems
codahale/lunk, structured logging in the style of Google’s Dapper or Twitter’s Zipkin
eapache/go-resiliency, resiliency patterns
sasbury/logging, a tagged style of logging
grpc/grpc-go, HTTP/2 based RPC
inconshreveable/log15, simple, powerful logging for Go ★
mailgun/vulcand, programmatic load balancer backed by etcd
mattheath/phosphor, distributed system tracing
pivotal-golang/lager, an opinionated logging library
rubyist/circuitbreaker, circuit breaker library
Sirupsen/logrus, structured, pluggable logging for Go ★
sourcegraph/appdash, application tracing system based on Google’s Dapper
spacemonkeygo/monitor, data collection, monitoring, instrumentation, and Zipkin client library
streadway/handy, net/http handler filters
vitess/rpcplus, package rpc + context.Context
gdamore/mangos, nanomsg implementation in pure Go
-
Web 架構
Beego
Gin
Goji
Gorilla
Martini
Negroni
Revel (considered harmful)
- ###其他參考
Architecting for the Cloud — Netflix
Dapper, a Large-Scale Distributed Systems Tracing Infrastructure— Google
Your Server as a Function (PDF) — Twitter