阿里云 MSE 支持 Go 语言流量防护
简介: OpenSergo 开源项目联合 Sentinel 项目,正在制定、完善限流降级标准,方便不同语言应用通过统一控制面来实现统一的微服务治理。阿里云微服务引擎(MSE)也会逐步支持 OpenSergo 标准,让微服务开发者能够使用 OpenSergo 来统一治理不同语言的微服务应用。同时,阿里云 MSE 也会基于微服务治理进行探索,探索实现流量治理、限流降级、数据库治理、消息治理等功能,给微服务开发者带来全生命周期的微服务治理。
作者:卜比
概述
随着 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:
https://mse-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/sdk/go/latest/aliyun-mse-go-sdk.zip
[2] 12因子:
阿里云 MSE 支持 Go 语言流量防护的更多相关文章
- WebLogic Server再曝高风险远程命令执行0day漏洞,阿里云WAF支持免费应急服务
6月11日,阿里云安全团队发现WebLogic CVE-2019-2725补丁绕过的0day漏洞,并第一时间上报Oracle官方, 6月12日获得Oracle官方确认.由于Oracle尚未发布官方补丁 ...
- 配置阿里云ECS支持IPv6,解决苹果app审核失败问题
前几天iOS的App提交给苹果审核没通过,给出的原因是:该应用在 IPv6 的环境下无法使用.检查发现:阿里云优化过的系统没有启用IPv6协议,需要配置启用一下,但是只单独启用IPv6也是无法直接提供 ...
- 阿里云不支持stmp 的25端口,必须
第一种方法 到阿里云解封25端口 特别注意阿里云的<25端口使用服务协议>: 我/我公司承诺并保证TCP 25端口仅用来连接第三方的SMTP服务器,从第三方的SMTP服务器外发邮件. ...
- 关于阿里云ESC上go语言项目编译6l: running gcc failed: Cannot allocate memory
(1)前段时间将自己的阿里云服务器上的系统由centos 6.5换为了ubuntu 14,其他的硬件配置都没有发生改变,将服务器上的数据恢复并且重新安装了golang的编译环境后,发现使用go bui ...
- 阿里云线上ROS静态路由转发,有大坑。
原因见上去,阿里云不支持VPC中转流量,VPC1和VPC2都在国内,VPC3在香港,如果按阿里云的做法,必须付费2次国际隧道的钱,才可以实现三个VPC互通.明显很浪费钱. 所以我们只能在三个VPC,各 ...
- 阿里云 OSS 如何设置防盗链, 上个月图床流量耗费50G+,请求次数10W+,什么鬼?
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- 阿里云 RDS for MySQL支持什么引擎
问题:我们的服务器是买的是阿里云,mysql版本5.011 ,本地和服务器配置一样,在本地可以安装discuzX3.4,但是在服务器上却报错了,如下图: 找了半天,才知道阿里云RDS 支持的mysql ...
- 可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking
可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking 对Skywalking有兴趣的同学参见:年轻人的第一个APM-Skywalking 之前在搭建Skywalki ...
- 阿里云正式上线移动直播问答解决方案,助力APP尽情“撒币”!
2018年伊始,互联网圈就刮起了一阵"大佬狂撒币,网友喜答题"的热潮.以映客芝士超人等为代表的直播问答平台,通过答题分奖金的互动模式,迅速引爆网络热点.随后,多个直播和视频平台也上 ...
- 开源PaaS工具CloudFoundry落地阿里云
原文:https://yq.aliyun.com/articles/292815?utm_content=m_37457 云计算技术的不断成熟和完善,尤其是IaaS平台的不断发展,使得越来越多的企业和 ...
随机推荐
- python queue join task_done的概念及实例解析
一 概念 Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 Queue.join() 实际上意味着等到队列为空,再执行别的 ...
- 逆向通达信Level-2 续四 (调试level2数据接口)
逆向通达信Level-2 续十一 (无帐号登陆itrend研究版) 逆向通达信Level-2 续十 (trace脱壳) 逆向通达信Level-2 续九 (无帐号打开itrend研究版) 逆向通达信Le ...
- Android 使用系统JAR包
项目开发过程中,经常有需要到系统jar包,导入系统jar包后,发现无法正常编译通过,针对此问题,下文简述下如何导入framework.jar ,并正常使用 1.导入framework.jar ,使用c ...
- Ubuntu(Linux) PyQt5 QtUIFile 转换为 PythonModule (pyuic.py/pyuic脚本)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 3DCAT投屏功能升级,助力企业营销与培训
3DCAT实时渲染云推出以来,深受广大客户的喜爱,3DCAT也一直根据客户的反馈优化我们的产品. 但是这段时间来,不同行业的客户都反馈着同一个问题. 汽车销售顾问:"什么时候支持投屏功能呢, ...
- Smtp Oauth With Python
我的博客园:https://www.cnblogs.com/CQman/ GitHub #基于Python语言的smtp Oauth 连接世纪互联运营的Office 365(或21V O365)的邮箱 ...
- 记录--使用Vue开发Chrome插件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 环境搭建 Vue Web-Extension - A Web-Extension preset for VueJS (vue-web-ex ...
- vue初学核心基础
一.初识vue 1.vue的使用 导入vue之后创建vue模块,el属性表示控制区域的id名称,data表示该区域内的数据 在vue中我们都是用表中模板的标准语法来传递数据 <head> ...
- vector优化
C++的stdvector使用优化 #include<iostream> #include<vector> using namespace std; class Vectex ...
- #虚树,树形dp#洛谷 4103 [HEOI2014]大工程
题目 分析 建一棵虚树,然后树形dp,维护最长/短链和次长/短链, 对于第一个就是统计每条边有多少个点对经过就可以了 代码 #include <cstdio> #include <c ...