Spring Cloud学习(五)【Feign 远程调用】

文章目录


RestTemplate方式调用存在的问题

先来看我们以前利用RestTemplate发起远程调用的代码:

存在下面的问题:

  • 代码可读性差,编程体验不统一
  • 参数复杂URL难以维护

Feign的介绍

Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign

其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

定义和使用Feign客户端

使用Feign的步骤如下:

  1. 引入依赖:
xml 复制代码
<!--        feign客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 在order-service的启动类添加注解开启Feign的功能:
  1. 编写Feign客户端:
java 复制代码
@FeignClient("userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User
  1. 用Feign客户端代替RestTemplate


注意:Feign 集成了 Ribbon 实现了负载均衡

Feign 的自定义配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

一般我们需要配置的就是日志级别。

配置Feign日志有两种方式:

方式一:配置文件方式

  1. 全局生效:
  1. 局部生效:

配置Feign日志的方式二:java代码方式,需要先声明一个Bean:

  1. 而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:
  1. 如果是局部配置,则把它放到@FeignClient这个注解中:


Feign 性能优化

Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此优化Feign的性能主要包括:

  1. 使用连接池代替默认的URLConnection
  2. 日志级别,最好用basic或none

Feign添加HttpClient的支持:

引入依赖:

配置连接池:

总结:

Feign 的最佳实践

方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。

  • 服务紧耦合
  • 父接口参数列表中的映射不会被继承

方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用


抽取FeignClient

实现最佳实践方式二的步骤如下:

  1. 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
  2. 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
  3. 在order-service中引入feign-api的依赖
  4. 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
  5. 重启测试

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:

方式一:指定FeignClient所在包


方式二:指定FeignClient字节码

相关推荐
漫步云端的码农1 小时前
Three.js场景渲染优化
前端·性能优化·three.js
A仔不会笑2 小时前
MySQL面试篇——性能优化
java·数据库·mysql·面试·性能优化
冲鸭ONE5 小时前
for循环优化方式有哪些?
后端·性能优化
littleschemer5 小时前
聊天服务器分布式改造
分布式·spring cloud·qq·聊天室
蓝天下小溪旁戴着耳机去放羊21 小时前
详解数据传输——零拷贝、direct IO
性能优化·操作系统
砖厂小工1 天前
Compose Performance Review
性能优化·android jetpack
Python数据分析与机器学习1 天前
《基于锂离子电池放电时间常数的自动化电量评估系统设计》k开题报告
运维·性能优化·自动化·软件工程·软件构建·个人开发
weixin_748877001 天前
【2025年后端开发终极指南:云原生、AI融合与性能优化实战】
人工智能·云原生·性能优化
NoneCoder2 天前
工程化与框架系列(22)--前端性能优化(中)
前端·性能优化·状态模式
大模型铲屎官2 天前
Python 性能优化:从入门到精通的实用指南
开发语言·人工智能·pytorch·python·性能优化·llm·编程