赞
踩
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>
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
@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
实现方式有两种:
feign:
client:
config:
# default为全局配置,服务名称为局部配置
default:
loggerLevel: FULL
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel() {
return Logger.Level.BASIC;
}
}
// 全局是在服务启动类上
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
// 特定服务是在feign客户端类上
@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
①引入依赖
<!-- httpclient--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
- 1
- 2
- 3
- 4
- 5
②配置文件中开启功能
feign: httpclient: enabled: true max-connections: 200 max-connections-per-route: 50
- 1
- 2
- 3
- 4
- 5
新建module将client、pojo、feign的相关配置和类放入该模块,之后在原模块中添加依赖
<!-- 引入feign的统一api--> <dependency> <groupId>cn.itcast.demo</groupId> <artifactId>feign-api</artifactId> <version>1.0</version> </dependency>
- 1
- 2
- 3
- 4
- 5
- 6
因为服务启动类的扫描包是当前启动类所在包及其子包,无法实现client的注入
解决方式
// 1. 指定FeignClient所在包(批量获取所有)
@EnableFeignClients(basePackages="feign模块的client所在包")
// 2. 指定FeignClient字节码
@EnableFeignClients(clients = UserClient.class)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。