认识学习
OpenFeign是一个基于Spring Cloud的声明式服务调用框架,它简化了微服务架构中的服务间通信。它提供了一组注解和默认集成的功能,使得服务调用变得更加简单和便捷。
为什么要使用OpenFeign呢???
OpenFeign的主要特点和功能包括:
-
声明式API定义:通过使用@FeignClient注解,可以轻松定义和标记一个RESTful服务的接口,并指定要调用的服务名称。这样,就可以像调用本地方法一样调用远程服务,无需手动编写服务间的HTTP请求代码。
-
与Spring Cloud集成:OpenFeign与Spring Cloud的其他组件紧密集成,特别是服务注册与发现组件(如Eureka、Nacos),可以自动利用服务名进行负载均衡。
-
内置支持负载均衡:OpenFeign默认集成了Ribbon负载均衡器,可以根据负载均衡策略自动选择可用的服务实例进行调用。
-
熔断器支持:OpenFeign内置集成了Hystrix熔断器,可以通过简单的配置实现服务调用的容错和熔断处理,提高系统的可靠性和稳定性。
-
日志记录:OpenFeign提供了日志记录的功能,可以方便地查看请求和响应的详细信息,帮助排查问题。
使用OpenFeign可以避免手动编写大量的服务调用代码,简化了服务间通信的开发工作。它在提高开发效率、减少重复代码、支持负载均衡和熔断等方面都具有很大的优势,是构建微服务架构中不可或缺的一部分。
使用
- 引入依赖
<!--feign客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在服务启动类上添加@EnableFeignClients注解开启OpenFeign的功能
- 编写FeignClient接口
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
- 使用FeignClient代替我们的RestTemplate
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
// 注入依赖Feign接口依赖
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2. 用feign远程调用
User user = userClient.findById(order.getUserId());
// 3. 封装到order
order.setUser(user);
// 4.返回
return order;
}
}
这样便完成了OpenClient的使用
日志配置
默认日志级别为NONE
实现方式有两种:
- 通过配置文件进行配置(application.yml)
feign:
client:
config:
# default为全局配置,服务名称为局部配置
default:
loggerLevel: FULL
- 通过java代码实现
- 创建配置类
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel() {
return Logger.Level.BASIC;
}
}
- 选择配置全局还是特定服务
// 全局是在服务启动类上
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
// 特定服务是在feign客户端类上
@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
Feign优化
- 日志级别降低尽量为BASIC
- 使用HttpClient或OKHttp代替URLConnection
①引入依赖
<!-- httpclient--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
②配置文件中开启功能
feign: httpclient: enabled: true max-connections: 200 max-connections-per-route: 50
最佳实践
- 让我们的服务提供者的controller和服务消费者的feignClient实现同一接口
- 将client、POJO、Feign的默认配置定义到一个项目中供所有消费者使用。 推荐
新建module将client、pojo、feign的相关配置和类放入该模块,之后在原模块中添加依赖
<!-- 引入feign的统一api--> <dependency> <groupId>cn.itcast.demo</groupId> <artifactId>feign-api</artifactId> <version>1.0</version> </dependency>
因为服务启动类的扫描包是当前启动类所在包及其子包,无法实现client的注入
解决方式
// 1. 指定FeignClient所在包(批量获取所有)
@EnableFeignClients(basePackages="feign模块的client所在包")
// 2. 指定FeignClient字节码
@EnableFeignClients(clients = UserClient.class)