springcloud笔记6——服务降级报警

需求实现的几个考虑重点:
  • 发生服务降级后向管理员发出警报
  • 考虑集群环境下需要报警哪台服务器哪个服务发生了降级
  • 同一个服务降级一个时间段内只发送一次警报,超过这个时间段任然存在再次警报
  • 服务降级发生的触发与发送短信任务应该是异步的
  • 基于集群通信和报警时效考虑,使用redis实现,如果将一个降级报警设置了过期时间,没过期不重发报警,需要考虑热点缓存问题

实现代码如下:

1,添加redis依赖
pom文件
    <!--Spring Boot与Redis整合依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
yml文件
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
2,修改处理器
    @Autowired
    private StringRedisTemplate template;

    //短信任务放入线程处理
    private ForkJoinPool pool = new ForkJoinPool(5);

    //原有的请求添加HttpServletRequest获取ip
    @HystrixCommand(fallbackMethod = "getHystrixHandle")
    @GetMapping("/get/{id}")
    public Depart getHandle(@PathVariable("id") int id, HttpServletRequest request) {
        return service.getDepartById(id);
    }

    //服务降级方法发送报警短信
    public Depart getHystrixHandle(@PathVariable("id") int id,
                                   HttpServletRequest request) {
        //指定存放到Redis中的key为 ip_发生降级的方法名
        String ip = request.getLocalAddr();
        String key = ip + "_getDepartById";
        alarm(key);

        Depart depart = new Depart();
        depart.setId(id);
        depart.setName("no this depart");
        return depart;
    }

    // 降级发生后的报警
    private void alarm(String key) {
        //获取Redis操作对象
        BoundValueOperations<String, String> ops = template.boundValueOps(key);
        String value = ops.get();
        //redis中不存在降级服务key时才发送短信,每次发送短信设置过期时间,时间到了再次发送
        //redis设置过期时间时必须考虑热点缓存问题,发送短信但还没有设置值时会重复进入方法发送短信,这里使用双重检测锁解决
        if(value == null) {
            synchronized (this) {
                value = ops.get();
                if(value == null) {
                    // 发送短信
                    sendFallbackMsg(key);
                    value = "已发生服务降级";
                    ops.set(value, 10, TimeUnit.SECONDS);
                }
            }
        }
    }

    // 使用线程池实现异步短信发送
    private void sendFallbackMsg(String key) {
        pool.submit(() -> {
            System.out.println("发送服务异常报警短信:" + key);
        });

    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很高兴能够为你提供关于Spring Cloud的笔记。Spring Cloud是一套基于Spring Boot的微服务框架,它提供了一系列开箱即用的工具和组件,帮助开发者快速构建和部署分布式系统。下面是一些关键的笔记要点: 1. 服务注册与发现:Spring Cloud提供了Eureka、Consul和Zookeeper等注册中心,用于服务的注册与发现,实现了服务之间的自动发现和负载均衡。 2. 服务调用:通过Spring Cloud的RestTemplate或Feign客户端,可以轻松实现服务之间的远程调用。Feign还支持声明式的服务调用,简化了代码的编写。 3. 负载均衡:Spring Cloud提供了Ribbon和LoadBalancer等组件,用于实现负载均衡。通过配置负载均衡策略,可以将请求分发到不同的服务实例上。 4. 服务容错:通过Hystrix或Sentinel等组件,可以实现服务的容错和熔断。当某个服务不可用时,可以快速失败或者返回默认值,保证整个系统的稳定性。 5. 配置中心:Spring Cloud Config提供了集中式的配置管理,可以将配置文件集中存储在Git、SVN等版本控制系统中,并实现配置文件的动态刷新。 6. 链路追踪:通过Spring Cloud Sleuth或Zipkin等工具,可以实现分布式系统的链路追踪和监控。可以了解每个请求经过的各个服务节点,便于排查和解决问题。 7. 消息驱动:Spring Cloud Stream和Spring Cloud Bus等组件,提供了消息驱动的方式来实现服务之间的解耦和异步通信。 这只是对Spring Cloud的一些简单介绍,希望能够帮助到你。如果有具体的问题或者需要进一步的资料,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

占星安啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值