SpringCloud-day09-Feign与Hystrix整合
8.5.Feign 与 Hystrix整合
服务熔断服务降级彻底解耦
前面的代码,用@HystrixCommand fallbackMethod是很不好的,因为和业务代码耦合度太高,不利于维护,所以需要解耦。
首先我们将Feign与 Hystrix整合。
第一,microservice-ticket-provider-hystrix-1004项目修改
按照正常的逻辑来写;
TicketService加新的接口方法lockTicket():
/**
* 锁票业务
* @return
*/
public Map<String,Object> lockTicket();
TicketServiceImpl写具体实现:
@Override
public Map<String, Object> lockTicket() {
try {
//模拟超时用
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Map<String,Object> map=new HashMap<String,Object>();
map.put("code", 200);
map.put("msg", "锁定的车票数据xxxxx3000");
return map;
}
TicketProviderController正常调用service方法:
注意:注释部分是之前的那种方法写的,为了便于学习对比,注释保留
/**
* 锁票业务
*
* @return
* @throws InterruptedException
*/
@ResponseBody
@GetMapping(value = "/lockTicket")
// @HystrixCommand(fallbackMethod = "lockTicketFallback")
public Map<String, Object> lockTicket() throws InterruptedException {
// Thread.sleep(2000);
// Map<String,Object> map=new HashMap<String,Object>();
// map.put("code", 200);
// map.put("msg", "锁定的车票数据xxxxx3000");
// return map;
return ticketService.lockTicket();
} /**
* 模拟锁票超时 或者 系统故障的回调函数
* @return
* @throws InterruptedException
*/
// public Map<String,Object> lockTicketFallback() throws InterruptedException{
// Map<String,Object> map=new HashMap<String,Object>();
// map.put("code", 500);
// map.put("msg", "系统出错,稍后重试");
// return map;
// }
第二步:microservice-common项目新建FallbackFactory类,解耦服务熔断服务降级
TicketClientService接口,新增lockTicket()方法;
/**
* 索票业务
* @return
*/
@GetMapping(value="/ticket/lockTicket")
public Map<String,Object> lockTicket();
新建 TicketClientFallbackFactory 类,实现FallbackFactory<TicketClientService>接口;
package com.wfd360.service; import com.wfd360.model.Ticket;
import feign.hystrix.FallbackFactory;
import org.springframework.web.bind.annotation.PathVariable; import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Created by 姿势帝-博客园 on 2019/4/1.
* 欢迎添加笔者wx(851298348)共同探讨、学习!
*/ public class TicketClientFallbackFactory implements FallbackFactory<TicketClientService> {
@Override
public TicketClientService create(Throwable throwable) {
return new TicketClientService() {
@Override
public Ticket get(@PathVariable("id") Integer id) {
// 服务超时或者出错时 返回的业务逻辑
return null;
} @Override
public List<Ticket> list() {
// 服务超时或者出错时 返回的业务逻辑
return null;
} @Override
public boolean save(Ticket ticket) {
// 服务超时或者出错时 返回的业务逻辑
return false;
} @Override
public boolean delete(@PathVariable("id") Integer id) {
// 服务超时或者出错时 返回的业务逻辑
return false;
} @Override
public Map<String, Object> lockTicket() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", 500);
map.put("msg", "系统出错,稍后重试");
return map;
}
};
}
}
TicketClientService接口的@FeignClient注解加下 fallbackFactory属性
@FeignClient(value="MICROSERVICE-STUDENT",fallbackFactory=TicketClientFallbackFactory.class)
这类我们实现了 降级处理方法实现;
第三步:microservice-ticket-consumer-feign-80修改 支持Hystrix
TicketConsumerFeignController新增方法调用
/**
* 索票
* @return
*/
@GetMapping(value="/lockTicket")
@ResponseBody
public Map<String,Object> lockTicket(){
System.out.println("------调用锁票业务------------");
return ticketClientService.lockTicket();
}
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版本!
SpringCloud-day09-Feign与Hystrix整合的更多相关文章
- springcloud(九)-Feign使用Hystrix
前言 上一篇我们使用注解@HystrixCommond的fallbackMethod属性实现回退.然而,Feign是以接口形式工作的,它没有方法体,上一篇讲解的方式显然不适用于Feign. 那么Fei ...
- 第八章 SpringCloud之Feign、Hystrix结合使用
#这个章节主要是针对Hystrix的使用,因为Feign的章节在上一节已经实现了,整个代码也是在上一个章节的基础上修改的 ##################Hystrix一个简单Demo实现#### ...
- Spring Cloud(Dalston.SR5)--Feign 与 Hystrix 断路器整合
创建项目 要使 Feign 与 Hystrix 进行整合,我们需要增加 Feign 和 Hystrix 的依赖,修改 POM.xml 中增加以下依赖项如下: <?xmlversion=" ...
- springcloud(七) feign + Hystrix 整合 、
之前几章演示的熔断,降级 都是 RestTemplate + Ribbon 和 RestTemplate + Hystrix ,但是在实际开发并不是这样,实际开发中都是 Feign 远程接口调用. ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-04 feign结合hystrix断路器开发实战下
笔记 4.Feign结合Hystrix断路器开发实战<下> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.feign结合Hystrix ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上
笔记 3.Feign结合Hystrix断路器开发实战<上> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖 注意:网上新旧版本问 ...
- SpringCloud 在Feign上使用Hystrix(断路由)
SpringCloud 在Feign上使用Hystrix(断路由) 第一步:由于Feign的起步依赖中已经引入了Hystrix的依赖,所以只需要开启Hystrix的功能,在properties文件中 ...
- springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin
相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...
- SpringCloud系列十六:Feign使用Hystrix
1. 回顾 上文讲解了使用注解@HystrixCommand的fallbackMethod属性实现回退.然而,Feign是以接口形式工作的, 它没有方法体,前文讲解的方式显然不适用与Feign. 事实 ...
随机推荐
- MyBatis DTD文件下载地址
下载链接: http://mybatis.org/dtd/mybatis-3-config.dtdhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
- 提取配置文件中无注释的内容方法--findstr
findstr /v /r # nginx.conf C:\Users\Liang>findstr /?在文件中寻找字符串. FINDSTR [/B] [/E] [/L] [/R] [/S] [ ...
- django 的后台管理
class bcb(models.Model): name = models.CharField(max_length=64,verbose_name='班次名称') verbose_name = ' ...
- 洛谷P1040 加分二叉树(树形dp)
加分二叉树 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...
- 窗口置顶 - 仿TopWind
前置学习:低级鼠标hook,获得鼠标状态. 这个在原来获得鼠标状态的基础上,加上一个事件处理即可. TopWind就是一个可以置顶窗口的文件,避免复制粘贴的时候的来回切换(大窗口与小窗口),算是一个实 ...
- Python【每日一问】07
问:请解释使用 *args 和 **kwargs 的含义 答: *args:可变参数,表示将实参中按照位置传值,多余的值都给 args,多余的实参被打包成 tuple(元组),然后传递给函数调用 # ...
- SQL 生日得到年龄
CREATE FUNCTION ufn_hr_getagefrombirthday ( @birthday DATE, @now DATE =NULL ) ) BEGIN IF (@now IS NU ...
- 02-cookie简单使用
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletExcep ...
- Python中的取模运算
C++中的取模运算符%只能对整数使用(如果要对浮点数使用需要fmod),Python则不同,对整数或浮点数均有效. 在这里再介绍一下取模的定义:假设a,b两个数,那么a mod b = a - n*b ...
- kubernetes学习笔记之十四:helm入门
1.Helm的简介 Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.可以把Helm比作CentOS的yum工具. Helm有如下几个基本概念: Chart ...