SpringCloud(七) 微服务安全实战 Sentinel限流

Sentinel:

    是面向分布式服务架构的轻量级流量控制组件。可视化,集中化,动态化管理分布式服务架构下微服务的限流,熔断,降级规则。

限流代码:

pom.xml:
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.6.3</version>
</dependency>
//可视化插件
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.6.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>

配置文件 applicatoin.yml:
spring:
    application:
        name: orderApi
    cloud:
        sentinel:
            transport:
                port: 8719
                dashboard: localhost:8080

微服务系统:
@RestController
@RequestMapping("/orders")
@Slf4j
@SentinelResource("createOrder",blockHandler= "doOnBlock" /*降级方法*/)  //需要限流
public class OrderController {

    //降级
    public OrderInfo doOnBlock(@RequestBody OrderInfo info,@AuthenticationProncipal String username,BlockException exception){
    log.info("blocked by " + exception.getClass().getSimpleName());
    return info;
}

    @PostMapping
    public OrderInfo create(@RequestBody OrderInfo info, @AuthenticationPrincipal String username) throws BlockException {
        log.info("user is" + username);
        Thread.sleep(50);
        return info;
    }
}

限流声明:
@Component
public class SentinelConfig implements ApplicationListener<ContextRefreshedEvent> {

    //声明规则
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        FlowRule rule = new FlowRule();
        rule.setResource("createOrder");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);  //每秒请求的数量
        rule.setCount(10);  //每秒只允许1个请求
        ArrayList<FlowRule> rules = new ArrayList<FlowRule>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);  //加入Manager

        //熔断降级
        DegradeRule degradeRule = new DegradeRule(); //降级规则
        degradeRule.setResource("createOrder"); //只针对createOrder起作用
        degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT); //降级策略
        degradeRule.setCount(10); //阈值:响应时间超过10ms就记一次超时数
        degradeRule.setTimeWindow(10);  //10s内熔断打开,之后进入半打开
        degradeRule.setLimitApp("app");  //限流只针对某个app
        List<DegradeRule> degradeRules = new ArrayList<DegradeRule>();
        degradeRules.add(degradeRule);
        DegradeRuleManager.loadRules(degradeRules);
    }
}

熔断器原理:

热点和系统规则:

    同一个资源,针对不同的参数,设置不同的流量规则。

sentinel持久化:

    利用zookeeper,applo,Nacos配置中心实现。以zookeeper为例:

    

    1.下载zookeeper

        zookeeper.apache.org/releases.html --> download -> stable

    2.运行zookeeper

        ./zkServer.sh start

    3.下载sentinel源码,切换到1.6对应版本分支,导入sentinel-dashboard文件到项目

    4.去掉pom.xml中for Zookeeper rule publisher sample的<scope>test</scope>

    5.把test/java中的zookeeper包中的文件拷贝到src/main/java/dashboard/rule/zookeeper下

    6.把controller/v2中的@Qualifier("flowRuleDefaultPublisher") 替换为 @Qualifier("flowRuleZookeeperProvider")

    7.修改配置文件启动端口:server.port = 8082

    8.修改前端页面sidebar.html中的dashboard.flowV1去掉V1

pom.xml:
<dependency>
     <groupId>com.alibaba.csp</groupId>
     <artifactId>sentinel-datasource-zookeeper</artifactId>
     <version>1.5.2</version>
</dependency>

application.tml:
sentinel:
  zookeeper:
    address: 127.0.0.1:2181
    path: /sentinel_rule_config

SentinelConfig:
@Component
public class SentinelConfig{

    @Value("${sentinel.zookerper.address}")
    private String zkServer;

    @Value("${sentinel.zookerper.path}")
    private String zkPath;

    @Value("${sentinel.application.name}")
    private String appName;

    @PostConstruct //类加载出来就去读取规则
    public void loadRules(){
        //规则zookeeper数据读取存入数据源
        ReadableDataSource<String,List<FlowRole>> flowRuleDataSource = new ZookeeperDataSource<>(zkServer,zkPath+"/"+appName,source -> JSON.parseArray(source,FlowRule.class));
        //从数据源拿到相应的properties
        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值