dubbo服务配置sentinel

前言

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

准备

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

开始

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

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

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

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 次的调用:

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的后台打印的是:

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 中进行限流那些请求的访问逻辑处理。

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

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

    启动类改成springboot启动,增加注解的启动配置:

@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;
    }
}

 

转载于:https://my.oschina.net/u/3470849/blog/1934056

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值