前提:
阅读本文前请先参考《SpringCloud微服务服务间调用之OpenFeign介绍(一) 》
问题由来
使用Feign可以完成服务间调用,但是总存在一种情况:服务提供方没有注册到注册中心、服务提供方还没开发完成(因为也就无法调用)等等。此时如果我们需要完成服务间调用该如何做呢?
Feign提供了fallback机制,也就是当对方服务还没ready(一般情况是服务提供方在注册中心上没有可用的实例),可以返回信息供服务进行下,也就是服务降级。
解决办法
完整的代码在这里: 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.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
网友评论