[轉]go-kit 入門



go-kit 入門

1. microservice

Go-Kit

go kit 是一個分佈式的開發工具集,在大型的組織(業務)中能夠用來構建微服務。其解決了分佈式系統中的大多數常見問題,所以,使用者能夠將精力集中在業務邏輯上。html

2. go-kit 組件介紹

2.1 Endpoint(端點)

Go kit首先解決了RPC消息模式。其使用了一個抽象的 endpoint 來爲每個RPC創建模型。git

endpoint經過被一個server進行實現(implement),或是被一個client調用。這是不少 Go kit組件的基本構建代碼塊。github

2.2 Circuit breaker(迴路斷路器)

Circuitbreaker(迴路斷路器) 模塊提供了不少流行的迴路斷路lib的端點(endpoint)適配器。迴路斷路器能夠避免雪崩,而且提升了針對間歇性錯誤的彈性。每個client的端點都應該封裝(wrapped)在迴路斷路器中。golang

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 模塊針對這些實踐提供了最好的設計。apache

2.6 Metrics(Instrumentation)度量/儀表盤

直到服務通過了跟蹤計數、延遲、健康情況和其餘的週期性的或針對每一個請求信息的儀表盤化,才能被認爲是「生產環境」完備的。Go kit 的 metric 模塊爲你的服務提供了通用並健壯的接口集合。能夠綁定到經常使用的後端服務,好比 expvar 、statsdPrometheusjson

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)api

3 目標

  • 在各類SOA架構中操做–預期會與各類非Go kit服務進行交互
  • 使用RPC做爲最主要的消息模式
  • 可插拔的序列化和傳輸–不只僅只有JSON和HTTP
  • 簡單即可融入現有的架構–沒有任何特殊工具、技術的相關指令

4 目標以外(不考慮作的事情)

  • 支持除RPC以外的消息模式(至少目前是)–好比 MPI、pub/sub,CQRS,等
  • 除適配現有軟件外,從新實現一些功能
  • 在運維方面進行評論:部署、配置、進程管理、服務編排等

5 依賴管理

Go kit 是一個函數庫,設計的目標是引入到二進制文件中。對於二進制軟件包的做者來說,Vendoring是目前用來確保軟件可靠、可從新構建的最好的機制。所以,咱們強烈的建議咱們的用戶使用vendoring機制來管理他們軟件的依賴,包括Go kit。

爲了不兼容性和可用性的問題,Go kit沒有vendor它本身的依賴,而且並不推薦使用第三方的引用代理。

有一些工具可讓vendor機制更簡單,包括 gbglidegvt、 govendor 和 vendetta。另外,Go kit使用了一系列的持續集成的機制來確保在儘快地修復那些複雜問題。

5 相關項目

標註有 ★ 的項目對 Go kit 的設計有着特別的影響 (反之亦然)

  1. 服務框架

    • 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
  2. 獨立組件

    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

  3. Web 框架

    Beego

    Gin

    Goji

    Gorilla

    Martini

    Negroni

    Revel (considered harmful)

  4. ###其餘參考

    Architecting for the Cloud — Netflix

    Dapper, a Large-Scale Distributed Systems Tracing Infrastructure — Google

    Your Server as a Function (PDF) — Twitter





go-kit 入門 (二) 第一個 Go kit 程序

下面讓我來們建立一個很是精簡的 Go kit 服務

業務邏輯邏輯

服務(Service)是從業務邏輯開始的,在 Go kit 中,咱們將服務以 interface 做爲模型

這個 interface 須要有一個「實現」

請求和響應

在 Go kit 中,主要的消息模式是 RPC。所以,接口( interface )的每個方法都會被模型化爲遠程過程調用(RPC)。對於每個方法,咱們都定義了請求和響應的結構體,捕獲輸入、輸出各自的全部參數。

端點 (endpoint)

Go kit 經過 endpoint 提供了很是豐富的功能。

一個端點表明一個RPC,也就是咱們服務接口中的一個函數。咱們將編寫簡單的適配器,將咱們的服務的每個方法轉換成端點。

傳輸(Transports)

如今咱們須要將服務暴露給外界,這樣它們才能被調用。對於服務如何與外界交互,你的組織可能已經有了定論。可能你會使用 Thrift、基於 HTTP 的自定義 JSON。Go kit支持多種開箱即用的 傳輸 方式。(Adding support for new ones is easy—just 對新方式的支持是很是簡單的。參見 這裏

針對咱們如今的這個微型的服務例子,咱們使用基於 HTTP 的 JSON。Go kit 中提供了一個輔助結構體,在 transport/http 中。




go-kit 入門(三)日誌和儀表化

日誌和儀表化

任何服務在日誌和儀表化沒有就緒的狀況下,都不能說是生產環境就緒的。

傳輸日誌

任何須要日誌記錄的組件都須要將 logger 做爲依賴,就像數據庫鏈接同樣。所以,咱們在 main 函數中構造 logger 對象,而後將其傳入須要使用它的組件中。咱們始終不去使用一個全局的 logger 對象。

咱們能夠直接將 logger 傳入到 stringService 的實現代碼中,可是,還有一個更好的方式。咱們可使用 中間件 (middleware) ,也經常被稱爲 裝飾者。

middleware 是一個函數,它接收一個 endpoint 做爲參數,而且返回一個 endpoint。

在函數中,它能夠作任何事情。下面就讓咱們來建立一個基本的日誌中間件。

而後,咱們將它加入到每個處理函數中。

事實證實,這項技術是很是有價值的,遠遠不止於記錄日誌,Go kit 的不少模塊都被實現爲端點中間件。

應用日誌

那麼,在咱們的應用中,應該如何記錄日誌呢?好比那些須要被傳入的參數等。事實上,咱們可以爲咱們的服務定義一箇中間件,從而得到一樣好的組合效果。因爲咱們的 StringService被定義爲一個接口,咱們只須要做出一個新的類型,來包裝先有的 StringService,讓它來執行擴充的記錄日誌的任務。

而後,將新的類型引入到下面的代碼中:

在傳輸環節使用端點中間件,好比迴路斷路器和速率限制。在業務環節使用服務中間件,好比日誌和儀表化。

儀表化

在 Go kit 中,儀表化意味着使用 包指標 來記錄關於服務運行行爲的狀態。統計執行的任務的數量,在請求完成後記錄消耗的時間,以及跟蹤全部正在執行的操做的數量,都被認爲是 儀表化。

咱們可使用一樣的中間件模式,在記錄日誌的環節咱們曾經用過。

而後將其引入到服務中:

stringsvc2

目前位置,完整的服務是 stringsvc2.




Go-kit 入門(四)服務調用

調用服務

存在「真空」(即極其獨立,與其餘任何服務無互相調用的關係)中的服務是罕見的。而咱們常見的是,咱們須要調用其餘的服務。這也是 Go kit 的閃光點 ,咱們提供了 傳輸中間件機制來解決可能出現的不少問題。

下面咱們將實現一個代理功能的中間件,做爲一個服務中間件。在這裏咱們只代理一個方法,Uppercase。

客戶端端點

咱們已經有了一個跟咱們所知道的徹底相同的端點,可是咱們將使用它來調用一個請求,而不是提供服務。按照這種方式來使用它的時候,咱們稱它爲客戶端端點。爲了調用客戶端端點,咱們須要作一些簡單的轉換。

如今,咱們爲了構造一個代理中間件,咱們將一個代理URL字符串轉換爲一個端點。加入咱們使用 HTTP 協議之上的 JSON,咱們可使用 transport/http 包中的一個輔助(helper)函數。

相關文章
相關標籤/搜索