RestTemplate方式调用存在的问题 1 2 3 4 String url = "http://userservice/user/" + order.getUserId(); User user = restTemplate.getForObject(url, User.class ) ;
代码可读性差,编程体验不统一
参数复杂URL难以维护
Feign是什么? Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送
https://github.com/OpenFeign/feign
定义和使用Feign客户端
1 2 3 4 <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-openfeign</artifactId > </dependency >
启动类添加@EnableFeignClients注解
实现client接口
1 2 3 4 5 6 @FeignClient ("userservice" )public interface UserClient { @GetMapping ("/user/{id}" ) User findById (@PathVariable("id" ) Long id) ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private UserClient userClient; public Order queryOrderById (Long orderId) { Order order = orderMapper.findById(orderId); User user = userClient.findById(order.getUserId()); order.setUser(user); return order; } }
自定义Feign配置 Feign运行自定义配置来覆盖默认配置,可以修改的配置如下
类型
作用
说明
feign.Logger.Level
修改日志级别
四种级别:NONE,BASIC,HEADERS,FULL
feign.codec.Decoder
响应结果的解析器
http远程调用的结果做解析
feign.codec.Encoder
请求参数编码
将请求参数编码,便于通过http请求发送
feign.Contract
支持的注解格式
默认是SpringMVC的注解
feign.Retryer
失败重试机制
请求失败的重试机制,默认没有,会使用Ribbon的
一般需要配置的是日志级别
Feign日志配置
配置文件方式
1 2 3 4 feign: client: default: loggerLevel: FULL
1 2 3 4 feign: client: userservice: 服务名称 loggerLevel: FULL
Java代码方式,需要声明Bean
1 2 3 4 5 6 public class FeignClientConfiguration { @Bean public Logger.Level.feignLogLevel() { return Logger.Level.BASIC; } }
全局配置,放在@EnableFeignClients注解中
1 @EnableFeignClients (defaultConfiguration = FeignClientConfiguration.class )
1 @FeignClient (value = "userservice" , configuration = FeignClientConfiguration.class )