dubbo服务配置sentinel

前言

    前几天ali开源了Sentinel项目,Sentinel中文意思是哨兵,做为dubbo的配套项目,看字面意思是dubbo的一个监控系统,sentinel本身的官方文档上是这样说的:Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。本文就是想简单的配置一下sentinel。java

准备

Sentinel的官方文档是放在 Sentinel官方文档地址,配合上一篇文章配置的dubbo项目,无需依赖其余的外部资源。git

开始

    在provider端的 pom.xml 文件中加入如下依赖:github

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>0.1.1</version>
</dependency>

  在sayHello服务的中嵌入Sentinel的代码:spring

public class SayHelloImpl implements SayHello {
    @Override
    public String sayHello(String name) {
        initFlowRules();
        Entry entry = null;
        try {
            entry = SphU.entry("HelloWorld");
            System.out.println("hello world");

            return "Hello " + name;
        } catch (BlockException e1) {
            System.out.println("exception is " + BlockException.isBlockException(e1));
            System.out.println("block!");
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
        return "";
    }

    private void initFlowRules() {
        List<FlowRule> rules = new ArrayList<FlowRule>();
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // Set limit QPS to 20.
        rule.setCount(5);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

      在上述代码中,把限流的方式设置为QPS = 5,而后改造下客户端的代码,进行20 次的调用:springboot

public class ConsumerApplication {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        SayHello sayHello = (SayHello) ctx.getBean("sayHello");
        for (int i = 0; i < 20; i++) {
            String s = sayHello.sayHello("张三");
            System.out.println(i + ":" + s);
        }
    }
}

   启动Provider端和Consumer端后,看到provider的后台打印的是:app

hello world
hello world
hello world
hello world
hello world
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!
exception is true
block!

     只有前五次的调用成功了,其余的都在报了BlockException。因此在限流的时候,能够经过在BlockException 中进行限流那些请求的访问逻辑处理。ide

    Sentinel其实有提供一套注解,实现代码零侵入,接下来把代码改为注解形式实现,增长Sentinel的注解依赖包:spa

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>0.1.1</version>
</dependency>

    启动类改为springboot启动,增长注解的启动配置:code

@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) throws IOException {
        SpringApplication.run(ProviderApplication.class,args);
        System.in.read();
    }

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        registryConfig.setClient("provider");
        return registryConfig;
    }
}
相关文章
相关标签/搜索