天天看點

hystrix-go服務降級和限流的實作

作者:石老師小跟班

前言

為啥會說到這個元件呢? 主要是最近再和某銀行項目進行接口對接,做過銀行項目的都懂吧,那接口的承載能力,是吧,有點讓人無語!每次出問題,都要人工介入,想想都刺激~,于是在網上查找一個hystrix-go元件, 可以幫我們解決一些問題

1. Hystrix

Hystrix 是由 Netflex 開發的一款開源元件,提供了基礎的熔斷功能。 Hystrix 将降級的政策封裝在 Command 中,提供了 run 和 fallback 兩個方法,前者表示正常的邏輯,比如微服務之間的調用……,如果發生了故障,再執行 fallback方法傳回結果,我們可以把它了解成保底操作。但是這個元件是為JAVA實作的,而hystrix-go元件是基于go 實作的 簡單版本;

疑問: 這個元件是沒有人維護了嗎?都4,5年沒有更新過了,有知道的小夥伴可以在底下留言告訴我哈!

2. Hystrix-go的基本使用

#安裝Hystrix-go元件
 go get github.com/afex/hystrix-go/hystrix           

2.1 源碼如下(這裡不是業務代碼,隻是一個示例)

package main
 
 import (
     "errors"
     "fmt"
     "github.com/afex/hystrix-go/hystrix"
     "github.com/gin-gonic/gin"
     "net/http"
     "time"
 )
 
 // 建立一個中間件
 func TestMiddleware(ctx *gin.Context) {
     hystrix.Do("baidu", func() error {
         ctx.Next()
         //這裡判斷的是傳回狀态
         code := ctx.Writer.Status()
         if code != 200 {
             return errors.New("status err")
         }
         return nil
     }, func(err error) error {
         if err != nil {
             //寫日志,發短信,發郵件等操作,這裡主要做些異常處理,進行補償操作
             ctx.JSON(500, gin.H{
                 "msg": "請求接口失敗",
             })
         }
         return nil
     })
 
 }
 func init() {
     hystrix.ConfigureCommand("baidu", hystrix.CommandConfig{
         Timeout:                int(time.Second * 10), //執行command的逾時時間
         MaxConcurrentRequests:  10,                    //執行command的最大并發量
         RequestVolumeThreshold: 100,                   //在統計視窗内的最大請求數量
         SleepWindow:            int(time.Second * 2),  //請求視窗
         ErrorPercentThreshold:  20,                    //錯誤百分比
 
     })
 }
 func main() {
     r := gin.Default()
     fmt.Println("abc")
     r.GET("/test", func(c *gin.Context) {
         //這裡以baidu為例,正常的話,就是你請求的那業務接口
         _, err := http.Get("https://www.baidu.com")
         if err != nil {
             c.JSON(500, gin.H{
                 "mes": err,
             })
             return
         }
         c.JSON(200, gin.H{
             "msg": "this is ok",
         })
     }, TestMiddleware)
     r.Run(":8888")
 }
            

總結

沒有啥知識點,這個元件使用起來還是比較簡單的 ,根據自己的業務需求來實作就可以了,

在對接第三方時,一定要評估好對方接口的承載能力,要不天天需要人工處理,真的會謝!!!!

繼續閱讀