SpringCloud-day09-Feign与Hystrix整合

8.5.Feign 与 Hystrix整合

  服务熔断服务降级完全解耦java

前面的代码,用@HystrixCommand fallbackMethod是很很差的,由于和业务代码耦合度过高,不利于维护,因此须要解耦。web

首先咱们将Feign与 Hystrix整合。spring

 

第一,microservice-ticket-provider-hystrix-1004项目修改app

按照正常的逻辑来写;ide

TicketService加新的接口方法lockTicket():函数

1     /**
2  * 锁票业务 3  * @return
4      */
5     public Map<String,Object> lockTicket();

TicketServiceImpl写具体实现:学习

 1  @Override  2     public Map<String, Object> lockTicket() {  3         try {  4             //模拟超时用
 5             Thread.sleep(2000);  6         } catch (InterruptedException e) {  7  e.printStackTrace();  8  }  9         Map<String,Object> map=new HashMap<String,Object>(); 10         map.put("code", 200); 11         map.put("msg", "锁定的车票数据xxxxx3000"); 12         return map; 13     }

TicketProviderController正常调用service方法:测试

注意:注释部分是以前的那种方法写的,为了便于学习对比,注释保留spa

 1  /**
 2  * 锁票业务  3  *  4  * @return
 5  * @throws InterruptedException  6      */
 7  @ResponseBody  8     @GetMapping(value = "/lockTicket")  9    // @HystrixCommand(fallbackMethod = "lockTicketFallback")
10     public Map<String, Object> lockTicket() throws InterruptedException { 11         // Thread.sleep(2000); 12         // Map<String,Object> map=new HashMap<String,Object>(); 13         // map.put("code", 200); 14         // map.put("msg", "锁定的车票数据xxxxx3000"); 15         // return map;
16         return ticketService.lockTicket(); 17  } 18 
19     /**
20  * 模拟锁票超时 或者 系统故障的回调函数 21  * @return
22  * @throws InterruptedException 23      */
24     // public Map<String,Object> lockTicketFallback() throws InterruptedException{ 25     // Map<String,Object> map=new HashMap<String,Object>(); 26     // map.put("code", 500); 27     // map.put("msg", "系统出错,稍后重试"); 28     // return map; 29     // }

 

 

第二步:microservice-common项目新建FallbackFactory类,解耦服务熔断服务降级code

TicketClientService接口,新增lockTicket()方法;

1     /**
2  * 索票业务 3  * @return
4      */
5     @GetMapping(value="/ticket/lockTicket") 6     public Map<String,Object> lockTicket();

 

新建 TicketClientFallbackFactory 类,实现FallbackFactory<TicketClientService>接口;

 1 package com.wfd360.service;  2 
 3 import com.wfd360.model.Ticket;  4 import feign.hystrix.FallbackFactory;  5 import org.springframework.web.bind.annotation.PathVariable;  6 
 7 import java.util.HashMap;  8 import java.util.List;  9 import java.util.Map; 10 
11 /**
12  * Created by 姿式帝-博客园 on 2019/4/1. 13  * 欢迎添加笔者wx(851298348)共同探讨、学习! 14  */
15 
16 public class TicketClientFallbackFactory implements FallbackFactory<TicketClientService> { 17  @Override 18     public TicketClientService create(Throwable throwable) { 19         return new TicketClientService() { 20  @Override 21             public Ticket get(@PathVariable("id") Integer id) { 22                 // 服务超时或者出错时 返回的业务逻辑
23                 return null; 24  } 25 
26  @Override 27             public List<Ticket> list() { 28                 // 服务超时或者出错时 返回的业务逻辑
29                 return null; 30  } 31 
32  @Override 33             public boolean save(Ticket ticket) { 34                 // 服务超时或者出错时 返回的业务逻辑
35                 return false; 36  } 37 
38  @Override 39             public boolean delete(@PathVariable("id") Integer id) { 40                 // 服务超时或者出错时 返回的业务逻辑
41                 return false; 42  } 43 
44  @Override 45             public Map<String, Object> lockTicket() { 46                 Map<String, Object> map = new HashMap<String, Object>(); 47                 map.put("code", 500); 48                 map.put("msg", "系统出错,稍后重试"); 49                 return map; 50  } 51  }; 52  } 53 }

 

TicketClientService接口的@FeignClient注解加下 fallbackFactory属性 

@FeignClient(value="MICROSERVICE-STUDENT",fallbackFactory=TicketClientFallbackFactory.class)

这类咱们实现了 降级处理方法实现;

 

第三步:microservice-ticket-consumer-feign-80修改 支持Hystrix

TicketConsumerFeignController新增方法调用

 1  /**
 2  * 索票  3  * @return
 4      */
 5     @GetMapping(value="/lockTicket")  6  @ResponseBody  7     public Map<String,Object> lockTicket(){  8         System.out.println("------调用锁票业务------------");  9         return ticketClientService.lockTicket(); 10     }

 

application.yml加上hystrix支持

feign: 

  hystrix: 

    enabled: true

 

=======================

feign与hystrix 服务熔断服务降级完全解耦完成,测试与以前同样!

8.6.Feign Hystrix整合之超时时间配置

Feign Hystrix整合后,hystrix超时时间配置的话 这里要配置到消费端。

 

也就是 microservice-ticket-provider-hystrix-1004 的 yml里的

hystrix:

  command:

    default:

      execution:

        isolation:

          thread:

            timeoutInMilliseconds: 3000

这个配置放到 microservice-ticket-consumer-feign-80 的yml里

 

可是 放进去后 大伙测试 依然无效。

这里由于还有一个 feign 也有一个超时时间的设置,固然feign底层是 ribbon的封装,因此 直接配置ribbon,ribbon默认超时也是1秒。

因此这里都是强制要求,ribbon的超时时间要大于hystrix的超时时间,不然 hystrix自定义的超时时间毫无心义。

因此还得加个 ribbon超时时间设置

ribbon: 

  ReadTimeout: 50000

  ConnectTimeout: 6000

 测试与以前同样,你们能够设定设置超时间后,在调整睡眠时间进行测试!

 hystrix 的应用暂时讲到这里,本案例代码能够下载 V8版本!

相关文章
相关标签/搜索