前言
OpenFeign 是 Spring Cloud 官方推荐的声明式 HTTP 客户端,让微服务间调用像调用本地方法一样简单。本文带你全面掌握 OpenFeign 的核心用法。
一、引入依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- spring-cloud-starter-openfeign</artifactId>
- </dependency>
- // 启动类开启 Feign
- @SpringBootApplication
- @EnableFeignClients
- public class OrderApplication {
- public static void main(String[] args) {
- SpringApplication.run(OrderApplication.class, args);
- }
- }
复制代码 二、声明 Feign 客户端
- // 调用 user-service 的 Feign 接口
- @FeignClient(name = "user-service", path = "/api/users")
- public interface UserFeignClient {
- @GetMapping("/{id}")
- User getUserById(@PathVariable("id") Long id);
- @PostMapping
- User createUser(@RequestBody User user);
- @GetMapping
- List<User> listUsers(@RequestParam("page") int page,
- @RequestParam("size") int size);
- @DeleteMapping("/{id}")
- void deleteUser(@PathVariable("id") Long id);
- }
- // 在 Service 中注入使用
- @Service
- public class OrderService {
- @Autowired
- private UserFeignClient userFeignClient;
- public Order createOrder(Long userId, Long productId) {
- // 像调用本地方法一样调用远程服务
- User user = userFeignClient.getUserById(userId);
- // 业务逻辑...
- }
- }
复制代码 三、配置超时和重试
- # application.yml
- feign:
- client:
- config:
- default:
- connectTimeout: 5000
- readTimeout: 10000
- loggerLevel: FULL
- user-service:
- connectTimeout: 3000
- readTimeout: 5000
- # 全局超时配置
- ribbon:
- ConnectTimeout: 3000
- ReadTimeout: 5000
- MaxAutoRetries: 1
- MaxAutoRetriesNextServer: 2
复制代码 四、Feign 日志配置
- @Configuration
- public class FeignConfig {
- @Bean
- public Logger.Level feignLoggerLevel() {
- return Logger.Level.FULL; // 记录完整请求响应
- }
- }
- // 在 FeignClient 中使用自定义配置
- @FeignClient(name = "user-service",
- configuration = FeignConfig.class)
- public interface UserFeignClient {
- // ...
- }
- # 日志级别说明
- # NONE: 无日志(默认)
- # BASIC: 仅记录请求方法、URL、响应状态码、执行时间
- # HEADERS: 记录 BASIC + 请求/响应头
- # FULL: 记录 HEADERS + 请求/响应体
复制代码 五、请求拦截器(传递 Token)
- @Component
- public class FeignAuthInterceptor implements RequestInterceptor {
- @Override
- public void apply(RequestTemplate template) {
- // 从请求上下文获取 Token
- ServletRequestAttributes attributes = (ServletRequestAttributes)
- RequestContextHolder.getRequestAttributes();
- if (attributes != null) {
- HttpServletRequest request = attributes.getRequest();
- String token = request.getHeader("Authorization");
- if (token != null) {
- // 将 Token 传递给下游服务
- template.header("Authorization", token);
- }
- }
- }
- }
- // 配置拦截器
- @Configuration
- public class FeignConfig {
- @Bean
- public RequestInterceptor feignAuthInterceptor() {
- return new FeignAuthInterceptor();
- }
- }
复制代码 六、Fallback 降级
- @FeignClient(name = "user-service",
- fallbackFactory = UserFeignFallbackFactory.class)
- public interface UserFeignClient {
- @GetMapping("/{id}")
- User getUserById(@PathVariable("id") Long id);
- }
- // 降级工厂:可以获取到异常信息
- @Component
- public class UserFeignFallbackFactory
- implements FallbackFactory<UserFeignClient> {
- @Override
- public UserFeignClient create(Throwable cause) {
- return new UserFeignClient() {
- @Override
- public User getUserById(Long id) {
- log.error("调用 user-service 失败", cause);
- return new User(id, "默认用户", "降级数据");
- }
- };
- }
- }
- # 开启降级
- feign.circuitbreaker.enabled: true
复制代码 总结
OpenFeign 让微服务间调用变得优雅简洁。核心要点:声明式接口定义、配置超时重试、拦截器传递上下文、Fallback 实现降级保护。配合 Nacos 实现服务发现,配合 Sentinel 实现限流熔断,构建完整的微服务通信方案。
觉得有帮助请点赞收藏!有问题欢迎评论区交流
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |