熔断与降级的区别,很多开发者都会产生混淆。下面总结下两者的异同点。
熔断与降级的相似点服务降级与服务熔断两者从某些角度看是有一定的类似性的。
·目的一致。两者都是从可用性、可靠性出发,为防止系统的整体缓慢甚至崩溃而采用的技术手段。
·表现类似。两者最终表现都是让用户体验到的是某些服务暂时不可达或不可用。
·粒度一致。一般都是服务级别,当然,业界也有不少更细粒度的做法,如做到数据持久层(允许查询,不允许增删改)﹔都依赖自动化。服务熔断一般都是服务基于策略的自动触发,服务降级虽说可人工干预,但在微服务架构下,完全靠人显然不现实,所以会纳入自动化配置。
熔断与降级的区别两者的主要区别有两点。
·触发条件不同。服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑。
.管理目标的层次不同。服务熔断针对的是整个框架级的处理,每个微服务都是需要的,并无层级之分;而服务降级一般需要对业务有层级之分,比如降级—般是从最外围服务开始。
在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,就会启动熔断机制。熔断机制的注解是@HystrixCommand,Hystrix会找有这个注解的方法,并将这类方法关联到和熔断器连在一起的代理上。
本节我们将基于Hystrix来实现断路器。
在micro-weather-cureka-client-feign的基础上稍作修改,即可成为一个新的应用micro-weath-er-eureka-client-feign-hystrix,并将其作为示例。
所需环境为了演示本例子,需要采用如下开发环境。
要使用Hystrix,最简单的方式莫过于添加Hystrix依赖。
dependencies{
//...
//添加 Spring Cloud Starter Netflix Hystrix依赖
compile('org.springframework.cloud:spring-cloud-starter-netflix-
hystriz')
)
使用Hystrix
要启用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;
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注解。
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服务暂时不可用!”的方法。
修改应用配置应用配置修改如下。
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端口。
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
本篇文章内容给大家讲解的是熔断与降级的区别、如何集成 HystrixCopyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved