发表于: 2019-11-20 21:41:47
1 1241
今天做了什么
4.2.3 声明式REST调用 - 基于Feign
此部分示例主要演示了基于Feign如何实现声明式调用,包括以下内容:
(1)在启动类加上@EnableFeignClients注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients // 要使用Feign,需要加上此注解public class MovieServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MovieServiceApplication.class, args);
}
}
(2)自定义Feign配置的使用:位于movie-service-feign-customizing这个项目内
下面的Feign接口就使用了自定义的配置类FeignConfiguration。
@FeignClient(name = "user-service", configuration = FeignConfiguration.class)
public interface UserFeignClient {
@RequestLine("GET /{id}")
User findById(@Param("id") Long id);
}
(3)Feign的日志的使用:位于movie-service-feign-logging这个项目内
需要注意的是:Feign虽然提供了logger,但是其日志打印只会对DEBUG级别做出响应。日志级别一共有4种类型,如下所示:
Logger.Level 可选值:* NONE: 不记录任何日志(默认值)* BASIC: 仅记录请求方法、URL、响应状态码以及执行时间* HEADERS: 记录BASIC级别的基础之上,记录请求和响应的header* FULL: 记录请求和响应的header,body和元数据
要输出日志打印,application.yml内要设置DEBUG级别:
logging:
level:
# 将Feign接口的日志级别设置为DEBUG,因为Feign的Logger.Level只针对DEBUG做出响应
com.mbps.cd.movieservice.feign.UserFeignClient: DEBUG
最后,针对FULL级别的日志打印效果如下图所示:
4.2.4 容错处理 - 基于Hystrix
此部分示例主要演示如何基于Hystrix实现容错处理,主要包括以下内容:
(1)通用方式整合Hystrix:此示例位于movie-service项目中
针对普通的方法,只需加上HystrixCommand注解及定义回退方法即可,例如:
@HystrixCommand(fallbackMethod = "findByIdFallback")
@GetMapping(value = "/user/{id}")
public User findById(@PathVariable Long id) {
}
public User findByIdFallback(Long id){
User user = new User();
user.setId(-1L);
user.setUsername("Default User");
return user;
}
(2)Feign使用Hystrix:此示例位于movie-service-feign-hystrix项目中
针对Feign,它是以接口形式工作的,好在Spring Cloud已默认为Feign整合了Hystrix,不过默认是关闭的,需要手动在配置文件中开启:
feign:
hystrix:
enabled: true
在之前的版本(Dalston之前的版本)中是默认开启的,至于为何要改为默认禁用,可以看看这里:https://github.com/spring-cloud/spring-cloud-netflix/issues/1277
然后直接在FeignClient注解中加入fallback属性即可,例如下面所示:
@FeignClient(name = "user-service", fallback = FeignClientFallback.class)
public interface UserFeignClient {
@GetMapping(value = "/{id}")
User findById(@PathVariable("id") Long id);
}
@Component
class FeignClientFallback implements UserFeignClient{
@Override
public User findById(Long id) {
User user = new User();
user.setId(-1L);
user.setUsername("Default User");
return user;
}
}
如果想要在Feign发生回退时能够留下日志供查看回退原因,那么可以使用FallbackFactory,示例项目:movie-service-feign-fallback-factory.
@FeignClient(name = "user-service", fallbackFactory = FeignClientFallbackFactory.class)
public interface UserFeignClient {
@GetMapping(value = "/{id}")
User findById(@PathVariable("id") Long id);
}
@Component
class FeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {
private static final Logger LOGGER =
LoggerFactory.getLogger(FeignClientFallbackFactory.class);
@Override
public UserFeignClient create(Throwable cause) {
return new UserFeignClient() {
@Override
public User findById(Long id) {
/*
* 日志最好放在各个fallback中,而不要直接放在create方法中
* 否则在引用启动时,就会打印该日志
*/
FeignClientFallbackFactory.LOGGER.info("sorry, fallback. reason was: ", cause);
User user = new User();
user.setId(-1L);
user.setUsername("Default Username");
return user;
}
};
}
}
当发生回退时,日志输出信息如下:
收获 熟悉了Spring Cloud的Feign,Hystrix
遇到的问题
明天计划 :Hibernate ;Zuul,Archaius;
评论