zoukankan      html  css  js  c++  java
  • 使用idea从零编写SpringCloud项目-Hystrix

    ps:Hystrix和Fegin里面使用的Hystrix,有些许区别.我理解的是Fegin.Hystrix主要是用于消费方在调用服务方接口时的异常处理,返回兜底数据等,而Hystrix则是消费方自己本身发生了异常时的处理

    c

    熔断:
            保险丝,熔断服务,为了防止整个系统故障,包含子和下游服务

            下单服务 -》商品服务
                    -》用户服务 (出现异常-》熔断)

        降级:
            抛弃一些非核心的接口和数据

            旅行箱的例子:只带核心的物品,抛弃非核心的,等有条件的时候再去携带这些物品

            
        熔断和降级互相交集
            相同点:
                1)从可用性和可靠性触发,为了防止系统崩溃
                2)最终让用户体验到的是某些功能暂时不能用

            不同点
                1)服务熔断一般是下游服务故障导致的,而服务降级一般是从整体系统负荷考虑,由调用方控制

    1.引入依赖

     <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>

    2.启动类增加注解@EnableCircuitBreaker

     3.在需要使用熔断器的方法上增加注解@HystrixCommand(fallbackMethod = "saveOrderFail")

      

     @RequestMapping("save")
        @HystrixCommand(fallbackMethod = "saveOrderFail")
        public Object save(@RequestParam("user_id")int userId,@RequestParam("product_id")int productId){
          
        };

    4.编写saveOrderFail方法

    //方法签名要和api一致
        public Object saveOrderFail(int userId,int productId){
            //写下你期望用户请求失败之后返回的操作 TODO
        }

    5.老师的思路,实在这里引入redis,一定时间就发送短信,邮件,或者打电话通知开发人员并且带上IP地址,需要定位问题,

     //方法签名要和api一致
        public Object saveOrderFail(int userId,int productId){
            Map<String, Object> msg = new HashMap<>();
    
            //监控报警
            String saveOrderKey = "save-order";
    
            String sendValue = stringRedisTemplate.opsForValue().get(saveOrderKey);
            /**
             * 熔断告警机制:在redis中存储具有时效性的key,然后通过这个key是否存在来进行短信告警
             * 1.并发高的时候这样可能会多发短信,要采用锁
             * 2.也可以在每个服务本地安装一个redis,在发送短信的时附上每个服务的IP,更加便于排查错误
             */
           new Thread(()->{
               if(StringUtils.isBlank(sendValue)){
                   System.out.println("紧急短信,用户下单失败,请立刻查找原因");
                   //TODO 调用HTTP请求,调用短信服务
    
                   stringRedisTemplate.opsForValue().set(saveOrderKey,"save-order-fail",20, TimeUnit.SECONDS);
               }else{
                   System.out.println("已经发送过短信,20秒内不要重复发送");
               }
    
           }).start();
    
            msg.put("code",-1);
            msg.put("msg","抢购人数过多,请稍后再试");
            return msg;
        }

     累了,敲一天了,不写了

    怕什么真理无穷 进一寸有一寸的欢喜
  • 相关阅读:
    看到你还在用Maven,Gradle难道不香吗?
    技术干货|完美搭建web自动化环境
    使用可视化的Docker进行自动化测试
    使用Robot Framework实现多平台自动化测试
    还在手工写接口测试文档吗,已经out了
    巧用Python脚本解决自动化图形验证码难题
    为什么要进行URL编码
    C# (CLR) 中内存分配解析
    DIV+CSS规范命名大全集合
    Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解
  • 原文地址:https://www.cnblogs.com/ccbk/p/14849906.html
Copyright © 2011-2022 走看看