一、Feign介绍
- Feign是一个声明式web服务客户机。
- 它使编写web服务客户机更容易。
- 要使用Feign创建一个接口并对其进行注释。
- 它具有可插入注释支持,包括Feign注释和JAX-RS注释。
- Feign还支持可插式编码器和解码器。
- Spring Cloud增加了对Spring MVC注释的支持,并支持使用Spring Web中默认使用的HttpMessageConverters。
- Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker以及Spring Cloud LoadBalancer,在使用Feign时提供一个负载平衡的http客户端。
- 内部集成了ribbon负载均衡
二、Feign常用注解
使用 Fegin 进行远程服务调用时,常用注解如下表。
注解 | 说明 |
---|---|
@FeignClient | 该注解用于通知 OpenFeign 组件对 @RequestMapping 注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡和服务调用。 |
@EnableFeignClients | 该注解用于开启 OpenFeign 功能,当 Spring Cloud 应用启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口,生成代理并注册到 Spring 容器中。 |
@RequestMapping | Spring MVC 注解,在 Spring MVC 中使用该注解映射请求,通过它来指定控制器(Controller)可以处理哪些 URL 请求,相当于 Servlet 中 web.xml 的配置。 |
@GetMapping | Spring MVC 注解,用来映射 GET 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。 |
@PostMapping | Spring MVC 注解,用来映射 POST 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.POST) 。 |
三、快速使用Feign
1、引入Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在启动类上添加注解 @EnableFeignClients
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
3、定义和使用Feign客户端
- 在@FeignClient注释中,String值(上面的“stores”)是一个任意的客户端名称,用于创建Spring Cloud LoadBalancer客户端。
@FeignClient("userService")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
4、使用FeignClient中定义的方法替代RestTemplate
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
@Autowired
private UserClient userClient;
// public Order queryOrderById(Long orderId) {
// // 1.查询订单
// Order order = orderMapper.findById(orderId); // 2.利用RestTemplate发起http请求,查询用户
// // 2.1 url路径
// String url="http://userservice/user/"+order.getUserId();
// // 2.2 发送http请求,实现远程调用
// User user = restTemplate.getForObject(url, User.class);
// // 3.封装user到Order
// order.setUser(user );
// // 4.返回
// return order;
// }
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId); // 2.利用RestTemplate发起http请求,查询用户
// 2.用Feign远程调用
User user = userClient.findById(order.getUserId());
// 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日志有两种方式:
方式一:配置文件方式
①全局生效
feign:
client:
config:
default: # 这里default就是全局配置,如果写服务名称就是针对某个微服务的配置
loggerLevel: BASIC # 日志级别
②局部生效
feign:
client:
config:
userservice: # 这里用default就是全局配置,如果写服务名称就是针对某个微服务的配置
loggerLevel: BASIC # 日志级别
方式二:java代码方式,需要先声明一个Bean
public class DefaultFeignConfig {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
①如果是全局配置,则把它放在@EnableFeignClients这个注解中
@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)
②如果是局部配置,则把它放到@FeignClient这个注解中
@FeignClient(value = "userService",configuration = DefaultFeignConfig.class)
五、Feign性能优化
Feign底层的客户端实现:
- URLConnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
因此优化Feign的性能主要包括:
①使用连接池代替默认的 URLConnection
②日志级别,最好用BASIC或者NONE