springcloud熔断器Hystrix

it2025-08-08  13

参考:https://blog.csdn.net/qq_41402200/article/details/90447408

Hystrix 负责监控服务之间的调用情况,连续多次失败的情况进行熔断保护。保护的方法就是使用 Fallback,当调用的服务出现故障时,就可以使用 Fallback 方法的 返回值;Hystrix 间隔时间会再次检查故障的服务,如果故障服务恢复,将继续使用服务。

 

实例:service工程

① 此工程下有四个模块:一个注册中心以及服务 A、B、C

② A 提供服务并且调用服务 B、B 提供服务并且调用服务 C 以及 C 提供服务

服务A(提供者和消费者)

服务工程 A -  application.properties(注意)

# 开启断路器 feign.hystrix.enabled=true

断路器要主动开启,服务调用失败时才会熔断 此处有一个坑,把此配置写到 application.yml 中熔断不会生效 A 和 B 工程都有此配置,此次搭建中 C 工程只提供服务,没有消费服务。所以 C 工程不用该配置 application.properties 和 bootstrap.yml 二选一就行

或者:服务工程 A -  bootstrap.yml(注意)  

feign: hystrix: # 开启断路器 enabled: true

A工程:- controller 前端控制器(提供服务)

import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /* * @ClassName ASayHelloController * @Desc TODO Say Hello * @Date 2019/5/20 23:24 * @Version 1.0 */ @RestController public class ASayHelloController { /* * @ClassName ASayHelloController * @Desc TODO 读取配置文件中的端口 * @Date 2019/5/20 23:24 * @Version 1.0 */ @Value("${server.port}") private String port; /* * @ClassName ASayHelloController * @Desc TODO Say Hello * @Date 2019/5/20 23:24 * @Version 1.0 */ @RequestMapping("/a") public String a(){ return "Hello!I'm a. port:" + port; } }

提供一个服务:输出 Hello 和端口

服务工程 A - 服务调用

package com.zwc.a.api.feign; import com.zwc.a.api.impl.FeignApiFallBack; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; /* * @ClassName FeignApi * @Desc TODO 使用 Feign 调用 b - 接口 * @Date 2019/5/20 23:21 * @Version 1.0 */ @FeignClient(value = "hystrix-b" , fallback = FeignApiFallBack.class) public interface FeignApi { /* * @ClassName FeignApi * @Desc TODO 通过 hystrix-b 服务名调用 b() 方法 * @Date 2019/5/20 23:21 * @Version 1.0 */ @RequestMapping("/b") String b(); }

通过 @FeignClient 注解中 value = "hystrix-b" 来指定调用哪个服务 hystrix-b 就是提供者的 spring.application.name:应用名称 通过 @FeignClient 注解中 fallback = FeignApiFallBack.class 来指定熔断时调用的方法 FeignApiFallBack 就是此接口(FeignApi)的实现类,对应的实现方法就是熔断时调用的方法 b():此方法是 B 工程中提供的服务,在这里定义成接口 注意要与提供者具有相同返回值,相同方法名以及相同参数

服务工程 A - Fallback(FeignApiFallBack)

package com.zwc.a.api.impl; import com.zwc.a.api.feign.FeignApi; import org.springframework.stereotype.Component; /* * @ClassName FeignApi * @Desc TODO fallback * @Date 2019/5/20 23:21 * @Version 1.0 */ @Component public class FeignApiFallBack implements FeignApi { /* * @ClassName FeignApiFallBack * @Desc TODO 调用 hystrix-b 服务中的 b() 方法失败时执行 * @Date 2019/5/20 23:31 * @Version 1.0 */ @Override public String b() { return "Hello!aUseB fail"; } }

服务工程 A - controller 前端控制器(消费服务)

package com.zwc.a.controller; import com.zwc.a.api.feign.FeignApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /* * @ClassName AUseBFeignController * @Desc TODO 使用 Feign 调用 b - 前端控制器 * @Date 2019/5/20 23:23 * @Version 1.0 */ @RestController public class AUseBFeignController { @Autowired(required = false) private FeignApi feignApi; /* * @ClassName FeignController * @Desc TODO 通过 hystrix-b 服务名调用 b() 方法 * @Date 2019/5/20 23:13 * @Version 1.0 */ @RequestMapping("/aUseB") public String aUseB(){ return feignApi.b(); } }

服务工程 A - 启动类

package com.zwc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class SpringcloudHystrixAServiceCoreApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudHystrixAServiceCoreApplication.class, args); } }

服务工程 A - 启动项目

  1. 项目启动成功后访问:http://localhost:8090/a (调用自己的服务)

  2. 输出内容:'Hello!I'm a. port:8090'

  4. 访问地址:http://localhost:8090/aUseB (调用 B 工程的服务)

  5. 输出内容:'Hello!aUseB fail' (此时因为 B 工程还未启动,所以调用了 fallback 中的方法)

  6. 启动服务工程 B,项目启动成功后再次访问:http://localhost:8090/aUseB (调用 B 工程的服务)

  7. 输出内容:'Hello!I'm b. port:8091' (如果还未调用成功,等待一会再刷新试试)

  8. 此时就证明熔断成功

  9. 访问地址:http://localhost:8091/b (调用自己的服务)

 10. 输出内容:'Hello!I'm b. port:8091'

 

 

最新回复(0)