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断路器开发实战的更多相关文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上

    笔记 3.Feign结合Hystrix断路器开发实战<上>     简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖          注意:网上新旧版本问 ...

  2. 小D课堂 - 新版本微服务springcloud+Docker教程_5-04 feign结合hystrix断路器开发实战下

    笔记 4.Feign结合Hystrix断路器开发实战<下>     简介:讲解SpringCloud整合断路器的使用,用户服务异常情况     1.feign结合Hystrix       ...

  3. Spring Cloud中Feign如何统一设置验证token

    代码地址:https://github.com/hbbliyong/springcloud.git 原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过 ...

  4. 解决Spring Cloud中Feign第一次请求失败的问题

    在Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题 com.netflix.hystrix.exception.HystrixTimeoutE ...

  5. spring cloud中feign的使用

    我们在进行微服务项目的开发的时候,经常会遇到一个问题,比如A服务是一个针对用户的服务,里面有用户的增删改查的接口和方法,而现在我有一个针对产品的服务B服务中有一个查找用户的需求,这个时候我们可以在B服 ...

  6. springcloud(五):Spring Cloud 配置中心的基本用法

    Spring Cloud 配置中心的基本用法 1. 概述 本文介绍了Spring Cloud的配置中心,介绍配置中心的如何配置服务端及配置参数,也介绍客户端如何和配置中心交互和配置参数说明. 配置中心 ...

  7. Spring Cloud中关于Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...

  8. 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

    在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离. 在使用线程隔离的时候,有个问题是必须 ...

  9. Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul)

    Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul) 1.Eureka Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是 ...

随机推荐

  1. 根治android studio无法预览xml布局的问题

    xml报错“Failed to load AppCompat ActionBar with unknown error.” 修改build-gradle文件中的appcompat包导入的版本,直接用“ ...

  2. 第三章、drf框架 - 序列化组件 | Serializer

    目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...

  3. 【2】Git仓库

    一.获取 Git 仓库 初始化仓库 ##基于当前目录初始化仓库 $ git init ##指定demo目录初始化仓库 $ git init demo 克隆现有仓库 ##克隆现有的仓库,默认目录名:li ...

  4. windows10 L2tP nat 下无法连接的处理

    事件查看器中没有错误代码显示. Windows 10 L2TP/IPsec Manual Setup Instructions Bold items are things you will click ...

  5. Javascript节点选择

    jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...

  6. Collection 和 Collections 有什么区别?(未完成)

    Collection 和 Collections 有什么区别?(未完成)

  7. C++获取文件夹下所有文件的路径

    代码 getFiles()函数的作用: path是一个文件夹路径,函数在path文件夹下寻找所有文件(包括子文件夹下的文件),然后将所有文件的路径存入files #include <io.h&g ...

  8. Redis数据类型操作说明

    List数据操作 lpush 语法:lpush key value [value…] 作用:将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左到右的顺序依次插入到 ...

  9. 红米k30评测+全面解读

    暂时还没有图片等页面美化..其实网上有很多美图,这里不再粘贴了 红米k30是小米公司子品牌红米最近推出的一款性价比非常高的手机,以下进行多方面解读: 本人会尽量用不懂手机都能理解的语言来各方面讲解k3 ...

  10. Vue入门(三)——模拟网络请求加载本地数据

    1.首先我们需要在webpack.dev.conf.js中const PORT = process.env.PORT && Number(process.env.PORT) 的后面追加 ...