zoukankan      html  css  js  c++  java
  • SpringCloud-day09-Feign与Hystrix整合

    8.5.Feign 与 Hystrix整合-服务熔断降级解耦

    从上一节我们整合的情况看:

    1.业务代码和降级代码都写在了一起,非常不利于维护,和代码规范

    2.如果提供服务的1004都挂了还不能降级么?

    因此我们采用用 Feign 与 Hystrix整合-服务熔断降级解耦

    第一步:修改 ticket-lock-provider-6004

    主要是删除之前的服务降级配置,本质上就只写一个单纯的服务提供者

    1.删除application.yml,中对hystrix的超时时间配置

    2.删除启动类中的服务熔断注解: @EnableCircuitBreaker

    3.删除控制层中的 lockTicket 方法的 @HystrixCommand(fallbackMethod = "lockTicketFallback") 注解 和 降级方法,如下

    第二步:在common模块中,添加一个锁票的客户端接口 和 服务熔断实现

    改造完后的代码结构如下:

     TicketLockClientService代码如下:

    package com.wfd360.service;
    
    import com.wfd360.service.impl.TicketLockClientFallbackFactory;
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    import java.util.Map;
    
    /**
     * @author 姿势帝-博客园
     * @address https://www.cnblogs.com/newAndHui/
     * @WeChat 851298348
     * @create 07/19 3:50
     * @description
     */
    @FeignClient(value = "SERVICE-LOCK", fallbackFactory = TicketLockClientFallbackFactory.class)
    public interface TicketLockClientService {
    
        @GetMapping(value = "/lock/ticket/{id}")
        Map<String, Object> lockTicket(@PathVariable("id") Integer id);
    }
    View Code

    熔断降级代码 TicketLockClientFallbackFactory 如下:

    package com.wfd360.service.impl;
    
    import com.wfd360.service.TicketLockClientService;
    import feign.hystrix.FallbackFactory;
    import org.springframework.stereotype.Component;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author 姿势帝-博客园
     * @address https://www.cnblogs.com/newAndHui/
     * @WeChat 851298348
     * @create 07/19 3:51
     * @description
     */
    @Component
    public class TicketLockClientFallbackFactory implements FallbackFactory<TicketLockClientService > {
        @Override
        public TicketLockClientService create(Throwable throwable) {
            return new TicketLockClientService() {
                @Override
                public Map<String, Object> lockTicket(Integer id) {
                    System.out.println("=========error110========");
                    Map<String, Object> map = new HashMap<>();
                    map.put("code", 900);
                    map.put("msg", "TicketLockClientFallbackFactory:系统出错,稍后重试,id=" + id);
                    return map;
                }
            };
        }
    }
    View Code

    第三步:在 ticket-consumer-feign-81 的 application 中添加如下配置

    # feign开启服熔断
    feign:
      hystrix:
        enabled: true
    
    
    # 超时时间配置
    ribbon:
      ReadTimeout: 10000
      ConnectTimeout: 5000
    
    # hystrix超时配置
    #  注意ribbon有超时时间设置,ribbon默认超时也是1秒,
    #  feign也有超时时间配置默认是1秒,
    #  而feign的底层封装的就是ribbon,因此要想feign的超时时间生效,
    #  那么ribbon的超时时间要大于hystrix的超时时间,否则 hystrix自定义的超时时间毫无意义。
    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 2000

    第四步:ticket-consumer-feign-81 模块增加一个锁票的controller,

    TicketLockConsumerController
    package com.wfd360.controller;
    
    import com.wfd360.service.TicketLockClientService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.Map;
    
    /**
     * @author 姿势帝-博客园
     * @address https://www.cnblogs.com/newAndHui/
     * @WeChat 851298348
     * @create 06/29 10:25
     * @description
     */
    @Controller
    public class TicketLockConsumerController {
        @Autowired
        private TicketLockClientService ticketLockClientService;
    
    
        /**
         * 锁定车票
         *
         * @return
         */
        @GetMapping(value = "/lock/ticket/{id}")
        @ResponseBody
        public Map<String, Object> lockTicket(@PathVariable("id") Integer id) {
            return ticketLockClientService.lockTicket(id);
        }
    
    
    }
    View Code

    第五步:测试

    启动eureka,在启动服务提供者者6004,最后启动服务消费者81

    点击链接测试:http://localhost:81/lock/ticket/10

    正常情况下:

     超时的情况下:

     测试完成,

    这里配置的超时时间是2秒,大家可以通过传入不同大写的id进而控制睡眠时间,或者关闭服务提供者6004,观察测试结果,

    springCloud课程与代码下载:https://www.cnblogs.com/newAndHui/p/13210228.html

    完美!

  • 相关阅读:
    Docker
    CTF各种资源:题目、工具、资料
    Android工具集合
    Android相关资源
    命令注入新玩法:巧借环境攻击目标
    分库分表
    数据库读写分离
    Insomni'hack teaser 2019
    Insomni'hack teaser 2019
    35C3 CTF
  • 原文地址:https://www.cnblogs.com/newAndHui/p/10635590.html
Copyright © 2011-2022 走看看