springcloud系列之

Easter79
• 阅读 301

springcloud系列之

springcloud系列之

什么是hystrix?

springcloud系列之

springcloud系列之

hystrix是netflix针对微服务分布式系统采用的熔断保护中间件,hystrix提供了在服务不可达或请求超时之后,优雅的给客户端返回响应结果。

springcloud系列之

springcloud系列之

为什么用hystrix?

springcloud系列之

springcloud系列之

在微服务场景下,很多服务相互依赖,如果不能对依赖的服务进行隔离,那么服务本身也有可能发生故障,hystrix可以是服务间实现隔离,当某一服务出现故障后,他能够优雅的回退并进行降级,避免出现连锁反应

springcloud系列之

springcloud系列之

hystrix快速上手

springcloud系列之

关注公众号“乐哉码农”,回复“hystrix”获取本节基础项目

springcloud系列之

在consumer服务上进行操作,添加maven依赖

springcloud系列之

 <dependency>

在userConsumerService类上添加注解@HystrixCommand(fallbackMethod = "getUserFallback")

springcloud系列之

getUserFallback是当方法执行超时或失败的时候,就会去调用这个方法,给出优雅的响应

添加对应的方法

//失败回调

springcloud系列之

为了验证效果,这次我们之启动eurek和consumer两个项目,让product服务直接调不通,来模拟请求超时,这是单独使用hystrix进行熔断降级,接下来给大家介绍的是hystrix与feign结合,实现熔断降级

注意:因为我这个是单独将feign作为一个独立的项目,用jar包的形式引入到服务中的,在整合过程中会出现很多问题,不过在文章中都给出了解决办法

springcloud系列之

打开feign项目

修改UserFeign的注解,如下

@FeignClient(value = "eureka-client-order-service",configuration = FeignConfig.class,fallback = UserFeignFallBack.class)public interface UserFeign {    @GetMapping("/user/get")    User getUser(@RequestParam("name") String name);    @PostMapping("/user/getMap")    User getUser(@RequestParam Map<String, String> param);    @PostMapping("/user/add")    User addUser(@RequestParam("name") String name, @RequestParam("email") String email);    @PostMapping("/user/addBody")    User addUser(@RequestBody User user);

springcloud系列之

FeignClient注解上添加了fallback = UserFeignFallBack.class,UserFeignFallBack是UserFeign的实现类,当feign接口调用失败的时候会自动去调用UserFeignFallBack里面对应的方法,返回给调用方,UserFeignFallBack内容如下

springcloud系列之

@Componentpublic class UserFeignFallBack implements UserFeign {    @Override

feign项目里面的工作已经完成,现在我们在consumer项目里面开启feign的熔断功能

feign:


   
   
   
 
    
    
    
  
     
     
     
   
      
      
      
    
       
       
        
         
       
   
      
      
      
   
      
      
      
    
       
       
        
        现在重启consumer项目,发现项目启动不了,报了一个这样的错误 
       
   
      
      
      
  
     
     
     
  
     
     
     
   
      
      
      
    
       
       
       
   
      
      
      
  
     
     
     
 
    
    
    

   
   
   

No fallback instance of type class com.yangle.feign.UserFeignFallBack found for feign client eureka-client-order-service

springcloud系列之

没找到UserFeignFallBack这个实例。

现在分析下出现这个的原因,没找到这个实例,说明扫包的时候没扫到他,因为feign是作为jar被引入的,是有可能没被扫到,但是为什么没有报FeignConfig.class实例不存在呢,这个很好解释,还记得我们在整合feign的时候,在启动类上面添加了这样一个东西么,

springcloud系列之

springcloud系列之,,但是

springcloud系列之

这个好像只扫描了他关注的,并没有去扫描被component注解的实例,所以问题找到了,现在要做的就是能够让UserFeignFallBack能被扫描到

第一种解决办法,在启动类上,加上扫描UserFeignFallBack所在的包路径,前面一个是项目基础包

springcloud系列之

@SpringBootApplication(scanBasePackages = {"com.yangle.feign","com.yangle.eurekaclientproducter"})

现在重新启动应该就可以了,项目启动成功访问http://localhost:8082/consumer/user/get,返回

springcloud系列之

springcloud系列之

说明服务熔断降级成功。

虽然熔断降级完成了,但是好像并不是很完美,因为我们虽然能够优雅的给用户响应,但是作为管理员,我们需要找出这次调用不成功的原因,所以必须将出错信息或异常记录下来,其实feign也给我们提供了另外一种方法fallbackFactory

修改feign注解

springcloud系列之

@FeignClient(value = "eureka-client-order-service",configuration = FeignConfig.class,fallbackFactory =UserFeignFallBackFactory.class)public interface UserFeign {    @GetMapping("/user/get")    User getUser(@RequestParam("name") String name);    @PostMapping("/user/getMap")    User getUser(@RequestParam Map<String, String> param);    @PostMapping("/user/add")    User addUser(@RequestParam("name") String name, @RequestParam("email") String email);    @PostMapping("/user/addBody")    User addUser(@RequestBody User user);

springcloud系列之

所有的处理操作都是在create方法里面进行降级操作,在这里能拿到异常对象,将异常信息记录下来,并且优雅的给用户返回错误信息。

springcloud系列之

springcloud系列之

总结

springcloud系列之

springcloud系列之

本章学习了hystrix,并且通过hystrix实现了服务的保护功能,下一节带领大家学习API网关zuul

欢迎大家关注我的公众号“乐哉码农”,回复“hystrix”领取本节源码,回复“资料领取”,获取人工智能、大数据等更多学习视频资料,如有侵权,请联系作者立即删除!

springcloud系列之

springcloud系列之

本文分享自微信公众号 - AI码师(shi_ma_AI)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
2年前
vue element table 表头添加图标
!(https://oscimg.oschina.net/oscnet/189d567e07e0844612470867b06a35c0aaf.jpg)!(https://oscimg.oschina.net/oscnet/dc3b454d663d8618924b78796345a145b3f.jpg)1<template
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k