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); }
熔断降级代码 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; } }; } }
第三步:在 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); } }
第五步:测试
启动eureka,在启动服务提供者者6004,最后启动服务消费者81
点击链接测试:http://localhost:81/lock/ticket/10
正常情况下:
超时的情况下:
测试完成,
这里配置的超时时间是2秒,大家可以通过传入不同大写的id进而控制睡眠时间,或者关闭服务提供者6004,观察测试结果,
springCloud课程与代码下载:https://www.cnblogs.com/newAndHui/p/13210228.html
完美!