Fegin远程调用
Fegin的介绍
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
Fegin的使用步骤
- 引入依赖
- 添加@EnableFeignClients注解
- 编写FeignClient接口
- 使用FeignClient中定义的方法替代RestRemplate
引入依赖
1
2
3
4
5<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>在需要远程调用服务的启动类添加注解开启Fegin的功能
1
2
3
4
5
6
7
8
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}编写Feign客户端
1
2
3
4
5
6
7
public interface UserClient {
User findById(; Long id)
}使用Feign客户端替代RestTemplate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class OrderService {
private OrderMapper orderMapper;
// @Autowired
// private RestTemplate restTemplate;
private UserClient userClient;
//Feign客户端远程调用方式
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用RestTemplate发起http请求
User user = userClient.findById(order.getUserId());
//3.将获取的user对象添加到order里去
order.setUser(user);
// 4.返回
return order;
}
//RestTemplate远程调用方式
// public Order queryOrderById(Long orderId) {
// // 1.查询订单
// Order order = orderMapper.findById(orderId);
// //2.利用RestTemplate发起http请求
// String url = "http://userservice/user/" + order.getUserId();
// User user = restTemplate.getForObject(url, User.class);
// //3.将获取的user对象添加到order里去
// order.setUser(user);
// // 4.返回
// return order;
// }
}
自定义Feign的配置
Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
(一般情况下我们需要配置的就是日志级别)
| 类型 | 作用 | 说明 |
| ——————————— | ———————— | ——————————————————————————— |
| feign.Logger.Level | 修改日志级别 | 包含四种不同的级别:NONE、BASIC、HEADERS、FULL |
| feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 |
| feign.codec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 |
| feign. Contract | 支持的注解格式 | 默认是SpringMVC的注解 |
| feign. Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 |
配置Feign日志的两种方式
1.方式一是配置文件,feign.client.config.xxx.loggerLevel
①如果xxx是default则代表全局
②如果xxx是服务名称,例如userservice则代表某服务
2.方式二是java代码配置Logger.Level这个Bean
①如果在@EnableFeignClients注解声明则代表全局
②如果在@FeignClient注解中声明则代表某服务
方式一
1
2
3
4
5
6
7
8
9
10
11
12#全局生效
feign:
client: 、
config:
default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别
#局部生效
feign:
client:
config:
userservice: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别方式二
1
2
3
4
5
6
7#先声明一个bean
public class FeignClientConfiguration {
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC;
}
}1
2#全局配置(具体位置参考使用步骤)
1
2#局部配置(具体位置参考使用步骤)