將Go應用接入AHAS應用防護后,可以對其配置流控、隔離和系統規則來保證系統穩定性。本文介紹如何使用SDK方式將Go應用接入應用防護。
前提條件
確保Go應用的版本為1.13.0或以上,并通過Go Modules管理依賴。
Dubbo、Gin Web、gRPC、Mrcio應用接入步驟
- 登錄AHAS控制臺,然后在頁面左上角選擇地域。
- 在控制臺左側導航欄中選擇 。
在應用防護頁面右上角單擊新應用接入,然后在GO語言頁簽下,選擇SDK接入。
單擊下載AHAS Go SDK,然后將安裝包解壓到本地。
打開您的Go工程,并在go.mod文件中添加以下依賴。
說明/path/to/aliyun-ahas-go-sdk是示例路徑,請替換為Go SDK的解壓路徑。
請確保您的Go版本≥1.13.0,并開啟Go modules支持。
require github.com/aliyun/aliyun-ahas-go-sdk v1.0.0 #將后面的路徑替換為AHAS Go SDK解壓后的本地路徑。 replace github.com/aliyun/aliyun-ahas-go-sdk => /path/to/aliyun-ahas-go-sdk
添加AHAS Sentinel初始化命令,并在應用啟動時生效。
import ( ahas "github.com/aliyun/aliyun-ahas-go-sdk" ) // 在應用的初始化邏輯中加入以下代碼。 // Sentinel core的初始化包含在了這里面。如果之前有調用過Sentinel的初始化函數,需要去掉。 err := ahas.InitAhasDefault() if err != nil { log.Fatalf("Failed to init AHAS: %+v", err) }
使用以下代碼包住您的業務邏輯。示例代碼如下。
應用
示例代碼
Dubbo應用接入
import ( _ "github.com/alibaba/sentinel-golang/adapter/dubbo")
Gin Web應用接入
import ( sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/gin" "github.com/gin-gonic/gin")r := gin.New()r.Use(sentinelPlugin.SentinelMiddleware())
gRPC應用接入
import ( sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/grpc" "google.golang.org/grpc")s := grpc.NewServer(grpc.UnaryInterceptor(sentinelPlugin.NewUnaryServerInterceptor()))
Micro應用接入
import ( sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/micro" "github.com/micro/go-micro/v2")svc := micro.NewService(micro.WrapHandler(sentinelPlugin.NewHandlerWrapper()))
說明Dubbo應用是在代碼中通過import包的形式引入Dubbo adapter,其中的
init()
函數會自動注入相關filter。Dubbo-Go版本需要≥1.3.0。Sentinel Dubbo adapter會自動統計所有provider和consumer的調用。Gin Web應用在Gin的初始化代碼中引入SentinelMiddleware。Sentinel會對每個API route進行統計,資源名稱類似于GET:/foo/:id。默認的限流處理邏輯是返回
429 (Too Many Requests)
錯誤碼。gRPC應用在gRPC的初始化代碼中引入Sentinel提供的interceptor,Sentinel針對Server和Client都提供了unary和streaming兩種interceptor,以上代碼以Server端為例。默認的限流處理邏輯是返回Sentinel的BlockError。您也可以在創建interceptor時提供自定義的fallback處理邏輯。
在Go-Micro的初始化代碼中引入Sentinel提供的wrapper。Sentinel針對Go-Micro Server和Client都提供了wrapper。以上代碼以Server端為例。埋點默認會提取服務method作為資源名,默認的流控處理邏輯是返回Sentinel的BlockError。您也可以在創建wrapper時提供自定義的fallback處理邏輯。
配置AHAS,在項目目錄下新建sentinel.yml文件,配置文件內容如下。
類別
配置文件示例
非公網
version: "v1" sentinel: app: # 應用名,會顯示在AHAS控制臺,必須指定。 name: YourAppName # AppName只能包含字母、數字、以及以下特殊字符 _ - . : ahas: regionId: <RegionId> #Region環境需要填寫應用所在地域,公網環境不需要 namespace: default
公網
version: "v1" sentinel: app: #應用名,會顯示在AHAS控制臺,必須指定 name: "YourAppName" #AppName只能包含字母、數字、以及以下特殊字符 _ - . : ahas: license: <license> #license只有公網環境需要(如本機) regionId: "cn-public"
若在公網地域,需要查看License信息。請在GO語言頁簽查看(非公網地域不需要),具體請參見查看License。
重啟您的應用。
自定義埋點接入步驟
通過自定義埋點接入Go語言的步驟如下。
- 登錄AHAS控制臺,然后在頁面左上角選擇地域。
- 在控制臺左側導航欄中選擇 。
在應用防護頁面右上角單擊新應用接入,然后在GO語言頁簽下,選擇SDK接入。
單擊下載AHAS Go SDK,然后將安裝包解壓到本地。
打開您的Go工程,并在go.mod文件中添加以下依賴。
說明/path/to/aliyun-ahas-go-sdk是示例路徑,請替換為Go SDK的解壓路徑。
require github.com/aliyun/aliyun-ahas-go-sdk v1.0.0 replace github.com/aliyun/aliyun-ahas-go-sdk => /path/to/aliyun-ahas-go-sdk
添加import依賴。
import ( ahas "github.com/aliyun/aliyun-ahas-go-sdk" sentinel "github.com/alibaba/sentinel-golang/api" )
添加AHAS Sentinel初始化命令,并在應用啟動時生效。
// 在應用的初始化邏輯中加入以下代碼 // Sentinel core的初始化包含在了這里面。如果之前有調用過Sentinel的初始化函數,需要去掉。 err:= ahas.InitAhasDefault() if err!= nil{ log.Fatalf("Failed to init AHAS:%+v", err) }
使用以下代碼包住您的業務邏輯,埋點方法及示例請參見Sentinel Go API。
import ( sentinel "github.com/alibaba/sentinel-golang/api" ) // Entry方法用于埋點。 e, b := sentinel.Entry("your-resource-name", sentinel.WithTrafficType(base.Inbound)) if b != nil { // 請求被流控,可以從BlockError中獲取限流詳情。 } else { // 請求可以通過,在此處編寫您的業務邏輯。 // 務必保證業務邏輯結束后Exit。 e.Exit() }
使用以下任意一種方式配置AHAS Sentinel。
YAML文件配置。
AHAS支持的YAML配置項如下:
說明若通過
InitAhasFromFile(path)
初始化AHAS,則會從path指定的YAML文件中讀取配置項。若通過
InitAhasDefault()
初始化AHAS,則會嘗試從SENTINEL_CONFIG_FILE_PATH環境變量讀取path并讀取對應的文件。若未指定則默認從項目目錄下的sentinel.yml文件讀取配置。若均不存在,AHAS則會通過環境變量讀取基礎的配置(如項目名稱),其他配置項采用默認值。注意環境變量配置會覆蓋配置文件的配置。
Key
對應的YAML配置項
含義
備注
SENTINEL_APP_NAME
sentinel.app.name
項目名稱
必需的配置項,若不配置則標為
unknown_go_service
。SENTINEL_CONFIG_FILE_PATH
無
YAML配置文件路徑
若未指定則默認從項目目錄下的
sentinel.yml
文件讀取配置。AHAS_LICENSE
ahas.license
AHAS License
公網環境必需,Region環境不需要。
AHAS_NAMESPACE
ahas.namespace
AHAS命名空間
默認為Default。需在控制臺預先添加后配置,不可隨便指定。
SENTINEL_LOG_DIR
無
日志路徑
默認路徑為
~/logs/csp
。SENTINEL_LOG_USE_PID
無
日志文件是否帶Pid
默認為False。
AHAS_REGION_ID
ahas.regionId
AHAS地域
Region環境需要填寫應用所在地域,公網環境不需要。
配置文件示例:
類別
配置文件示例
非公網
sentinel: app: # 應用名,會顯示在AHAS控制臺,必須指定。 name: sentinel-go-service ahas: regionId: <RegionId> #Region環境需要填寫應用所在地域,公網環境不需要 namespace: default
公網
sentinel: app: name: sentinel-go-service # 應用名,會顯示在AHAS控制臺,必須指定。 ahas: license: "xxx" # license公網環境需要,阿里云Region的應用不需要。 regionId: "cn-public" namespace: default
配置環境變量。
類別
配置環境變量
非公網
SENTINEL_APP_NAME=應用名; AHAS_NAMESPACE=default; AHAS_REGION_ID=應用所在地域
公網
AHAS_LICENSE=${license}; AHAS_NAMESPACE=default; SENTINEL_APP_NAME=應用名; AHAS_REGION_ID=cn-public
Sentinel Go API
使用Sentinel的Entry API將業務邏輯封裝起來,這一步稱為埋點。每個埋點都有一個資源名稱(resource),代表觸發了這個資源的調用或訪問。
埋點API位于API包中,一般為Entry(resource string, opts ...Option) (*base.SentinelEntry, *base.BlockError)
,其中resource代表埋點資源名,opts代表埋點配置。目前支持以下埋點配置:
WithTrafficType(entryType base.TrafficType):標記該埋點資源的流量類型,其中Inbound代表入口流量,Outbound代表出口流量。若不指定,默認為Outbound。
WithResourceType(resourceType base.ResourceType):標記該埋點資源的分類。
WithAcquireCount(acquireCount uint32):標記每次觸發該埋點計為幾次調用(可以理解為batch count)。若不指定,默認為1。
WithArgs(args ...interface{}):埋點攜帶的參數列表,為熱點參數統計預留。
埋點API示例。
import (
sentinel "github.com/alibaba/sentinel-golang/api"
)
// Entry方法用于埋點。
e, b := sentinel.Entry("your-resource-name", sentinel.WithTrafficType(base.Inbound))
if b != nil {
// 請求被流控,可以從BlockError中獲取限流詳情。
} else {
// 請求可以通過,在此處編寫您的業務邏輯。
// 務必保證業務邏輯結束后Exit。
e.Exit()
}
若該次調用被拒絕,則Entry API會返回BlockError代表被Sentinel限流。BlockError提供了限流原因以及觸發的規則等信息,可以方便開發者獲取相關信息進行記錄和處理。
結果驗證
登錄AHAS控制臺,在左側導航欄選擇 ,若在應用防護頁面出現該應用的資源卡片且有數據上報,則說明接入成功。
相關操作
給Go SDK應用配置規則,目前支持流控規則(暫不支持集群流控)、隔離規則、降級規則、系統規則和熱點規則。