熔断与降级的区别
熔断与降级的区别,很多开发者都会产生混淆。下面总结下两者的异同点。
熔断与降级的相似点
服务降级与服务熔断两者从某些角度看是有一定的类似性的。
·目的一致。两者都是从可用性、可靠性出发,为防止系统的整体缓慢甚至崩溃而采用的技术手段。
·表现类似。两者最终表现都是让用户体验到的是某些服务暂时不可达或不可用。
·粒度一致。一般都是服务级别,当然,业界也有不少更细粒度的做法,如做到数据持久层(允许查询,不允许增删改)﹔都依赖自动化。服务熔断一般都是服务基于策略的自动触发,服务降级虽说可人工干预,但在微服务架构下,完全靠人显然不现实,所以会纳入自动化配置。
熔断与降级的区别
两者的主要区别有两点。
·触发条件不同。服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑。
.管理目标的层次不同。服务熔断针对的是整个框架级的处理,每个微服务都是需要的,并无层级之分;而服务降级一般需要对业务有层级之分,比如降级—般是从最外围服务开始。
如何集成 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
- 下篇文章给大家讲解的是实现微服务的熔断机制;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!
本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。