将Go应用接入AHAS应用防护后,可以对其配置流控、隔离和系统规则来保证系统稳定性。本文介绍如何使用SDK方式将Go应用接入应用防护。

前提条件

确保Go应用的版本为1.13.0或以上,并通过Go Modules管理依赖。

Dubbo、Gin Web、gRPC应用接入步骤

  1. 登录AHAS控制台,然后在页面左上角选择地域
  2. 在控制台左侧导航栏中选择流量防护 > 应用防护
  3. 应用防护页面右上角单击新应用接入,然后在GO语言页签下,选择SDK接入
  4. 单击下载AHAS Go SDK,然后将安装包解压到本地。
  5. 打开您的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
  6. 添加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)
    }
  7. 使用以下代码包住您的业务逻辑。示例代码如下。
    import (
      _ "github.com/alibaba/sentinel-golang/adapter/dubbo"
    )
    import (
      sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/gin"
      "github.com/gin-gonic/gin"
    )
    
    r := gin.New()
    r.Use(sentinelPlugin.SentinelMiddleware())
    import (
      sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/grpc"
      "google.golang.org/grpc"
    )
    
    s := grpc.NewServer(grpc.UnaryInterceptor(sentinelPlugin.NewUnaryServerInterceptor()))
    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处理逻辑。
  8. 配置AHAS,在项目目录下新建sentinel.yml文件,配置文件内容如下。
    version: "v1"
    sentinel:
      app:
        # 应用名,会显示在 AHAS 控制台,必须指定。
      # AppName 只能包含字母、数字、以及以下特殊字符 _ - . :
        name: YourAppName 
    
    version: "v1"
    sentinel:
      app:
        #应用名,会显示在AHAS控制台,必须指定。
      #AppName只能包含字母、数字、以及以下特殊字符 _ - . :
        name: "YourAppName"
    #license只有公网环境需要(如本机)。
    ahas:
      license: <license>

    若在公网地域,需要查看License信息。请在GO语言页签查看(非公网地域不需要),具体请参见查看License

    Go license
  9. 重启您的应用。

自定义埋点接入步骤

通过自定义埋点接入Go语言的步骤如下。

  1. 登录AHAS控制台,然后在页面左上角选择地域
  2. 在控制台左侧导航栏中选择流量防护 > 应用防护
  3. 应用防护页面右上角单击新应用接入,然后在GO语言页签下,选择SDK接入
  4. 单击下载AHAS Go SDK,然后将安装包解压到本地。
  5. 打开您的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
  6. 添加import依赖。
    import (
      ahas "github.com/aliyun/aliyun-ahas-go-sdk"
      sentinel "github.com/alibaba/sentinel-golang/api"
    )
  7. 添加AHAS Sentinel初始化命令,并在应用启动时生效。
    // 在应用的初始化逻辑中加入以下代码
    // Sentinel core的初始化包含在了这里面。如果之前有调用过Sentinel的初始化函数,需要去掉。
    
    err:= ahas.InitAhasDefault()
    if err!= nil{
      log.Fatalf("Failed to init AHAS:%+v", err)
    }
  8. 使用以下代码包住您的业务逻辑,埋点方法及示例请参见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()
    }
  9. 使用以下任意一种方式配置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。

      配置文件示例:

      sentinel:
        app:
          # 应用名,会显示在AHAS控制台,必须指定。
      name: sentinel-go-service
      sentinel:
        app:
      # 应用名,会显示在AHAS控制台,必须指定。
      name: sentinel-go-service
      # license公网环境需要,阿里云Region的应用不需要。
      ahas:
        license: "xxx"
    • 配置环境变量。
      SENTINEL_APP_NAME=应用名
      AHAS_LICENSE=${license}; SENTINEL_APP_NAME=应用名

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控制台,在左侧导航栏选择流量防护 > 应用防护,若在应用防护页面出现该应用的资源卡片且有数据上报,则说明接入成功。

应用防护.png

相关操作

给Go SDK应用配置规则,目前支持流控规则(暂不支持集群流控)、隔离规则、降级规则、系统规则和热点规则。