5.springcloud微服务架构搭建 之 《springboot集成Hystrix》
创始人
2025-05-29 15:54:20
0

1.springcloud微服务架构搭建 之 《springboot自动装配Redis》

2.springcloud微服务架构搭建 之 《springboot集成nacos注册中心》

3.springcloud微服务架构搭建 之 《springboot自动装配ribbon》

4.springcloud微服务架构搭建 之 《springboot集成openFeign》

目录

1.项目引入hystirx

        1.1.项目引入hystrix坐标配置

        1.2.项目启动类启用断路器

2. HystrixCommand 注解

        2.1 使用HystrixCommand 实现fallback

                2.1.1 正常性测试

                 2.1.2 停掉cms服务,模拟服务不可用

          2.2 通过DefaultProperties实现全局fallback

                2.2.1 停到cms服务,模拟测试 

         2.3 通过自定义参数配置接口的熔断策略

 3.开启feign集成hystrix

        3.1 FeignClient 接口实现降级策略,FallbackFactory

                3.1.1 服务正常测试

                 3.1.2 停掉api服务测试

                3.1.3 继续模拟频繁调用接口,则会触发熔断

 4.全局Hystrix配置

5.参考


1.项目引入hystirx

        1.1.项目引入hystrix坐标配置


org.springframework.cloudspring-cloud-starter-netflix-hystrix${spring.cloud.version}

        1.2.项目启动类启用断路器

package lilock.cn.user;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication(scanBasePackages = {"lilock.cn.*"})
@EnableConfigurationProperties
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"lilock.cn"})  //启用feign调用
@EnableCircuitBreaker // 启用断路器
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class,args);}
}

2. HystrixCommand 注解

Hystrix提供了HystrixCommand,用于配置关于Hystrix相关配置,如:回调方法、超时时间、熔断配置等。想要使用hystrix,必须是用@HystrixCommand注解

这种模式下的hystrix使用,配置都是基于 @HystrixCommand注解配置的,我们通过在方法上添加 @HystrixCommand 注解并配置注解的参数来实现配置。

        2.1 使用HystrixCommand 实现fallback

/*** 接口熔断* @return*/@HystrixCommand(fallbackMethod = "testHystrixError")@GetMapping("/testHystrix")public String testHystrix(){log.info("testHystrix 接口调用 apiCmsServiceFeignClient.getHello");String value = apiCmsServiceFeignClient.getHello();return "[testHystrix] 验证断路器" + value;}public String testHystrixError(){log.info("{} testHystrixError 调用失败",System.currentTimeMillis());return "enable testHystrixError";}

                2.1.1 正常性测试

                 2.1.2 停掉cms服务,模拟服务不可用

           

          2.2 通过DefaultProperties实现全局fallback

时候一个类里面会有多个 Hystrix 方法,每个方法都是类似配置的话会冗余很多代码,这时候我们可以在类上使用 @DefaultProperties 注解来给整个类的 Hystrix 方法设置一个默认降级方法,特别标注的,降级走特别标注的方法,没有特别标注的,降级走默认方法

@RestController
@RequestMapping(path = "/user")
@Api(value = "系统用户",tags = {"系统用户"})
@Slf4j
@DefaultProperties(defaultFallback = "defaultFallBackMethod")
public class UserController {/**** 模拟全局配置fallback*/@HystrixCommand@GetMapping("/testHystrixTimeOutFallback")public BaseResult testHystrixTimeOutFallback(@RequestParam("time") long time){BaseResult value = apiCmsHystrixServiceFeignClient.getHystrixTimeOut(time);log.info("testHystrixTimeOutFallback 接口调用 响应结果:{}",value);try{Thread.sleep(time);}catch (Exception e){}return value;}public BaseResult defaultFallBackMethod(){String errorMsg = System.currentTimeMillis() +  "defaultFallBackMethod 调用失败触发熔断";log.error("{}",errorMsg);return BaseResult.faild(errorMsg);}
}

                2.2.1 停到cms服务,模拟测试 

         2.3 通过自定义参数配置接口的熔断策略

配置一个超时时间,并且fallback走公共模式

/*** 模拟带参数走服务熔断* @return*/@HystrixCommand(commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")})@GetMapping("/testHystrixTimeDefault")public BaseResult testHystrixTimeDefault(long time){log.info("testHystrixTimeDefault 接口调用 apiCmsHystrixServiceFeignClient.testHystrixDefault");BaseResult value = apiCmsHystrixServiceFeignClient.getHystrix();try{Thread.sleep(time);}catch (Exception e){}return value;}public BaseResult defaultFallBackMethod(){String errorMsg = System.currentTimeMillis() +  "defaultFallBackMethod 调用失败触发熔断";log.error("{}",errorMsg);return BaseResult.faild(errorMsg);}

接口sleep 1000ms 时间小于降级1500ms时间,正常返回 

 接口sleep 2000ms时间大于降级1500ms时间,触发降级

 3.开启feign集成hystrix

配置文件开启

feign:hystrix:enabled: true

        3.1 FeignClient 接口实现降级策略,FallbackFactory

fallbackFactory的好处是可以统一配置

当然Api接口上也可以单独配置@HystrixCommand

package lilock.cn.cms.api;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import lilock.cn.cms.api.fallback.ApiCmsHystrixServiceFeignClientFallbackFactory;
import lilock.cn.common.resp.BaseResult;
import lilock.cn.common.ribbon.config.FeignConfig;
import lilock.cn.common.ribbon.constant.ApplicationServiceConstants;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;//FeignClient实现了FallbackFactory
@FeignClient(value = ApplicationServiceConstants.LILOCK_CMS_WEB,configuration = {FeignConfig.class},fallbackFactory = ApiCmsHystrixServiceFeignClientFallbackFactory.class)
public interface ApiCmsHystrixServiceFeignClient {@GetMapping("/getHystrix")BaseResult getHystrix();@GetMapping("/getHystrixTimeOut")@HystrixCommandBaseResult getHystrixTimeOut(@RequestParam long time);
}

                3.1.1 服务正常测试

                 3.1.2 停掉api服务测试

可以看到触发了fallbackFactory的服务降级,服务降级之后还会继续调用下游api

                3.1.3 继续模拟频繁调用接口,则会触发熔断

当降级的数量达到一定的百分比之后,接口就会触发熔断,触发熔断之后不会继续调用下游api

 4.全局Hystrix配置

hystrix:command:#全局默认配置default:execution:timeout:#是否给方法执行设置超时时间,默认为true。一般我们不要改。enabled: trueisolation:#配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式semaphore,使用比较少。strategy: threadPoolsemaphore:maxConcurrentRequests: 1000thread:#方式执行的超时时间,默认为1000毫秒,在实际场景中需要根据情况设置timeoutInMilliseconds: 60000#发生超时时是否中断方法的执行,默认值为true。不要改。interruptOnTimeout: true#是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!interruptOnCancel: false#熔断器相关配置##并发执行的最大线程数,默认10coreSize: 200#说明:是否允许线程池扩展到最大线程池数量,默认为false。allowMaximumSizeToDivergeFromCoreSize: true#说明:线程池中线程的最大数量,默认值是10。此配置项单独配置时并不会生效,需要启用allowMaximumSizeToDivergeFromCoreSizemaximumSize: 200#说明1:作业队列的最大值,默认值为-1。表示队列会使用SynchronousQueue,此时值为0,Hystrix不会向队列内存放作业。#说明2:如果此值设置为一个正int型,队列会使用一个固定size的LinkedBlockingQueue,此时在核心线程池都忙碌的情况下,会将作业暂时存放在此队列内,但是超出此队列的请求依然会被拒绝maxQueueSize: 20000#设置队列拒绝请求的阀值,默认为5。queueSizeRejectionThreshold: 30000circuitBreaker:#说明:是否启动熔断器,默认为true。我们使用Hystrix的目的就是为了熔断器,不要改,否则就不要引入Hystrix。enabled: true#说明1:启用熔断器功能窗口时间内的最小请求数,假设我们设置的窗口时间为10秒,#说明2:那么如果此时默认值为20的话,那么即便10秒内有19个请求都失败也不会打开熔断器。#说明3:此配置项需要根据接口的QPS进行计算,值太小会有误打开熔断器的可能,而如果值太大超出了时间窗口内的总请求数,则熔断永远也不会被触发#说明4:建议设置一般为:QPS*窗口描述*60%requestVolumeThreshold: 3000#说明1:熔断器被打开后,所有的请求都会被快速失败掉,但是何时恢复服务是一个问题。熔断器打开后,Hystrix会在经过一段时间后就放行一条请求#说明2:如果请求能够执行成功,则说明此时服务可能已经恢复了正常,那么熔断器会关闭;相反执行失败,则认为服务仍然不可用,熔断器保持打开。#说明3:所以此配置的作用是指定熔断器打开后多长时间内允许一次请求尝试执行,官方默认配置为5秒。sleepWindowInMilliseconds: 5000#说明1:该配置是指在通过滑动窗口获取到当前时间段内Hystrix方法执行失败的几率后,根据此配置来判断是否需要打开熔断器#说明2:这里官方的默认配置为50,即窗口时间内超过50%的请求失败后就会打开熔断器将后续请求快速失败掉errorThresholdPercentage: 70#说明:是否强制启用熔断器,默认false,没有什么场景需要这么配置,忽略!forceOpen: false#说明:是否强制关闭熔断器,默认false,没有什么场景需要这么配置,忽略!forceClosed: false

5.参考

https://zhuanlan.zhihu.com/p/339535352

https://blog.csdn.net/weixin_40482816/article/details/119215962

相关内容

热门资讯

山西太钢不锈钢股份有限公司 2... 来源:证券日报 证券代码:000825 证券简称:太钢不锈 公告编号:2026-001 本公司及董...
把自己的银行贷款出借给别人,有... 新京报讯(记者张静姝 通讯员邸越洋)因贷款出借后未被归还,原告牛女士将被告杨甲、杨乙诉至法院,要求二...
金价暴跌,刚买的金饰能退吗?有... 黄金价格大跌,多品牌设置退货手续费。 在过去两三天,现货黄金价格经历了“过山车”般的行情,受金价下跌...
预计赚超2500万!“豆腐大王... 图片来源:图虫创意 在经历了一年亏损后,“豆腐大王”祖名股份(003030.SZ)成功实现扭亏为盈。...
特朗普提名“自己人”沃什执掌美... 据新华社报道,当地时间1月30日,美国总统特朗普通过社交媒体宣布,提名美国联邦储备委员会前理事凯文·...
爱芯元智将上市:连年大额亏损,... 撰稿|多客 来源|贝多商业&贝多财经 1月30日,爱芯元智半导体股份有限公司(下称“爱芯元智”,HK...
一夜之间,10只A股拉响警报:... 【导读】深康佳A等10家公司昨夜拉响退市警报 中国基金报记者 夏天 1月30日晚间,A股市场迎来一波...
谁在操控淳厚基金?左季庆为谁趟... 2026年1月6日,证监会一纸批复核准上海长宁国有资产经营投资有限公司(下称“长宁国资”)成为淳厚基...
工商银行党委副书记、行长刘珺会... 人民财讯1月31日电,1月29日,工商银行党委副书记、行长刘珺会见来访的上海电气集团党委书记、董事长...
布米普特拉北京投资基金管理有限... 从亚马逊到联合包裹,一场席卷美国企业的“瘦身”行动正在持续。多家企业近期承认,近年来的扩张步伐迈得过...
酒价内参1月31日价格发布 飞... 来源:酒业内参 新浪财经“酒价内参”过去24小时收集的数据显示,中国白酒市场十大单品的终端零售均价在...
筹码集中的绩优滞涨热门赛道股出... 2025年以来,在受多重因素的刺激下,科技、航天、基础化工等热门赛道中走出轮番上涨的结构性行情,其中...
2026年A股上市公司退市潮开... 来源:界面新闻 界面新闻记者 赵阳戈 随着2026年序幕拉开,A股市场新一轮“出清”即将上演。...
雷军官宣新直播:走进小米汽车工... 【太平洋科技快讯】1 月 31 日消息,小米创办人、董事长兼 CEO 雷军在社交媒体发文宣布,将于 ...
现货黄金直线跳水,跌破5200... 新闻荐读 1月29日晚,现货黄金白银快速走低,回吐盘中全部涨幅。23:15左右,现货黄金跌破5300...
加拿大拟与多国联合设立国防银行 新华社北京1月31日电 加拿大财政部长商鹏飞1月30日说,加拿大将在未来数月与国际伙伴密切合作,推进...
马斯克大消息!SpaceX申请... 据券商中国,美东时间1月30日,路透社报道,据两位知情人士透露,马斯克旗下SpaceX公司2025年...
澳网:雷巴金娜2-1萨巴伦卡女... 北京时间1月31日,2026赛季网球大满贯澳大利亚公开赛继续进行,在女单决赛中,5号种子雷巴金娜6-...
春节前白酒促销热:“扫码抽黄金... 春节临近,白酒市场再现价格异动。 近日,飞天茅台批价拉升,有酒商直言“年前要冲2000元关口”,引发...