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-service,hystrix-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.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboardartifactId>
        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,所以无法实现服务降级,服务间调用还是直接报异常。
SpringCloud微服务服务间调用之OpenFeign介绍(二) 启用fallback机制_第1张图片

第二张截图
我们创建了fallback类,也引入了Hystrix,同时启用feign.hystrix.enabled=true,所以当user-service不可用时,顺利实现服务降级。
SpringCloud微服务服务间调用之OpenFeign介绍(二) 启用fallback机制_第2张图片

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

SpringCloud微服务服务间调用之OpenFeign介绍(二) 启用fallback机制_第3张图片

你可能感兴趣的:(spring-cloud,服务降级,Feign,fallback,Hystrix,服务间调用)