千家信息网

Spring Cloud入门教程-Hystrix断路器实现容错和降级

发表于:2025-12-05 作者:千家信息网编辑
千家信息网最后更新 2025年12月05日,简介Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法。这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使用
千家信息网最后更新 2025年12月05日Spring Cloud入门教程-Hystrix断路器实现容错和降级

简介

Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法。这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使用web客户端访问/products API来获取产品列表,当产品服务故障时,则调用本地备用方法,以降级但正常提供服务。

基础环境

  • JDK 1.8
  • Maven 3.3.9
  • IntelliJ 2018.1
  • Git

项目源码

Gitee码云

添加产品服务

在intelliJ中创建一个新的maven项目,使用如下配置

  • groupId: cn.zxuqian
  • artifactId: productService

然后在pom.xml中添加如下代码:

    4.0.0    cn.zxuqian    productService    1.0-SNAPSHOT            org.springframework.boot        spring-boot-starter-parent        2.0.1.RELEASE                        UTF-8        1.8                            org.springframework.cloud            spring-cloud-starter-netflix-eureka-client                            org.springframework.cloud            spring-cloud-starter-config                            org.springframework.boot            spring-boot-starter-web                            org.springframework.boot            spring-boot-starter-test            test                                                    org.springframework.cloud                spring-cloud-dependencies                Finchley.M9                pom                import                                                                org.springframework.boot                spring-boot-maven-plugin                                                spring-milestones            Spring Milestones            https://repo.spring.io/libs-milestone                            false                        

我们继续使用了spring-cloud-starter-netflix-eureka-client以使产品服务自动注册到eureka服务中。然后还使用了spring-cloud-starter-config读取配置服务中心的配置文件。这个项目只是一个简单的spring web项目。

src/main/resources下创建bootstrap.yml文件,添加如下内容:

spring:  application:    name: product-service  cloud:    config:      uri: http://localhost:8888

在配置中心的git仓库中创建product-service.yml文件 添加如下配置并提交:

server:  port: 8081

此配置指定了产品服务的端口为8081。接着创建Application类,添加如下代码:

package cn.zxuqian;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}

@EnableDiscoveryClient注解将指示spring cloud自动把本服务注册到eureka。最后创建cn.zxuqian.controllers.ProductController控制器,提供/products API,返回示例数据:

package cn.zxuqian.controllers;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ProductController {    @RequestMapping("/products")    public String productList() {        return "外套,夹克,毛衣,T恤";    }}

配置Web客户端

打开我们之前创建的web项目,在pom.xml中新添Hystrix依赖:

    org.springframework.cloud    spring-cloud-starter-netflix-hystrix

然后更新Application类的代码:

package cn.zxuqian;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@EnableCircuitBreaker@EnableDiscoveryClient@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }    @Bean    public RestTemplate rest(RestTemplateBuilder builder) {        return builder.build();    }}

这里使用@EnableCircuitBreaker来开启断路器功能,然后还添加了一个rest方法并使用@Bean注解。这部分属于Spring依赖注入功能,使用@Bean标记的方法将告诉如何初始化此类对象,比如本例中就是使用RestTemplateBuilder来创建一个RestTemplate的对象,这个稍后在使用断路器的service中用到。

创建cn.zxuqian.service.ProductService类,并添加如下代码:

package cn.zxuqian.services;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.ServiceInstance;import org.springframework.cloud.client.discovery.DiscoveryClient;import org.springframework.stereotype.Service;import org.springframework.web.client.RestTemplate;import java.util.List;@Servicepublic class ProductService {    private final RestTemplate restTemplate;    @Autowired    private DiscoveryClient discoveryClient;    public ProductService(RestTemplate restTemplate) {        this.restTemplate = restTemplate;    }    @HystrixCommand(fallbackMethod = "backupProductList")    public String productList() {        List instances = this.discoveryClient.getInstances("product-service");        if(instances != null && instances.size() > 0) {            return this.restTemplate.getForObject(instances.get(0).getUri() + "/products", String.class);        }        return "";    }    public String backupProductList() {        return "夹克,毛衣";    }}

之所以要创建一个Service类,是因为Hystrix只能在标记为@Service@Component的类中使用,这样才能够正常使用Spring Context所提供的API。这个以后深入Spring时再作说明。使用`@HystrixCommand`注解后,Hystrix将监控被注解的方法即`productList`(底层使用proxy包装此方法以此实现监控),一旦此方法的错误累积到一定门槛的时候,就会启动断路器,后续所有调用`productList`方法的请求都会失败,而会临时调用`fallbackMethod`指定的方法`backupProductList()`,然后当服务恢复正常时,断路器就会关闭。
br/>使用`@HystrixCommand`注解后,Hystrix将监控被注解的方法即`productList`(底层使用proxy包装此方法以此实现监控),一旦此方法的错误累积到一定门槛的时候,就会启动断路器,后续所有调用`productList`方法的请求都会失败,而会临时调用`fallbackMethod`指定的方法`backupProductList()`,然后当服务恢复正常时,断路器就会关闭。
DiscoveryClient用以寻找产品服务的uri地址,使用产品服务的spring.application.name配置项的值,即product-service作为serviceID传给discoveryClient.getInstances()方法,然后会返回一个list,因为目前我们只有一个产品服务启动着,所以只需要取第一个实例的uri地址即可。
然后我们使用RestTemplate来访问产品服务的api,注意这里使用了Spring的构造方法注入,即之前我们用@Bean注解的方法会被用来初始化restTemplate变量,不需我们手动初始化。RestTemplate类提供了getForObject()方法来访问其它Rest API并把结果包装成对象的形式,第一个参数是要访问的api的uri地址,第二参数为获取的结果的类型,这里我们返回的是String,所以传给他String.class
backupProductList()方法返回了降级后的产品列表信息。

最后创建一个控制器cn.zxuqian.controllers.ProductController并添加如下代码:

package cn.zxuqian.controllers;import cn.zxuqian.services.ProductService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ProductController {    @Autowired    private ProductService productService;    @RequestMapping("/products")    public String productList() {        return productService.productList();    }}

这里使用ProductService/products路径提供数据。

测试

首先,我们使用spring-boot:run插件启动配置中心服务,config-server,然后启动eureka-server,再启动product-service,最后启动web客户端,稍等片刻待eureka服务注册成功之后访问http://localhost:8080/products,正常的情况下会得到外套,夹克,毛衣,T恤结果,然后我们关闭product-service,之后再访问同样的路径,会得到降级后的结果:夹克,毛衣

欢迎访问我的博客http://zxuqian.cn/spring-cloud-tutorial-hystrix/

服务 方法 产品 配置 产品服务 断路器 注解 代码 项目 夹克 此方法 毛衣 结果 监控 地址 客户 客户端 对象 文件 包装 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器命令解析失败 x86服务器中内存容错技术 网吧服务器组装酷睿 艾尔登法环维护服务器 源服务器管理工具 各大银行网络安全人员数量 网络技术工程师工作描述 委托开发软件开发票 计算机网络技术用英语怎么写 计算机三级网络技术好过吗 酒店要办网络安全许可证 苍之纪元星辉服务器大全 广东erp软件开发报价 灵玩网络技术有限公司官网 梦幻新诛仙回归找不到服务器 国外计算机网络技术现状 软件开发是不是工程类 软件开发项目开始前的准备工作 我的世界洛书南服务器 网络安全法有关职业的法律规定 我的世界服务器无限耐久武器 网络安全使用制度 代理服务器域名 绿坝数据库技术与应用 软件开发项目管理详解 计算机三级网络技术好过吗 索引重建之后数据库增大 天津兆龙软件开发公司 软件开发负责 成都捷驾网络技术有限公司
0