Alibaba Sentinel流量控制的使用(一)

介绍

Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来保障微服务的稳定性。

一个资源可以使用多个控制规则。

控制规则

流量

使用场景:当你想限制某个方法或一段代码的访问数量、线程并发数量时使用。

public static void main(String[] args) throws InterruptedException {
    // 配置规则.
    initFlowRules();

    while (true) {
        Thread.sleep(100);

        // 开始进入名字叫HelloWord
        try (Entry entry = SphU.entry("HelloWorld")) {
            // 被保护的逻辑
            System.out.println("我是资源");
        } catch (BlockException ex) {
            // 处理被流控的逻辑
            System.out.println("blocked!");
        }
    }
}

/**
 * 定义资源访问的限制
 */
private static void initFlowRules(){
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule();
    // 定义需要被控制的资源名词
    rule.setResource("HelloWorld");
    // 按照每秒的请求数量来限制。也可以用 FLOW_GRADE_THREAD 限制并发数
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // 每秒执行多少次开始限制
    rule.setCount(5);
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}
熔断降级

在所设置的时间内,达到下面某一个条件时,发生熔断。

  1. 慢调用比例:统计一段时间的慢调用比例。慢调用是指请求超过你指定返回数据的时间。

  2. 异常比例:统计一段时间内异常占比。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

  3. 异常数量:超过指定的异常数量。

使用场景
当机器负载过高的时候,直接让服务失败或者不处理,避免雪崩情况发生。

熔断Demo

系统保护

系统自适应保护从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均返回时间 RT、入口 QPS*  和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统警卫Demo

来源访问

使用场景:只允许某些渠道来访问你定义的资源。

private static final String RESOURCE_NAME = "Store";

public static void main(String[] args) {
    System.out.println("========黑名单列表测试========");
    initBlackRules("appA,appB");
    testFor(RESOURCE_NAME, "appA");
    testFor(RESOURCE_NAME, "appB");
    testFor(RESOURCE_NAME, "appC");
    testFor(RESOURCE_NAME, "appE");

    System.out.println("========白名单列表测试========");
    initWhiteRules("appA,appB");
    testFor(RESOURCE_NAME, "appA");
    testFor(RESOURCE_NAME, "appB");
    testFor(RESOURCE_NAME, "appC");
    testFor(RESOURCE_NAME, "appE");
}

private static void testFor(/*@NonNull*/ String resource, /*@NonNull*/ String origin) {
    ContextUtil.enter(resource, origin);
    Entry entry = null;
    try {
        entry = SphU.entry(resource);
        System.out.println(String.format("通过资源 %s, 来源是 %s", resource, origin));
    } catch (BlockException ex) {
        System.err.println(String.format("封锁资源 %s, 来源是 %s", resource, origin));
    } finally {
        if (entry != null) {
            entry.exit();
        }
        ContextUtil.exit();
    }
}

/**
 * 设置白名单
 * @param limitApp 可以访问渠道
 */
private static void initWhiteRules(String limitApp) {
    AuthorityRule rule = new AuthorityRule();
    rule.setResource(RESOURCE_NAME);
    rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
    rule.setLimitApp(limitApp);
    AuthorityRuleManager.loadRules(Collections.singletonList(rule));
}

/**
 * 设置黑名单
 * @param limitApp 限制访问的渠道
 */
private static void initBlackRules(String limitApp) {
    AuthorityRule rule = new AuthorityRule();
    rule.setResource(RESOURCE_NAME);
    rule.setStrategy(RuleConstant.AUTHORITY_BLACK);
    rule.setLimitApp(limitApp);
    AuthorityRuleManager.loadRules(Collections.singletonList(rule));
}

官网了解更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值