传送门:SpringCloud版本Hoxton SR5 --- 第一讲:认识 先看Hystrix 可以完成的功能,或者说他在项目中的定位和作用

上篇文章主要讲:功能和作用都是用大白话,主要是通俗易懂的,推荐先看看。

看了上面那篇文章后,相信对SpringCloud有个大概的了解了。SpringCloud其实就是为完成微服务架构,并为微服务架构中会出现的问题,提供解决方案。

Hystrix就是为大型的微服务架构系统,可能发生雪崩的情况做的一个解决方案,与之相对应的还有alibaba的Sentinel组件也是做到了一样的功能,目前比Hystrix更好。

这里就有几个概念,而这些功能几乎是混合使用的,比如超时之后熔断了,就可以走降级方法,返回一条数据给调用端,这些概念最好不要区分开看,其实看了我上面那个链接给出的例子是最好理解的。下面如果还不明白,就看看下面的概念:

熔断:

当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

白话解释:当一个微服务多次调用都出现问题时(默认是10秒内20次(默认)调用失败,并且失败率达到50%),hystrix就会采取熔断机制,不再继续调用你的接口。(然后会在默认5秒钟内,试探性的先关闭熔断机制,但是如果这时候再(10秒内20次调用失败且调用失败率达到50%)又会重新进行熔断。上面的默认值都是可以直接在yml文件中配置的。

降级:

降级是当我们的某个微服务响应时间过长,或者不可用、异常等,讲白了也就是那个微服务调用不了的时候,我们不能把错误信息返回给用户,或者让他一直卡在那里呀。所以要在准备一个对应的方法,当发生这种问题的时候我们直接调用这个方法来快速返回这个请求(这个方法一般是直接返回数据,最好不写太多的逻辑,更不能去查数据库等,不然降级方法卡住了,就没有意义了),不让他一直卡在那占用服务的线程,也是防止雪崩 和 资源占用的一种方法。

限流:

限制你某个微服务的使用量(可用线程),hystrix通过线程池的方式来管理你的微服务调用,他默认是一个线程池(10大小) 管理你的当前微服务。当然可以自己配置,比如某个服务的服务器性能较差,就可以让这个服务的线程少一些,不至于让这个服务,因为线程太多而宕机,或者说比如淘宝节做活动的时候,为了腾出系统资源,把一些不相关的评论服务等,配置小量的线程并发访问,其他多出来的访问,就返回 稍后重试等降级信息,把 CPU资源分给一些主要的功能,比如:分给支付功能的微服务。

监控:

当熔断 或者 执行降级方法后的一段时间内,不会再访问这个节点的服务,直到自定义配置的时间到了之后,又会开始访问这个服务,如果还是执行了降级方法,又会停止访问这个服务,直到正常为止 (这就是为熔断提供的监控服务),所以他的监控功能主要就是做这些事的。

直接贴代码吧:

首先添加依赖:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

其实在使用hystrix功能的时候,还是分情况的,比如降级方法:可以指定某个微服务调用的时候都走统一的降级方法,也可以细粒度的指定到具体的调用接口。还有使用线程限流:一样的可以指定统一调用接口使用某个线程限流,也可以细粒度到调用的某个方法上。

1. 配置启动类: 因为这里讲的是Hystrix,其他的配置,在前面的文章中说到了。

所以这里其实就只添加一个注解: @EnableHystrix    // 开启Hystrix的功能。

package com.springcloud;import com.ribbonconfig.ItemRuleConfig;
import com.ribbonconfig.OrderRuleConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** @author: wangqinmin* @date : 2020/6/10* @description: 仰天大笑出门去,我辈岂是蓬蒿人*/
@SpringBootApplication
@EnableEurekaClient
@RibbonClients({ // 指定某个微服务使用某个负载均衡策略@RibbonClient(name = "SERVER-ORDER", configuration = OrderRuleConfig.class),@RibbonClient(name = "SERVER-ITEM", configuration = ItemRuleConfig.class)
})
@EnableFeignClients
@EnableHystrix
public class LoginApplication {public static void main(String[] args) {SpringApplication.run(LoginApplication.class);}}

2. 接着就是配置让Feign调用失败的服务,走降级方法,也就是说,配置降级方法。

package com.springcloud.web.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author: wangqinmin* @date : 2020/6/12* @description: 仰天大笑出门去,我辈岂是蓬蒿人*/
@FeignClient(name = "SERVER-ORDER", fallback = FeignOrderFallBack.class)
public interface FeignOrderService {@GetMapping("/order/query")@ResponseBodyObject getOrder();@GetMapping("/order/info")@ResponseBodyObject getInfoList();
}--------  上面多加了一个注解属性,就是配置降级方法的类。package com.springcloud.web.feign;import com.springcloud.utils.R;
import org.springframework.stereotype.Component;/*** @author: wangqinmin* @date : 2020/6/13* @description: 仰天大笑出门去,我辈岂是蓬蒿人*/
@Component  // 一定要加
public class FeignOrderFallBack implements FeignOrderService {/*** 这里实现的是 {@link FeignOrderService},这样写的话,当调用降级方法时,没有报错信息。* 也就是说,没有日志打印报错信息,为什么会执行降级方法。* 可以参考  {@link FeignItemFallBackFactory}的实现,可以得到报错信息。** @return*/@Overridepublic Object getOrder() {return R.error("调用order降级方法");}@Overridepublic Object getInfoList() {return R.error("调用order服务Info降级方法");}
}-----------  上面的配置,意思就是说,如果上面的两个方法 getOrder  和 getInfoList 调用服务端不成功,就走这里重写的方法,返回数据。package com.springcloud.web.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author: wangqinmin* @date : 2020/6/12* @description: 仰天大笑出门去,我辈岂是蓬蒿人*/
@FeignClient(name = "SERVER-ITEM", fallbackFactory = FeignItemFallBackFactory.class)
public interface FeignItemService {@GetMapping("/item/info")@ResponseBodyObject getItem();
}------ 上面的类的注解属性不一样, 这里用的是fallbackFactory。就是说,用他的话,调用降级方法后,还会打印导致调用降级方法的原因,就是可以把报错信息打印出来。package com.springcloud.web.feign;import com.springcloud.utils.R;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;/*** @author: wangqinmin* @date : 2020/6/14* @description: 仰天大笑出门去,我辈岂是蓬蒿人*/
@Component // 一定要加
public class FeignItemFallBackFactory implements FallbackFactory<FeignItemService> {@Overridepublic FeignItemService create(Throwable throwable) {return new FeignItemService() {@Overridepublic Object getItem() {// 或者在这里日志打印return R.error("item统一降级方法", throwable.getMessage());}};}
}----- 上面这个匿名内部类,对可以打印报错信息的实现,这里是直接返回,还可以直接日志打印控制台。根据需求来,一般都直接打印日志。下面就是怎么调用了: Controller中的一段调用。/*** fallbackMethod = "getFeignOrderFallback: 配置会执行的降级方法名* threadPoolKey = "order" : 自定义线程属性的Key* threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "5")}:指定线程属性,就是指定该方法最多被5个线程同时调用,超过了就走降级方法。* 测试threadPoolProperties属性的话:可以将调用的方法休眠5秒,然后在5秒内,访问这个接口超过5次,看看5秒内,超过5次的访问的次数 是否等于  降级方法调用次数。* (为了配置上面的测试,Hystrix的默认超时时间就配置长点,反正就是不让他超时)** 在系统中,默认有一个线程池,里面有10个线程,这个方法上配置threadPoolProperties这个属性,相当于创建一个新的线程池,里面有5个线程。* 这种在方法上配置的是比较细粒度的。也可以直接在yml中统一为各个微服务统一配置。* 并且降级方法也是一样的,比如,我每个方法上都做这样的降级配置,岂不是很麻烦,这时候就可以在Feign提供接口的类{@link FeignOrderService}上配置。** 在方法上直接配置 Hystrix比在 Feign的调用配置级别高。* @return*/@GetMapping("/getFeignOrder")@ResponseBody
//    @HystrixCommand(fallbackMethod = "getFeignOrderFallback", threadPoolKey = "order", threadPoolProperties = {
//            @HystrixProperty(name = "coreSize", value = "5")
//    })public Object getFeignOrder() {/*** 降级返回信息: (2种情况)* 1. 在这个controller上配置降级方法,当降级成立,就直接调用降级方法。* 2. 在FeignOrderService类中配置降级方法,就仅仅是降级这个调用的接口,下面代码还是会正常执行。*/Object obj = feignOrderService.getOrder();return R.success("成功", obj);}------ 上面说了,Hystrix可以细粒度的配置到方法上,并且会被优先使用。上面正好注释掉了 那个方法上的注解。那他的降级方法怎么写呢 ?
就是再本类中,直接定义一个方法就好了。 例如:public Object getFeignOrderFallback() {return R.error("访问人数较多,稍后重试");}----  上面注释掉的方法上的注解中
fallbackMethod = "getFeignOrderFallback": 就是使用Hystrix在方法上的降级(单独使用主要就是超时 或者 报错的情况,直接走降级方法)。
threadPoolKey、threadPoolProperties两个属性:就是对线程限流的方法级别的配置,他的意思就是,并发访问超过新建线程池中线程数的时候,也走降级方法。

在yml中,也有对Hystrix的一些配置,上面有对方法上细粒度的控制,这里就是全局控制 (方法上的级别更高)

#################################################### Hystrix 配置 #######################################################
hystrix:command:default: # 此default其实就是对全局的一个配置 (也就是说,配置的是当前微服务整个系统,一般在微服务中,一个微服务一般不止调用1个接口,所以可以对调用的每个微服务的每个接口分开配置Hystrix)fallback:execution:isolation:thread:timeoutInMilliseconds: 10000  # 接口调用超时,超时之后走降级方法 (调用接口后超过这里配置的时间就走降级方法。默认10000ms 如果发生异常,也会调用降级方法)circuitBreaker:errorThresholdPercentage: 50 # 失败百分比 ,默认>=50% (当同时满足errorThresholdPercentage 和 requestVolumeThreshold属性时,触发熔断)requestVolumeThreshold: 20  # 在一定的时间范围内,某个接口调用配置次数都失败,且失败百分比大于配置数就会触发熔断机制 (默认10秒20次,这里的10秒就是上面的timeoutInMilliseconds属性。 )sleepWindowInMilliseconds: 5000   # 当触发熔断机制后指定时间内,此该接口不会再被访问 (默认5000毫秒)threadpool:  # 对线程的要求,就是说,当让访问线程超过之后,进入降级方法。default: # 此default和上面是一个意思,也是对全局的配置。(如果这里配置了default,就代表要配置该微服务,调用的所有微服务的每个接口,进行限流配置。)coreSize: 10order: #这个配置和default是一个层级的。(上面说,可以单独配置某个微服务的每个接口的限流,这个order就是自定义的标识,在方法使用限流功能的时候,指定这个标识就可以为某个接口指定限流具体措施)coreSize: 3

上面对yml的很多属性的其实不需要配置,因为有默认值。只是说,可以这样配置可以看得更加清楚,知道还有这些功能,但是在实际工作中,这些配置几乎不用改变,而且我配置的时候,也是为了测试Hystrix的功能。 测试完成后,还是改为了 默认配置。

最后一点,就是要让Feign支持Hystrix的降级、熔断、限流等功能,还需要打开  Feign对Hystrix的支持配置:

#################################################### feign整合hystrix ###################################################
feign:hystrix:enabled: true # 默认是关闭的 ( 打开之后,Feign的调用也支持Hystrix的功能,也就是熔断和降级的功能 )client:   # 这后面的配置,实际工作也用不到,可以当中了解,然后直接注释,我也是为了测试,在官网找到的。config:default: # 全局配置,配置所有的Feign。也可以配置某个微服务的,自定义一个名称就好了。connectTimeout: 5000  # 默认 5000毫秒。readTimeout: 5000   # 默认 5000毫秒。loggerLevel: basic  # 日志打印级别, 一般不用配置。

其实功能也算是都在上面的代码中体现出来了,但是我还是感觉,写的乱乱的。

根本原因:降级的功能,有3中配置方式,上面一下把3中配置都在代码里体现出来,没有区分,下面具体说一下:

1. 可以配置在具体的方式上(级别最高,就算其他地方配置了,也使用方法上的配置)。

2. 可以使用代码新建类,重写 @FeignClient 中的fallback 或者 fallbackFactory属性。(工作中也是用的最多的)

3. 还可以在yml中,配置线程管理,然后再在代码调用的方法注解上,使用相应的key映射过来。

都是为了完成降级方法。 但是情况分的太多了。用文字来描述的话,是在太麻烦了。

具体有什么不会的,可以留言问我。

拜拜

SpringCloud版本Hoxton SR5 --- 第四讲:Hystrix 熔断、限流(线程)、降级相关推荐

  1. SpringCloud版本Hoxton SR5 --- 第七讲:SpringCloud Config 分布式配置中心+整合bus、rabbitmq、actuator

    传送门:SpringCloud版本Hoxton SR5 --- 第一讲:认识 先看SpringCloud Config 可以完成的功能,或者说他在项目中的定位和作用. SpringCloud conf ...

  2. SpringCloud版本Hoxton SR5 --- 第八讲:Sleuth 分布式链路跟踪 整合Zipkin + Elasticsearch持久化

    传送门:SpringCloud版本Hoxton SR5 --- 第一讲:认识 先看Sleuth.Zipkin.Elasticsearch 可以完成的功能,或者说他在项目中的定位和作用. Sleuth比 ...

  3. SpringCloud版本Hoxton SR5 --- 第一讲:认识

    什么是SpringCloud ?我用好理解的方式作比喻: 这里我们拿京东的网站做解释,京东不一定这么搞得,但是思想是一致的.首先SpringCloud一种微服务架构的实现:首先京东支持14亿人访问,这 ...

  4. SpringCloud版本Hoxton SR5 --- 第三讲:Ribbon 、Ribbon与Feign配合使用

    传送门:SpringCloud版本Hoxton SR5 --- 第一讲:认识 先看Ribbon.Fegin可以完成的功能,或者说他在项目中的定位和作用. 上篇文章主要讲:功能和作用都是用大白话,主要是 ...

  5. 大中型分布式系统中,Hystrix 分布式系统限流、降级、熔断框架

    为什么需要Hystrix 在大中型分布式系统中,通常系统很多依赖,如下图: 在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络连接缓慢,资源繁忙,暂时不可用,服务 ...

  6. SpringCloud 微服务工具集 SpringCloud 版本: Hoxton SR6

    SpringCloud 微服务工具集v1.1 SpringCloud版本: Hoxton SR6 SpringBoot版本: 2.2.x --2.3.x 1.什么是微服务 官网: https://ww ...

  7. Java学习四阶段-09 Sentinel限流熔断

    Sentinel简介 背景分析 在我们日常生活中,经常会在淘宝.天猫.京东.拼多多等平台上参与商品的秒杀.抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票.高铁票,甚至有时候还要帮 ...

  8. SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级

    源码地址:GitHub·点这里||GitEE·点这里 一.基本简介 1.概念描述 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.包括核心的独立类库,监 ...

  9. Spring-Cloud 微服务网关Zuul、ZuulFilter过滤器和限流

    微服务网关 一. Zuul网关 1. 创建工程 并导入依赖 2. application.yml 配置文件 3. 启动类添加注解 4. 依次启动服务 5. 进入浏览器访问测试 二. ZuulFilte ...

最新文章

  1. Linux下用于查看系统当前登录用户信息的4种方法
  2. lnmp集成开发环境安装pdo_dblib扩展
  3. Spring Data JPA单元测试 Not a managed type
  4. winform在表格中输入一个完整的时间字段_【ArcGIS小技巧视频教程】(5):在ArcGIS中挂接其他数据...
  5. [转]Spring数据库读写分离
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上医院预约挂号系统
  7. Android系统模块编译
  8. UML类图关系全面剖析
  9. e5服务器系列天梯图,最新的至强e5处理器天梯图
  10. python高次方程求根公式,Python简单求解高阶方程的数值解
  11. 神策数据盛永根:微信生态——全数据采集和打通
  12. 2038年无数Java应用的崩溃
  13. 地图定位之3D 地图
  14. 会了它+稳定发挥=3000包吃住
  15. 2018好用的免费BI工具
  16. Python数据分析与展示:Series类型简单操作-8
  17. ITIL 4 Foundation题目-7
  18. 海上钢琴师——陆地对我而言不过是一个更大的船
  19. wget下载软件包时,遇到不信任问题,除了跳过证书检验,更新或者下载ca证书也是个解决办法
  20. 学Java没前途了?为什么有人说烂大街

热门文章

  1. 计算机网络简答题复习要点
  2. 区块链革命,革的是哪些“黑中介”的命?
  3. 35岁后最可怕的事,就是成为职场中的奢侈品
  4. 在u盘运行linux系统软件,主编帮你xp系统利用U盘直接运行Linux软件 的步骤【图】...
  5. 上海市专业计算机学校地址,上海计算机专业学校
  6. 机器人自我恢复(一) Hod Lipson的论文解读
  7. C#:(角度)前方交会(VS2010窗体+代码)
  8. 教你如何查看附近的WiFi密码
  9. 网页密码查看器+原代码+windows密码查看
  10. 电脑的危险端口?135,137,139,445,3389