SpringCloud微服务服务间调用之OpenFeign介绍(二) 启用fallback机制

前提:
阅读本文前请先参考《SpringCloud微服务服务间调用之OpenFeign介绍(一) 》

问题由来

使用Feign可以完成服务间调用,但是总存在一种情况:服务提供方没有注册到注册中心、服务提供方还没开发完成(因为也就无法调用)等等。此时如果我们需要完成服务间调用该如何做呢?
Feign提供了fallback机制,也就是当对方服务还没ready(一般情况是服务提供方在注册中心上没有可用的实例),可以返回信息供服务进行下,也就是服务降级。

解决办法

官方文档:http://cloud.spring.io/spring-cloud-openfeign/single/spring-cloud-openfeign.html#spring-cloud-feign-hystrix-fallback

完整的代码在这里: user-servicehystrix-user-service, 欢迎加星、fork。
主要使用consul 1.2.0, Spring Boot 1.5.12, Spring Cloud Edgware.RELEASE。
Feign结合Hystrix可以实现服务降级
1, 需要引入Hystrix依赖并在启动类和配置文件中启用Hystrix

pom文件增加如下依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

启动类加上@EnableHystrix,@EnableHystrixDashboard,@EnableFeignClients

@SpringBootApplication
@EnableHystrix
@EnableHystrixDashboard
@EnableDiscoveryClient
@EnableCircuitBreaker
//@EnableTurbine
@EnableFeignClients(basePackages = {"com.yq.client"})
public class HystrixDemoApplication {
    private static final Logger logger = LoggerFactory.getLogger(HystrixDemoApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(HystrixDemoApplication.class, args);
        logger.info("HystrixDemoApplication Start done.");
    }
}

配置文件中feign启用hystrix

feign.hystrix.enabled=true

2, 实现自己的fallback服务

feignClient类

@FeignClient(value = "user-service", fallback = UserServiceClientFallbackFactory.class)
@Component
public interface UserServiceClient {
    @RequestMapping(value = "/v1/users/{userId}", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
    String getUserDetail(@PathVariable("userId") String userId);
}

自定义的fallback类

@Component
@Slf4j
public class UserServiceClientFallbackFactory implements UserServiceClient{
    @Override
    public String getUserDetail(String userId) {
        log.error("Fallback2, userId={}", userId);
        return "user-service not available2 when query '" + userId + "'";
    }
}

效果截图

第一张截图
虽然我们创建了fallback类,也引入了Hystrix,但是没有启用feign.hystrix.enabled=true,所以无法实现服务降级,服务间调用还是直接报异常。


feign001_NoEnableHystrix.png

第二张截图
我们创建了fallback类,也引入了Hystrix,同时启用feign.hystrix.enabled=true,所以当user-service不可用时,顺利实现服务降级。


feign002_EnableHystrix.png

第三张, user-service服务正常, fallback不影响原有服务间调用正常进行。


feign003_userServiceON.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,488评论 19 139
  • 1 为什么需要服务发现 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基...
    谦小易阅读 25,298评论 4 93
  • 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,并且能够发挥...
    java菜阅读 3,038评论 0 6
  • 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,并且能够发挥...
    程序员技术圈阅读 2,832评论 10 27
  • 下晚自习匆匆回家的儿子,以最快速度冲进房间,拿起手机开机,慵懒地躺在沙发上开始玩起来。玩手机是十点半结束,15分钟...
    木子_ecab阅读 318评论 0 0

友情链接更多精彩内容