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

完美!

posted @ 2019-04-01 12:02  李东平|一线码农  阅读(620)  评论(0编辑  收藏  举报