Spring Cloud(三) Feign 声明式服务调用

一、Feign 简介

在上一章介绍Ribbon时,我们使用RestTemplate调用服务,如果是http://user-service/users/id 只有一个参数的URL还好,如果有多个参数的URl,例http://user-service/users?id=1&username="xxx",我们就要采取restTemplate封装的另一种方式。
Map map = new HashMap(); map.put("id",id); map.put("username",username) this.restTemplate.getForEntity("http://user-service/users/",User.class,map)
这两种方式都可以达到功能,程序猿天生就喜欢偷懒,就诞生了声明式的客户端Feign。

二、Feign 入门

  1. 加入Feign依赖
 
    org.springframework.cloud
    spring-cloud-starter-openfeign
    2.1.2.RELEASE

在Maven仓库feign的依赖也推荐使用此依赖替代spring-cloud-starter-feign
2.新建Feign接口

@FeignClient(name="user-service")
public interface UserService {
    @GetMapping("/users/{id}") User findById(@PathVariable("id") Long id);
}

@FeignClient中的name即为服务提供方的名称。使用Spring MVC的注解来发起http请求,对熟悉Spring MVC的开发者简直是个福音
3.Controller中调用

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("user/{id}")
    public User findUserById(@PathVariable("id") Long id){
        return userService.findById(id);
    }
  1. 主应用程序中加入@EnableFeignClients开启Feign的支持功能
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableFeignClients
public class FeginConsumerApplication {

    public static void main(String[] args) { SpringApplication.run(FeginConsumerApplication.class, args);
    }

}
  1. 开启Eureka注册中心,两个服务提供者,浏览器中访问/user/2,访问两次此地址,分别看服务1和服务2的控制台:


    image.png

    image.png

从图片中看出Feign集成了负载均衡的功能,我们也许会想到它是基于Ribbon做的负载均衡的功能,毕竟他是Spring Cloud全家桶中的一员嘛,让我们打开它的POM一探究竟;


image.png

我们发现在eureka-client中引入了Ribbon,所以这里就有负载均衡的功能;

三、Feign 配置

Feign中默认的配置类为FeignClientsConfiguration,细细阅读我们发现以下几大类配置:

  • Decoder:ResponseEntityDecoder
  • Encoder:SpringEncoder
  • Contract:SpringMvcContract(这里就解释了为什么可以使用SpringMVC的注解)
  • Retryer:Retryer.NEVER_RETRY(失败也不重试,等会我们改写此项配置)
    我们先在客户端加入Ribbon超时时间和3000毫秒内的随机超时;
ribbon:
  ConnectTimeout: 1000
  ReadTimeout: 1000
  MaxAutoRetries: 0

起先没有重新重试配置时,只要超过1000就会访问就会报500的错误;
我们加入Feign重试机制

 @Bean
    public Retryer feignRetryer(){
        return new Retryer.Default(100,100000,5);
    }
image.png

此时重试机制就起作用了只要访问时间超过1000毫秒就重试,重试最大次数为5次;

四、其他配置

  1. 日志配置
    Feign客户端日志级别:
  • none:不记录日志(默认的记录方式)
  • basic:记录请求方式、状态码和请求时间
  • headers:除basic之外,还会记录响应头和请求头信息
  • full:除headers外,还会记录请求和响应的详细内容,以及元数据
    1.1 配置Feign日志
    添加日志级别
logging:
  level:
    com:
      ybb:
       feginconsumer:
         service: DEBUG

配置Feign的日志级别

@Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }

为FeignClient装载配置

@FeignClient(name="user-service",configuration = FeignConfiguration.class)
public interface UserService {
     @GetMapping("/users/{id}") 
     User findById(@PathVariable("id") Long id);
}

实现截图:


image.png

你可能感兴趣的:(Spring Cloud(三) Feign 声明式服务调用)