美文网首页
Sentinel | 限流

Sentinel | 限流

作者: 乌鲁木齐001号程序员 | 来源:发表于2020-07-23 12:43 被阅读0次

    Sentinel

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

    非 Springboot 方式 | 使用步骤

    依赖
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-core</artifactId>
        <version>1.6.3</version>
    </dependency>
    
    定义资源 | 限流规则
    @PostMapping
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public OrderInfo create(@RequestBody OrderInfo info, @AuthenticationPrincipal String username) {
    
        // 声明了一个叫 createOrder 的资源
        try (Entry entry = SphU.entry("createOrder")) {
            // 这里的代码就是资源 createOrder 
            log.info("user is " + username);
        } catch (BlockException e) {
            log.info("Blocked!");
        }
    
        return info;
    }
    
    定义规则
    • 为定义的资源制定规则:限流规则、熔断规则、降级规则;
    package com.lixinlei.security.order.config;
    
    import com.alibaba.csp.sentinel.slots.block.RuleConstant;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    import org.springframework.stereotype.Component;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * ContextRefreshedEvent 在 Springboot 项目成功启动完,所有的 Bean 都组装好之后,会触发;
     */
    @Component
    public class SentinelConfig implements ApplicationListener<ContextRefreshedEvent> {
    
        /**
         * 整个系统启动好了之后,会这行整个方法;
         * 这里要声明一个规则;
         * 这里是用代码的方式控制规则的制定,这种方式的控制程度是最高的,所有的细节都可以控制,缺点就是麻烦;
         * @param contextRefreshedEvent
         */
        @Override
        public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
    
            // 一个流量的规则
            FlowRule rule = new FlowRule();
            // 这个规则针对哪个资源
            rule.setResource("createOrder");
            // 这个规则的类型:每秒请求的数量
            rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
            // 每秒只能有 1 个请求过去
            rule.setCount(1);
    
            List<FlowRule> rules = new ArrayList<FlowRule>();
            rules.add(rule);
    
            FlowRuleManager.loadRules(rules);
    
        }
    
    }
    

    Sentinel 的日志

    • Sentinel 日志的保存路径是:~/logs/csp
    • /home/lixinlei/logs/csp/sentinel-record.log.2020-07-23.0 中的日志记录的 Sentinel 规则的生成;
    • /home/lixinlei/logs/csp/com-lixinlei-security-order-OrderApplication-metrics.log.2020-07-23.1 中纪律的是流量详情,后面的几个数字的含义依次是:| 总共放过去几个请求 | 这 1 秒内拒绝的请求 | 这 1 秒内成功响应的请求数 | 这 1 秒内响应失败的请求数 | 响应的时间 | 不知道 | 不知道 | 不知道
    1595471230000|2020-07-23 10:27:10|createOrder|1|0|1|0|8|0|0|0
    1595471231000|2020-07-23 10:27:11|createOrder|1|0|1|0|0|0|0|0
    1595471232000|2020-07-23 10:27:12|createOrder|1|1|1|0|0|0|0|0
    1595471233000|2020-07-23 10:27:13|createOrder|0|1|0|0|0|0|0|0
    1595471234000|2020-07-23 10:27:14|createOrder|1|1|1|0|0|0|0|0
    

    Sentinel Dashboard

    • 从 Github 上下载 sentinel-dashboard-1.6.3.jar,这个 jar 包本身就是 Springboot 写的一个 Web 项目;
    • 启动命令:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar
    • 默认用户名密码:sentinel:sentinel;

    把自己的项目接到 sentinel-dashboard 上

    添加依赖
    <!--    负责和 sentinel-dashboard 通信   -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-transport-simple-http</artifactId>
        <version>1.6.3</version>
    </dependency>
    
    告诉微服务 sentinel-board 的位置
    • 通过 JVM 参数传递:-Dcsp.sentinel.dashboard.server=localhost:8080
    • 微服务启动后,在第一次访问微服务后,才能在 sentinel-dashboard 上看到微服务的监控信息,显示的应用名是微服务启动类的名字;

    以 Springboot 的方式将 sentinel 引入微服务

    依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        <version>0.9.0.RELEASE</version>
    </dependency>
    
    application.yml
    spring:
      application:
        # sentinel-bashboard 中会显示这个名字
        name: orderApi
      cloud:
        sentinel:
          transport:
            # 在 9080 启动 orderApi 的时候,sentinel 还会在 8719 这个端口起一个服务和 sentinel-dashboard 通信(发心跳)
            port: 8719
            # sentinel-dashboard 的地址
            dashboard: localhost:8082
    
    资源的声明 | 注解的方式
    • 整个方法作为一个资源,资源名是:createOrder;
    • 此时如果启动微服务,请求如果太快,就会返回 500,不同于之前不是 Springboot 方式整合 sentinel 的时候,抛出的异常在 Controller 的方法中 try...catch 了,这里没有,所以会返回 500;
    @PostMapping
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @SentinelResource("createOrder")
    public OrderInfo create(@RequestBody OrderInfo info, @AuthenticationPrincipal String username) {
    
        // 这里的代码就是资源 createOrder
        log.info("user is " + username);
    
        return info;
    }
    

    相关文章

      网友评论

          本文标题:Sentinel | 限流

          本文链接:https://www.haomeiwen.com/subject/xchxlktx.html