微服务容灾组件:spring-cloud-netflix-hystrix 的使用
在分布式系统下,微服务之间不可避免地会发生相互调用,但是没有一个系统能够保证自身运行的绝对正确性,微服务在调用过程中,很可能会面临被依赖服务失效的问题,这些问题的发生有诸多情况,有可能是因为微服务之间的网络通信出现较大的延迟、又或者是被依赖的微服务抛出了调用异常、还有可能是因为被依赖的微服务负载过大无法及时响应请求等等原因。本系列文章将会介绍 Hystrix 的相关使用与原理。
spring-cloud-netflix-hystrix对Hystrix进行封装和适配,使Hystrix能够更好地运行于spring-cloud环境中,为微服务之间调用提供强有力的容错机制,防止服务雪崩效应的发生。
我们来看下如何使用spring-cloud-netflix-hystrix。
继续上一篇,接着是编写相关的服务:
@Service
public class InstanceService {
private static String DEFAULT_SERVICE_ID = "application";
private static String DEFAULT_HOST = "localhost";
private static int DEFAULT_PORT = 8080;
private static Logger logger = LoggerFactory.getLogger(InstanceService.class);
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "instanceInfoGetFail")
public Instance getInstanceByServiceIdWithRestTemplate(String serviceId){
Instance instance = restTemplate.getForEntity("http://FEIGN-SERVICE/feign-service/instance/{serviceId}", Instance.class, serviceId).getBody();
return instance;
}
private Instance instanceInfoGetFail(String serviceId){
logger.info("Can not get Instance by serviceId {}", serviceId);
return new Instance("error", "error", 0);
}
}
通过@HystrixCommand
注解为getInstanceByServiceIdWithRestTemplate()
指定了回滚方法instanceInfoGetFail()
,该方法返回了全是error的实体类信息。在getInstanceByServiceIdWithRestTemplate()
方法中通过restTemplate
从feign-service
服务中调用相关的接口,期望返回结果,通过@HystrixCommand
注解将该方法纳入到Hystrix的监控中。
编写相关的controller,调用getInstanceByServiceIdWithRestTemplate()
,尝试获得结果并返回。
@RestController
@RequestMapping("/instance")
public class InstanceController {
private static final Logger logger = LoggerFactory.getLogger(InstanceController.class);
@Autowired
InstanceService instanceService;
@RequestMapping(value = "rest-template/{serviceId}", method = RequestMethod.GET)
public Instance getInstanceByServiceIdWithRestTemplate(@PathVariable("serviceId") String serviceId){
logger.info("Get Instance by serviceId {}", serviceId);
return instanceService.getInstanceByServiceIdWithRestTemplate(serviceId);
}
}
依次启动eureka-server
、feign-service
(feign-service
为 feign-service 项目以及本服务。
访问http://localhost:8876/instance/rest-template/my-application
接口。
{"serviceId":"my-application","host":"localhost","port":8080}
访问成功执行,返回预期中结果。
关闭feign-service
,再次访问http://localhost:8876/instance/rest-template/my-application
接口。
{"serviceId":"error","host":"error","port":0}
这说明在feign-service
服务不可用时,系统执行失败回滚方法,返回error结果。
小结
本文主要介绍了 spring-cloud-netflix-hystrix 的使用,通过在 Spring Cloud 中增加相关的依赖,使用注解可以很方便的开启 Hystrix 熔断的功能,下面的文章将会介绍如何与 feign 结合,并进行配置。
- 点赞
- 收藏
- 关注作者
评论(0)