一、Feign 简介
在上一章介绍Ribbon时,我们使用RestTemplate调用服务,如果是http://user-service/users/id 只有一个参数的URL还好,如果有多个参数的URl,例http://user-service/users?id=1&username="xxx",我们就要采取restTemplate封装的另一种方式。
Map<String,Object> map = new HashMap(); map.put("id",id); map.put("username",username) this.restTemplate.getForEntity("http://user-service/users/",User.class,map)
这两种方式都可以达到功能,程序猿天生就喜欢偷懒,就诞生了声明式的客户端Feign。
二、Feign 入门
- 加入Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
在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);
}
- 主应用程序中加入@EnableFeignClients开启Feign的支持功能
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableFeignClients
public class FeginConsumerApplication {
public static void main(String[] args) { SpringApplication.run(FeginConsumerApplication.class, args);
}
}
-
开启Eureka注册中心,两个服务提供者,浏览器中访问/user/2,访问两次此地址,分别看服务1和服务2的控制台:
image.png
image.png
从图片中看出Feign集成了负载均衡的功能,我们也许会想到它是基于Ribbon做的负载均衡的功能,毕竟他是Spring Cloud全家桶中的一员嘛,让我们打开它的POM一探究竟;
我们发现在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);
}
此时重试机制就起作用了只要访问时间超过1000毫秒就重试,重试最大次数为5次;
四、其他配置
- 日志配置
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);
}
实现截图: