发表于: 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) {
return restTemplate.getForObject("http://user-service/" + id, User.class);
}
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;



返回列表 返回列表
评论

    分享到