# 云药店流控平台

# 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 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

# 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

# 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

# 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

# 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

# 7 Vue request.js 前端处理异常

        case 429:
          err.message = '服务器繁忙,请稍后重试!'
          break
1
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

# 打个赏吧 点我,三毛五毛都是流水。