开发者学堂课程【精通 Spring Cloud Alibaba:秒杀接口整合 sentinel 实现热词限流】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/634/detail/10154
秒杀接口整合 sentinel 实现热词限流
目录:
一、热点参数限流:
二、何为热点?
三、框架怎么整合?
四、规则是怎么配置的?
首先找到官网:
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7892%B9%E5%8F%82%E6%9%99%90%E6%B5%81
一、热点参数限流:
对我们接口热词实现限流(就好比在做秒杀,对USID进行限流,每秒中最多限流几个QBS,限制热词做限流,)
在访问秒杀接口,一秒中访问这两个秒杀接口,这时候不算热词限流。因为如果说一秒中频繁把相同的参数去访问,这个算,如果一秒中访问两次,因为传的不同的userid,所以我们注意对相同的 userid 在一秒内当中去使用限流。
那么在这个 sentinel 当中有对热点的参数性有这个介绍。
二、何为热点
经常访问的数据对某一个参数频繁访问可以进行限制。
热点即经常访问的数据。很多时候我们希经统计菜个热点数据中访问频次最高的 TopK 数据,并对其访问进行限制。
比如:
- 商品ID 为参数,统计一段时间内很第购买的商品1D并进行限制
- 用户 ID 为参数,针对一段时间内频警访问的用户10进行限制
热点参数限流会統计传入於数中的热点谷数,井根据配買的限流凤们与模式,对包含热点参数的咨识调
用进行限流。热点参数限流可以石做是一种持殊的流量控制,仅对包含热点参数的资识调用生效。
三、框架怎么整合
整合 sentinel。在文件中首先要引入到 sentinel 架包。写一个秒杀的接口,加一个@restcontroller
写一个秒杀接口:
<dependency>
«groupId›org.springframework.cloud</groupId>
<artifactId›spring-cloud-alibaba-sentinel</artifactId›
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<cartifactId>spring-boot-starter-actuator</artifactId>
</dependency>
@restcontroller
public class seckillservice{
/**
*秒杀接口
*
*@reture
*/
@RequestMapping("/seckill")
public String seckill(long userId ,long order)
Return “面试成功”
}
首先这时候有 API
复制以下代码:
private void initSeckillRule(){
ParamFlowRule rule = new ParamFlowRule(SEKILL_RULE)
//对我们每个秒杀接口第0个参数实现限流
setParamIdx(0)
setGrade (RuleConstant. FLOW GRADE_QPS)
//每科QPS最委只有1SParamFlowRuleManager.loadRules(Collections.singletonList(rule));
1og.info(“>>>秒杀接口限流策略配置成功<<<");
四、规则是怎么配置的
首先定义限流配置规则,这边参数 ids 0。相当于对 userid 0参数实行限流。
如果想对 orderid 这个参数实行限流情况下,写1
显示限流的模式,肯定是 qbs,相当于相同的 userid 在每秒中只能访问一次秒杀接口。把我们的路由规则加再到内存里面去,组合也是可以的。
怎么把路由规则加载到内存里?
对象 survice 可以帮助初始化,走无参的构造函数,就能执行方法,而且对象只能初始化一次。
那么这时候我们测试一下秒杀的接口,成功之后,可以搜索一下日志。
可以访问秒杀的接口,点名8090.访问接口,传递到 userid 等于 orderd 等于99,这个时候没有引用。
需要写新代码:
@return
*/
@RequestMapping("/seckill")
public String seckill(Long userId, Long orderId) (
try {
Entry entry = SphU.entry(SEKILL_RULE, EntryType.IN, count: I, (userId)
}catch (Exception e){
首先我们会引入路由规则,这个地方相当于是入口,肯定写成in,这个1不是限流,在这个地方有 userid,相当于这个地方对 userid 实现一个限流,每秒只能访问一次;如果又想加 userid 和 orderid,其实很简单,再写一个 orderid。
这个里面是多个参数的,可以多个组合的。
如果说抛出异常的情况下,重写:
return "当前该用户访问频率过多,请稍后重试;在这个地方就能知道实现一个限流。
如果通过这种方式做限流,不灵活,如果要把规则改成2或者3,现在写成10,在路由规则变化的情况下。还需重启服务器。