Spring Cloud(七)熔断机制
服务熔断简介
服务熔断也称服务隔离或者过载保护。在微服务应用中,服务存在一定的依赖关系,形成一定的依赖链。如果某个目标服务调用慢或者有大量超时,造成服务不可用,间接导致其他的依赖服务不可用,最严重的可能会阻塞整条依赖链,最终导致业务系统崩溃(又称雪崩效应)。此时,对该服务的调用执行熔断,对于后续请求,不再继续调用该目标服务,而是直接返回,从而可以快速释放资源。等到目标服务情况好转后,则可恢复其调用。
在Sping Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用达到一定阀值((5秒之内发生20次失败是Hystrix定义的缺省值),就会启动熔断机制。原本计划被调用的服务将不会被调用,取而代之的Hystrix会找到配置好的方法,进行快速的返回。
集成Hystrix
添加pom依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
使用Hystrix,主程序类上添加@EnableCircuitBreaker注解
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients @EnableCircuitBreaker public class CityServerApplication { public static void main(String[] args) { SpringApplication.run(CityServerApplication.class, args); } }
增加断路器,添加fallback属性。
@FeignClient(name="zuul-server",fallback=ApiClientFallback.class) public interface ApiClient { @GetMapping("/city/cities") List<CityVo> listCity() throws Exception; @GetMapping("/data/weather/cityId/{cityId}") WeatherResponse getDataByCityId(@PathVariable("cityId") String cityId); } @Component class ApiClientFallback implements ApiClient{ @Override public List<CityVo> listCity() throws Exception { List<CityVo> cityList = new ArrayList<>(); CityVo city = new CityVo(); city.setCityId("101280601"); city.setCityName("深圳"); cityList.add(city); city = new CityVo(); city.setCityId("101280301"); city.setCityName("惠州"); cityList.add(city); return cityList; } @Override public WeatherResponse getDataByCityId(String cityId) { return new WeatherResponse(); } }
设置application.properties配置文件
feign.client.config.feignName.connectTimeout=5000 feign.client.config.feignName.readTimeout=5000 feign.hystrix.enabled=true
服务运行后,我们断掉获取城市列表的服务,可以看到如下界面。程序并没有出现异常,而是取到了我们设置的默认值。我们再断掉获取天气信息的服务,可看到界面展现了我们异常处理的结果。
总结
通过代码实践可以看到,由于我们采取了熔断的策略,当我们宕调某个服务时,系统并没有出现异常,而是在我们处理的范围内正常运行。在我们的配置文件中,可以看到我们设置了超时时间。当我们服务间读取或者调用超过超时时间时,即可触发熔断,以防止由于某个服务异常或者运行时间超长,服务压力过大,系统性能降低的情况发生。
