Sentinel | 限流

2020-07-23  本文已影响0人  乌鲁木齐001号程序员

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 的日志

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

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

添加依赖
<!--    负责和 sentinel-dashboard 通信   -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.6.3</version>
</dependency>
告诉微服务 sentinel-board 的位置

以 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
资源的声明 | 注解的方式
@PostMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
@SentinelResource("createOrder")
public OrderInfo create(@RequestBody OrderInfo info, @AuthenticationPrincipal String username) {

    // 这里的代码就是资源 createOrder
    log.info("user is " + username);

    return info;
}
上一篇下一篇

猜你喜欢

热点阅读