# 云药店流控平台
# Context
近日, 江西 吉林 沈阳 内蒙古等地频频出现中心端超时引起服务卡顿情况, 给客户带来非常不好的体验, 同时也消耗着开发人员的精力。
为给用户提供更合理的人机交互, 提高用户体验, 减少单边账, 同时也能更好锁定超时问题, 部署云药店流控平台。
超时流控策略: 熔断
月初药店对账,流量陡增,大量并发访对服务硬件不断冲击,卡顿频频,严重导致宕机。目前对策只有实时杀进程和关闭入口。
为避免对账功能对整个应用的影响, 对其削峰限流, 保证对账期间服务整体可用性。
对账流控策略: 限流
PS: 对账流控根据需要,参数值(QPS)需要经过现场压测得出
各地维护老师结合流量和网络情况进行参数调整,如有疑问与我联系,欢迎提出新的使用场景和意见。
// to do
内蒙古 沈阳 吉林 江西 兵团作为第一批,请负责人按照下面步骤修改代码,在测试环境试用,我配合部署。
看情况有需要我进行集中讲解,更新使用场景。

# 服务器部署
[服务和脚本] 点击下载(http://10.9.48.91:7777/ftp/zhangxu-neu/sentinel/) (opens new window)
环境 4G内存 约定统一放置于 /home/neusoft/monitor/ 目录下
访问 http://ip:7011/ (opens new window) 用户密码 drugstore/drugstore
# 工程适配
# 1 pom.xml 增加如下配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2 Java ApplicationStart.java 增加NacosDiscoveryPropertiesAutoConfiguration.class
@SpringBootApplication(exclude = {AuthenticatedUserServiceAutoConfiguration.class,NacosDiscoveryPropertiesAutoConfiguration.class})
1
# 3 Java 修改ncp-ds-aincommon工程下 AinWebConfig.java为如下代码
@Configuration //james.xu modify it for a big bug
public class AinWebConfig implements WebMvcConfigurer {
@Autowired
private AinInterceptor ainIntercepto;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(ainIntercepto);
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 4 Java 在发送请求的方法上加入注解 @SentinelResource... 和返回函数
// HttpUtils.java
@SentinelResource(value = "CenterTimeOutHint",blockHandler = "blockHandler",exceptionsToIgnore = NullPointerException.class)
public static String httpPost(String urlStr,String paraStr) throws RuntimeException {
....
}
public static String blockHandler(BlockException e){
throw new RuntimeException("中心超时过多, 请稍后再试");
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 5 Nacos 修改dbConfig.yml配置
spring:
cloud:
sentinel:
transport:
port: 8721
dashboard: 172.22.111.248:7011 # 需要替换的地址
datasource:
ds1:
nacos:
serverAddr: ${spring.cloud.nacos.discovery.server-addr}
groupId: DEFAULT_GROUP
dataId: ${spring.application.name}-sentinel-flow
ruleType: flow
data-type: json
ds2:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
groupId: DEFAULT_GROUP
dataId: ${spring.application.name}-sentinel-degrade
rule-type: degrade
data-type: json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 6 在nacos上创建如下图配置文件 ncp-ds-rtp-sentinel-flow 和 ncp-ds-rtp-sentinel-degrade

# ncp-ds-rtp-sentinel-flow
// json 每秒最多通过20个对账请求
[
{
"resource":"/api/rtp/yb/totalAccountCompare",
"limitApp":"default",
"grade":1,
"count":20,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# ncp-ds-rtp-sentinel-degrade
// json 3分钟内达到30个请求以上,当响应时长超过30秒的请求数量大于15个的时候进行熔断5秒
[
{
"resource": "CenterTimeOutHint",
"count": 30000,
"timeWindow": 5,
"grade": 0,
"minRequestAmount": 30,
"slowRatioThreshold": 0.5,
"statIntervalMs": 18000
}
]
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 7 Vue request.js 前端处理异常

case 429:
err.message = '服务器繁忙,请稍后重试!'
break
1
2
3
2
3
# 熔断降级规则说明
流量控制规则(FlowRule)
resource :资源名,资源名是限流规则的作用对象,比如请求资源 getUser 。
grade :限流阈值类型,QPS 或线程数模式。0表示线程数,1表示QPS。默认为1,即 QPS 模式
count :限流阈值。比如值为2表示1秒超过2个请求就限流。
strategy :流控模式:直接、链路、关联,默认 直接 。0表示直接,1表示关联,2表示链路。
controlBehavior :流控效果(直接拒绝 / 排队等待 / 慢启动模式),0表示快速失败,1表示Warm Up,2表示排队等待。
limitApp :流控针对的调用来源。默认就是 default ,代表不区分调用来源.
熔断降级规则 (DegradeRule)
resource :资源名,资源名是限流规则的作用对象,比如请求资源 getUser 。
grade :熔断策略,支持慢调用比例/异常比例/异常数策略。1:慢调用比例,2:异常比例,3:异常数。默认为1,慢调用比例。
count :慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值。
timeWindow :熔断时长,单位为秒。
minRequestAmount :熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断。默认为 5 。
statIntervalMs :统计时长(单位为 ms),如 60*1000 代表分钟级。默认为 1000 ms。
slowRatioThreshold :慢调用比例阈值,仅慢调用比例模式有效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17