微服务容灾组件:spring-cloud-netflix-hystrix 的使用

举报
溜溜丽 发表于 2021/08/04 23:04:49 2021/08/04
【摘要】 在分布式系统下,微服务之间不可避免地会发生相互调用,但是没有一个系统能够保证自身运行的绝对正确性,微服务在调用过程中,很可能会面临被依赖服务失效的问题,这些问题的发生有诸多情况,有可能是因为微服务之间的网络通信出现较大的延迟、又或者是被依赖的微服务抛出了调用异常、还有可能是因为被依赖的微服务负载过大无法及时响应请求等等原因。本系列文章将会介绍 Hystrix 的相关使用与原理。spring-...

在分布式系统下,微服务之间不可避免地会发生相互调用,但是没有一个系统能够保证自身运行的绝对正确性,微服务在调用过程中,很可能会面临被依赖服务失效的问题,这些问题的发生有诸多情况,有可能是因为微服务之间的网络通信出现较大的延迟、又或者是被依赖的微服务抛出了调用异常、还有可能是因为被依赖的微服务负载过大无法及时响应请求等等原因。本系列文章将会介绍 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()方法中通过restTemplatefeign-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-serverfeign-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 结合,并进行配置。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。