SpringCloud(五)之Spring Cloud 中 Feign结合Hystrix断路器开发实战
1.先讲hystrx(断路器) 在springcloub 中的使用
1.1 加入依赖
注意:网上新旧版本问题,所以要以官网为主,不然部分注解会丢失
最新版本 2.0
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
1.2 增加注解
启动类里面增加注解
@EnableCircuitBreaker
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class OrderServiceApplication { public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
} }
1.3 API接口编码实战(下面就是熔断降级服务异常报警通知实战)
熔断-》降级
1)最外层api使用(比如:controller上面),好比异常处理(网络异常,参数或者内部调用问题,报警)
api方法上增加 @HystrixCommand(fallbackMethod = "saveOrderFail")
编写fallback方法实现,方法签名一定要和api方法签名一致(注意点!!!)
@RestController
@RequestMapping("api/v1/order")
public class OrderController { @Autowired
private ProductOrderService productOrderService;
@Autowired
private StringRedisTemplate stringRedisTemplate; @RequestMapping("save")
@HystrixCommand(fallbackMethod = "saveFallback")
public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId,HttpServletRequest request){
if (userId==1){
return "123";
}
Map<String, Object> msg = new HashMap<>();
msg.put("code", -1);
msg.put("msg", productOrderService.save(userId, productId));
return msg;
}
/***
* @Description: save 方法出现异常,Hystrix 熔断之后回调方法
* 该参数的参数要和目标方法参数一致
* @Param: [userId, productId]
* @return: java.lang.Object
* @author: wangbs
* @create: 2019/2/19 9:07
*/
public Object saveFallback(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId,HttpServletRequest request){
//模拟发短信信息进行提醒发生了错误信息
String saveOrderKye = stringRedisTemplate.opsForValue().get("saveOrderKye");
//进行报警告诉相关人,对应的api出错
new Thread(()->{
if(StringUtils.isBlank(saveOrderKye)){
stringRedisTemplate.opsForValue().set("saveOrderKye","save-order-fail",20, TimeUnit.SECONDS);
//模拟发短信功能
System.out.println("发送短信:productService 接口报错了"+request.getRemoteAddr());
}
}).start();
Map<String, Object> msg = new HashMap<>();
msg.put("code", -1);
msg.put("msg", "抢购人数太多,您被挤出来了,稍等重试");
return msg;
}
}
2.Feign结合Hystrix断路器开发实战 在springcloub 中的使用
Feign结合Hystrix断路器开发实战,其实是为了把异常跟精确的定位到某个接口,而上面标题一我说的 ystrx(断路器) 在springcloub 中的使用 主要是在controller 中使用 目的是可以更好的控制异常处理,或者报警通知,
所以开发标题二时,标题一上面的所有配置全需要保留,不然没有意义。
2.1开启feign支持hystrix (注意,一定要开启,旧版本默认支持,新版本默认关闭)#开启feign支持hystrix
hystrix:
enabled: true 2.2 ProductClient(name="product-service", fallback=ProductClientFallback.class ), class需要继承当前ProductClient的类
至于下面的 ProductClient 讲的是Feign 的使用可以看看我的博客 feign 的讲解
https://www.cnblogs.com/xiaowangbangzhu/p/10397037.html
//服务的生成者(被调用者)在注册中心注册的名字
@FeignClient(name = "product-service",fallback = ProductClientFallback.class)
public interface ProductClient {
//被调用者对应方法的路由(类和方法上的@RequestMapping)
/**
* 这里需要注意的两个地方
* <p>
* 1、在这里使用的GetMapping注解要和被调用发一致,如果还有问题就用@RequestMapping
* 2、@PathVariable需要设置value,如果不设置也不能成功启动
*
* @param id
* @return
*/
@GetMapping("/api/v1/product/find")
String findById(@RequestParam(value = "id") int id);
}
@Component
public class ProductClientFallback implements ProductClient { @Override
public String findById(int id) {
//在这里可以得到具体的某一个接口api出现的错误,然后返回信息
System.out.println("feign 调用product-service findbyid 异常");
return null;
}
}
下面的配置不建议加上,如果有需要可以加上
s设置feign 的连接时间和读取时间(不建议开启)
#默认optons readtimeout是60,但是由于hystrix默认是1秒超时
#feign:
# client:
# config:
# default:
# connectTimeout: 40000
# readTimeout: 4000 # 默认是一秒(不建议开启)
#hystrix:
# command:
# default:
# execution:
# isolation:
# thread:
# timeoutInMilliseconds: 4000
SpringCloud(五)之Spring Cloud 中 Feign结合Hystrix断路器开发实战的更多相关文章
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上
笔记 3.Feign结合Hystrix断路器开发实战<上> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖 注意:网上新旧版本问 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-04 feign结合hystrix断路器开发实战下
笔记 4.Feign结合Hystrix断路器开发实战<下> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.feign结合Hystrix ...
- Spring Cloud中Feign如何统一设置验证token
代码地址:https://github.com/hbbliyong/springcloud.git 原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过 ...
- 解决Spring Cloud中Feign第一次请求失败的问题
在Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题 com.netflix.hystrix.exception.HystrixTimeoutE ...
- spring cloud中feign的使用
我们在进行微服务项目的开发的时候,经常会遇到一个问题,比如A服务是一个针对用户的服务,里面有用户的增删改查的接口和方法,而现在我有一个针对产品的服务B服务中有一个查找用户的需求,这个时候我们可以在B服 ...
- springcloud(五):Spring Cloud 配置中心的基本用法
Spring Cloud 配置中心的基本用法 1. 概述 本文介绍了Spring Cloud的配置中心,介绍配置中心的如何配置服务端及配置参数,也介绍客户端如何和配置中心交互和配置参数说明. 配置中心 ...
- Spring Cloud中关于Feign的常见问题总结
一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...
- 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离. 在使用线程隔离的时候,有个问题是必须 ...
- Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul)
Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul) 1.Eureka Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是 ...
随机推荐
- Hexo NexT主题内加入动态背景
主题内新添加内容 _layout.swig 找到themes\next\layout\_layout.swig文件,添加内容:在<body>里添加: 1 2 3 <div class ...
- BootStrap【二、样式】
H5文档类型 由于使用了H5和CSS熟悉,需要在文件头引入 移动设备优先 为了对移动设备友好,需要使用标签viewport width=device-width 宽度为设备宽度 height 高度 i ...
- 第三章、Django之路由层
目录 第三章.Django之路由层 一 路由的作用 二 简单的路由配置 三 分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的re_path与path 第三章.Django之路 ...
- OpenLDAP 搭建入门
系统环境:CentOS 7 slapd版本:2.4.44 简介 OpenLDAP是一款轻量级目录访问协议,基于X.500标准的,支持TCP/IP协议,用于实现账号集中管理的开源软件,提供一整套安全的账 ...
- ping不通github
Linux 下 host文件在 /etc/hosts Windows下 host文件在C:\Windows\System32\drivers\etc 在host文件的最后面加上: Linux sudo ...
- chrome上一些好用的插件
1. Super Auto Refresh Plus - 这个插件可以自动刷新网页 2. 屏蔽百度推广 - 这个插件可以屏蔽百度搜索的推广广告
- zabbix4.0搭建
一.准备工作 1.yum国内源的安装与更新 1.1 备份原repo文件 cd /etc/yum.repos.d/ mkdir repo_bak mv *.repo repo_bak 1.2 在cent ...
- WebApiHelper
/// <summary> /// 根据token过滤 /// </summary> /// <param name="list"></p ...
- 题解 [BZOJ4144] Petrol
题目描述 有一张 n 个点 m 条边的无向图,其中有 s 个点上有加油站.有 Q 次询问(a,b,c), 问能否开一辆油箱容积为 c 的车从 a 走到 b.(a,b均为加油站) 输入格式 第一 ...
- 解决ubuntu的screen已经处于Attached状态,无法再打开窗口
Attached表示该窗口已经被上一登录用户使用,需要重新登录 1. 先查询窗口id screen -ls 3606.node (11/26/2019 07:31:49 PM) (Attached) ...