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

    完美!

  • 相关阅读:
    Codeforces 1291 Round #616 (Div. 2) B
    总结
    刷新DNS解析缓存+追踪+域名解析命令
    数学--数论--Hdu 5793 A Boring Question (打表+逆元)
    Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析
    LeetCode 117 Populating Next Right Pointers in Each Node II
    LeetCode 116 Populating Next Right Pointers in Each Node
    test test
    LeetCode 115 Distinct Subsequences
    LeetCode 114. Flatten Binary Tree to Linked List
  • 原文地址:https://www.cnblogs.com/newAndHui/p/10635590.html
Copyright © 2011-2022 走看看