作者:卜比
概述
随着 Go 言语、云原生的广泛选用,Go 言语在微服务场景中运用的越来越广泛,对 Go 言语微服务的管理、限流降级需求也越来越强。
在 Go 言语中,尽管社区供给了 go.uber.org/ratelimit 等限流库,但其一,对多言语支撑不足,只支撑 Go,其二,功能上,限流降级会细分为流控、阻隔、熔断、热门等功能,也不支撑动态装备,在功能支撑度上不行完善。
阿里云微服务引擎(MSE)结合 Sentinel,给 Go 言语、Java 言语运用带来微服务管理才能。本文将给咱们介绍如何在 Go 言语微服务运用中运用限流降级才能。
什么是限流降级
在微服务运用中,限流降级首要分为三步:
- Target: 针对什么样的流量
- Strategy: 限流降级的策略
- FallbackAction: 触发后的行为
比如,针对订单创立接口(Target),咱们约束恳求为 1000QPS(Strategy),触发限流后,恳求回来反常(FallbackAction)。
在阿里云 MSE 支撑经过开源 Sentinel 的方法来定义资源,并从 MSE 获取、运用限流降级规矩,整体接入如下:
如何运用 MSE限流降级
运用接入
- 下载 **MSE Go SDK [ 1] **,解压到项目的./pkg-custom/github.com/aliyun/aliyun-mse-go-sdk-v1.0.7 目录。
-
- 可以参阅 SDK 的 example 目录下的比如,来进行接入。
-
在 go.mod 文件中,添加如下依靠声明:
require (
github.com/aliyun/aliyun-mse-go-sdk v1.0.7
)
replace github.com/aliyun/aliyun-mse-go-sdk => ./pkg-custom/github.com/aliyun/aliyun-mse-go-sdk
- 在运用的发动过程中,添加 MSE SDK 初始化指令:
import (
mse_sdk "github.com/aliyun/aliyun-mse-go-sdk"
)
// 在运用的初始化逻辑中加入以下代码。
// Sentinel core的初始化包括在了这里面。假如之前有调用过Sentinel的初始化函数,需求去掉。
err := mse_sdk.InitMseDefault
if err != nil {
log.Fatalf("Failed to init MSE: %+v", err)
}
运用布置
在云原生布置方法中,一般的布置规范是12 因子 [ 2] ,其中关于装备,引荐将运用的装备存储于环境变量中。这样运用在布置时,只需求切换不同的环境变量,就可以接入不同的环境。
相同的,MSE-Go-SDK 也引荐咱们经过环境变量的方法接入 MSE,运用的环境变量如下:
依照上述步骤接入后,可以在运用列表页面看到咱们接入的运用:
资源定义
在文章开端的时候,咱们提到了限流降级=Target+Strategy+FallbackAction。所以第一步便是要定义 Target。
- Sentinel 定义资源
MSE 支撑用户经过 Sentinel 定义的资源,只需求用如下代码块包裹事务逻辑即可:
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()
}
当然,在日常的事务开发中,开发者常常经过微服务结构供给服务,比如 dubbo-go、Gin、gRPC 等,自然而然的,咱们希望可以将这些服务注册为资源:
- dubbo-go 方法定义资源
只需求引进 dubbo-go adaptor 即可主动注册资源到 MSE:
import (
_ "github.com/alibaba/sentinel-golang/adapter/dubbo"
)
-
Dubbo 运用是在代码中经过 import 包的方法引进 Dubbo adapter,其中的 init()函数会主动注入相关 filter。Dubbo-Go 版本需求≥1.3.0。Sentinel Dubbo adapter 会主动计算一切 provider 和 consumer 的调用。
-
gRPC运用接入
import (
sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/grpc"
"google.golang.org/grpc"
)
s := grpc.NewServer(grpc.UnaryInterceptor(sentinelPlugin.NewUnaryServerInterceptor()))
-
gRPC 运用在 gRPC 的初始化代码中引进 Sentinel 供给的 interceptor,Sentinel 针对 Server 和 Client 都供给了 unary 和 streaming 两种 interceptor,以上代码以 Server 端为例。默许的限流处理逻辑是回来 Sentinel 的 BlockError。您也可以在创立 interceptor 时供给自定义的 fallback 处理逻辑。
-
Gin Web 运用接入
import (
sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/gin"
"github.com/gin-gonic/gin"
)
r := gin.New()
r.Use(sentinelPlugin.SentinelMiddleware())
-
Gin Web 运用在 Gin 的初始化代码中引进 SentinelMiddleware。Sentinel 会对每个 API route 进行计算,资源名称类似于 GET:/foo/:id。默许的限流处理逻辑是回来 429 (Too Many Requests)错误码。
-
Micro运用接入
import (
sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/micro"
"github.com/micro/go-micro/v2"
)
svc := micro.NewService(micro.WrapHandler(sentinelPlugin.NewHandlerWrapper()))
- 在 Go-Micro 的初始化代码中引进 Sentinel 供给的 wrapper。Sentinel 针对 Go-Micro Server 和 Client 都供给了 wrapper。以上代码以 Server端为例。埋点默许会提取服务 method 作为资源名,默许的流控处理逻辑是回来 Sentinel 的 BlockError。您也可以在创立 wrapper 时供给自定义的 fallback 处理逻辑。
如何装备限流降级规矩
经过上述方法接入后,就可以装备流控规矩、阻隔规矩、熔断规矩、热门规矩等规矩了:
- 查看运用
接入后,可以在运用列表页面看到咱们接入的运用:
在运用概况页面,也可以看到运用的概览数据:
可以查看代码中注册的资源:
- 装备流控规矩
可以针对每种资源设置流控规矩:
设置流控规矩后,可以看到拒绝 QPS 添加、经过 QPS 减少:
挑选流控防护,可以预设服务可承受的 QPS 流量,当流量到达设定阈值时当即阻拦超出部分的恳求,避免运用被瞬时的流量高峰冲垮。
- 装备阻隔规矩
挑选阻隔防护,可以经过操控接口或依靠的并发线程数,来确保系统的稳定性。一般适用于运用内部或下游依靠呈现不稳定的场景,例如慢 SQL、下游运用呼应时刻变长等。
- 装备熔断规矩
挑选熔断防护,可以监控运用内部或许下游依靠的呼应时刻或反常比例,当到达指定的阈值时当即降低下游依靠的优先级。在指定的时刻内,系统不会调用该不稳定的资源,避免运用受到影响,从而保证运用高可用性。当指定时刻往后,再从头恢复对该资源的调用。
- 装备热门规矩
挑选热门参数防护,AHAS 将分析计算参数,即资源调用过程中的调用次数较高的参数,并依据装备的热门规矩对包括热门参数的资源调用进行限流,维护系统稳定性。热门即经常被拜访的数据。例如在以下场景中需求计算某个热门数据中拜访频次最高的 Top 数据,并对其拜访进行约束。
- 针对一段时刻内最频繁购买的商品 ID 进行约束,避免击穿缓存而导致很多恳求到数据库的情形。
- 针对一段时刻内频繁拜访的用户 ID 进行约束,避免歹意刷单。
MSE 微服务管理规划
OpenSergo 开源项目联合 Sentinel 项目,正在拟定、完善限流降级规范,方便不同言语运用经过一致操控面来实现一致的微服务管理。
阿里云微服务引擎(MSE)也会逐渐支撑 OpenSergo 规范,让微服务开发者可以运用 OpenSergo 来一致管理不同言语的微服务运用。
一起,阿里云 MSE 也会根据微服务管理进行探究,探究实现流量管理、限流降级、数据库管理、音讯管理等功能,给微服务开发者带来全生命周期的微服务管理。
MSE 注册装备中心专业版首购享 9 折优惠,MSE 云原生网关预付费全标准享 9 折优惠。点击此处,即享优惠!
参阅链接:
[1] MSE Go SDK:
mse-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/sdk/go/late…
[2] 12因子:
12factor.net/zh_cn/