private static void initFlowQpsRule() { List rules = new ArrayList(); FlowRule rule1 = new FlowRule(); rule1.setResource("hello"); rule1.setCount(4); rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD); rule1.setLimitApp("default"); rules.add(rule1); FlowRuleManager.loadRules(rules); }
public static void main(String[] args) { initFlowQpsRule();
for (int i = 0; i < 100; i++) {
new Thread(()->{
entry();
}).start();
}
}
public static void entry() { Entry methodA = null; try { methodA = SphU.entry("hello"); System.out.println(Thread.currentThread().getName() + "访问到系统资源"); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + "退出"); } catch (BlockException e1) { System.out.println(Thread.currentThread() + "被限流了"); } catch (Exception e2) { } finally { if (methodA != null) { methodA.exit(); } } }
如上文:设置了并发阈值为4,开启100个线程同时访问。结果都访问到资源,没有被限流
Thread-16访问到系统资源 Thread-97访问到系统资源 Thread-7访问到系统资源 Thread-48访问到系统资源 Thread-78访问到系统资源 Thread-17访问到系统资源 Thread-73访问到系统资源 Thread-96访问到系统资源 Thread-23访问到系统资源 Thread-98访问到系统资源 Thread-13访问到系统资源 Thread-12访问到系统资源 Thread-5访问到系统资源 Thread-74访问到系统资源 Thread-19访问到系统资源 Thread-90访问到系统资源 Thread-53访问到系统资源 Thread-50访问到系统资源 Thread-71访问到系统资源 Thread-0访问到系统资源 Thread-34访问到系统资源 Thread-1访问到系统资源 Thread-93访问到系统资源
原提问者GitHub用户WuJingLearn
应该跟初始化过程没关系,初始化后符合预期可能是并发不够,增大并发 `public class Hi {
private static void initFlowQpsRule() { List rules = new ArrayList(); FlowRule rule1 = new FlowRule(); rule1.setResource("hello"); rule1.setCount(4); rule1.setGrade(RuleConstant.FLOW_GRADE_QPS); rule1.setLimitApp("default"); rules.add(rule1); FlowRuleManager.loadRules(rules); }
public static void main(String[] args) throws BlockException { initFlowQpsRule(); int thread=20; CountDownLatch latch=new CountDownLatch(thread); SphU.entry("hello"); for (int i = 0; i < thread; i++) { new Thread(()->{ latch.countDown(); try { latch.await(); entry(); } catch (InterruptedException e) { e.printStackTrace(); }
}).start();
}
}
public static void entry() { Entry methodA = null; try { methodA = SphU.entry("hello"); System.out.println(Thread.currentThread().getName() + "访问到系统资源"); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + "退出"); } catch (BlockException e1) { System.out.println(Thread.currentThread() + "被限流了"); } catch (Exception e2) { } finally { if (methodA != null) { methodA.exit(); } } }
原回答者GitHub用户PepoRobert
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。