服务架构开发实战:熔断与降级的区别、如何集成Hystrix

2022-10-28 16:16:55 浏览数 (1)

熔断与降级的区别

熔断与降级的区别,很多开发者都会产生混淆。下面总结下两者的异同点。

熔断与降级的相似点

服务降级与服务熔断两者从某些角度看是有一定的类似性的。

·目的一致。两者都是从可用性、可靠性出发,为防止系统的整体缓慢甚至崩溃而采用的技术手段。

·表现类似。两者最终表现都是让用户体验到的是某些服务暂时不可达或不可用。

·粒度一致。一般都是服务级别,当然,业界也有不少更细粒度的做法,如做到数据持久层(允许查询,不允许增删改)﹔都依赖自动化。服务熔断一般都是服务基于策略的自动触发,服务降级虽说可人工干预,但在微服务架构下,完全靠人显然不现实,所以会纳入自动化配置。

熔断与降级的区别

两者的主要区别有两点。

·触发条件不同。服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑。

.管理目标的层次不同。服务熔断针对的是整个框架级的处理,每个微服务都是需要的,并无层级之分;而服务降级一般需要对业务有层级之分,比如降级—般是从最外围服务开始。


如何集成 Hystrix

在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,就会启动熔断机制。熔断机制的注解是@HystrixCommand,Hystrix会找有这个注解的方法,并将这类方法关联到和熔断器连在一起的代理上。

本节我们将基于Hystrix来实现断路器。

在 micro-weather-cureka-client-feign的基础上稍作修改,即可成为一个新的应用micro-weath-er-eureka-client-feign-hystrix,并将其作为示例。

所需环境

为了演示本例子,需要采用如下开发环境。

  • JDK8.
  • Gradle 4.0。
  • Spring Boot 2.0.0.M3。
  • Spring Cloud Starter Netflix Eureka Client Finchley.M2。
  • Spring Cloud Starter OpenFeign Finchley.M2。
  • .Spring Cloud Starter Netflix Hystrix Finchley.M2。

更改配置

要使用Hystrix,最简单的方式莫过于添加Hystrix依赖。

代码语言:javascript复制
dependencies{
//...
//添加 Spring Cloud Starter Netflix Hystrix依赖
compile('org.springframework.cloud:spring-cloud-starter-netflix-
hystriz')
)

使用Hystrix

代码语言:javascript复制
要启用Hystrix,最简单的方式就是在应用的根目录的Application类上添加org.springframe-work.cloud.client.circuitbreaker.EnableCircuitBreaker注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.Enable
CircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscovery
Client;
import org.springframework.cloud.netflix.feign.EnableEeignClients;
/**

主应用程序.
*
*@since 1.o.0 2017年11月12日
* @author <a href="https://waylau.com">Way Lau</a>
*/
@SpringBootApplication
EnableDiscoveryClient
@EnableFeignClients
EnableCircuitBreaker
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}

增加断路器

原有的 micro-weather-eureka-client-feign,已经定义了用Feign客户端CityClient.import org.springframework.cloud.netflix.feign.FeignClient;

代码语言:javascript复制
import org.springframework.web.bind.annotation.GetMapping;
/**
*访问城市信息的客户端.
*
*@since 1.0.0 2017年11月4日
*@author <a href="https://waylau.com">Way Lau</a>
*/
FeignClient("msa-weather-city-eureka")
public interface CityClient {
@GetMapping("/cities")
String listCity();
}

CityClient实现了从城市数据API微服务msa-weather-city-eureka中获取城市的信息。

我们在调用CityClient的CityController.listCity()方法之上,增加 com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand注解。

代码语言:javascript复制
package com.waylau.spring.cloud.weather.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
iavanica.annotation.HystrixCommand;
import com.waylau.spring.cloud.weather.service.cityClient;
/**
*City controller.
*
*since 1.o.o 2017年11月04日
* @author <a href="https://waylau.com">Way Lau</a>
*/
@RestController
public class CityController {
@Autowired
private CityClient cityClient;
@GetMapping("/cities")
@HystrixCommand(fallbackMethod = "defaultCities")
public String listCity({
//通过Feign客户端来查找
String body = cityClient.listCity(;
return body;
/*大
*自定义断路器默认返回的内容
*@return
*/
public String defaultCities(){
return"城市数据API服务暂时不可用!";
}
}

HystrixCommand注解中,我们设置了fallbackMethod 的值为“defaultCities”。fallbackMethod是用于设置回调的方法,这里我们定义了一个返回默认值为“城市数据API服务暂时不可用!”的方法。

修改应用配置

应用配置修改如下。

代码语言:javascript复制
spring.application.name: micro-weather-eureka-client-feign-hystrix
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
feign.client.config.feignName.connectTimeout:5000
feign.client.config.feignName.readTimeout: 5000

运行、测试

启动在之前章节中创建的 micro-weather-eureka-server和 msa-weather-city-eureka两个项目,以及本例的micro-weather-eureka-client-feign-hystrix。其中,micro-weather-cureka-server默认启动在8761端口,msa-weather-city-cureka启动在8085端口,micro-weather-eureka-client-feign-hystrix启动在8080端口。

代码语言:javascript复制
java -jar micro-weather-eureka-server-1.0.0.jar --server.port=8761
java -jar msa-weather-city-eureka-1.0.0.jar--server.port=8085
java -jar micro-weather-eureka-client-feign-hystrix-1.0.0.jar --server.
port=8080

如果一切正常,那么 micro-weather-cureka-server运行的管理界面,能看到上述服务的信息。

在浏览器访问 micro-weather-cureka-client-feign-hystrix服务(本例地址为http:/localhost:8080 ) ,当我们试图访问http:/localhost:8080/cities接口时,访问如果一切正常,可以在页面看到如图15-2所示msa-weather-city-eureka服务正常时所响应的内容。

我们关闭msa-weather-city-eureka服务进程,来模拟城市数据API微服务不可用时的状态。此时,再次访问 http://localhost:8080/cities接口时,可以在页面看到如图15-3所示HystrixCommand回调方法所响应的内容。

源码

本节示例所涉及的源码,见 micro-weather-eureka-server、micro-weather-cureka-client-feign.msa-weather-city-eureka,以及micro-weather-eureka-client-feign-hystrixo

本篇文章内容给大家讲解的是熔断与降级的区别、如何集成 Hystrix

  1. 下篇文章给大家讲解的是实现微服务的熔断机制;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

0 人点赞