SpringCloud-day09-Feign与Hystrix整合

8.5.Feign 与 Hystrix整合

  服务熔断服务降级彻底解耦

前面的代码,用@HystrixCommand fallbackMethod是很不好的,因为和业务代码耦合度太高,不利于维护,所以需要解耦。

首先我们将Feign与 Hystrix整合。

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

按照正常的逻辑来写;

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方法:

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

 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类,解耦服务熔断服务降级

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版本!

猜你喜欢

转载自www.cnblogs.com/newAndHui/p/10635590.html
今日推荐