HTTP客户端Feign
Feign替代RestTemplate
RestTemplate方式调用存在的问题
RestTemplate调用示例
String url = "http://userservice/user/"+order.getUserId();
User user = restTemplate.getForObject(url,User.class);
存在问题:
- 代码可读性差,编程体验不统一
- 参数复杂URL难以维护
Feign
feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用是帮助我们优雅的实现发送http请求,解决上述问题
定义和使用Feign客户端
-
引入依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
在服务的启动类中添加注解开启Feign功能:
@EnableFeignClients
-
编写Feign客户端:
示例:
@FeignClient("userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
主要是基于SpringMVC的注解来声明远程调用的信息,比如:
- 服务名称:userservice
- 请求方式:GET
- 请求路径:/user/{id}
- 请求参数:Long id
- 返回值类型:User
-
使用Feign远程调用
@Autowired private UserClient userClient; public User queryUserById(Long userId){ User user = userClient.findById(userId); returen user; }
自定义Feign配置
类型 | 作用 | 说明 |
---|---|---|
feign.Logger.Level | 修改日志级别 | 包含四种不同级别:NONE,BASIC,HEADERS,FULL |
feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 |
feign.codeec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 |
feign.Contract | 支持的注解格式 | 默认是SpringMVC的注解 |
feign.Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 |
以上并非全部,一般我们需要配置的就是日志级别.
- NONE:没有日志信息
- BASIC:基本的日志信息,如发起时间,接收时间,耗时
- HEADERS:除了基本信息外,还添加了请求头和响应头等信息
- FULL:还会在上一级的基础上添加请求体和响应体信息
配置Feign日志有两种方式:
方式一:配置文件的方式
-
全局生效:
feign: client: config: default: #使用default是对全局进行配置,写服务名称是对某个微服务进行配置 loggerLevel:FULL #日志级别
-
局部配置:
feign: client: config: userservice: #使用default是对全局进行配置,写服务名称是对某个微服务进行配置 loggerLevel:FULL #日志级别
方式二:java代码配置
-
首先声明一个Bean类
public class FeignClientConfiguration { @Bean public Logger.Level feignLogLevel(){ return Logger.Level.BASIC; } }
-
而后如果是全局配置,则把它放到@EnableFeignClients这个注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
-
如果是局部配置,则把它放到@FeignClient这个注解中
@FeignClient(value = "userservice",configuration = FeignClientConfiguration.class)