微服务-Fegin

在之前我们两服务之间调用的时候用的是restTemplate,但是这个方式调用存在很多的问题

java 复制代码
  String url = "http://userservice/user/" + order.getUserId();
  • 代码可读性差,编码体验不统一
  • 参数复杂的url难以维护

所以我们大力推出我们今天的主角--Fegin

Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决上面的问题

定义和使用Fegin客户端

1.引入依赖

ruby 复制代码
 <!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.在A服务的启动类中添加注解开启Figin的功能

java 复制代码
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients//Feign的客户端
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

3.编写Feign客户端:

java 复制代码
@FeignClient(value = "userservice")
public interface UserClient {

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

/*
基于SpringMVC的注解来声明远程调用的信息
服务名称:userservice
请求方式:GET
请求路径:/user/{id}
请求参数:Long id
返回值类型:User
*/

4.使用Fegin客户端代替RestTemplate

java 复制代码
    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

Fegin的使用步骤:

  • 引入依赖
  • 添加@EnableFeginClient注解
  • 编写FeginClient接口
  • 使用FeginClient中定义的方法代替RestTemplate

自定义配置来覆盖默认配置,可修改为:

|----------------------|----------|-----------------------------------|
| 类型 | 作用 | 说明 |
| fegin.Logger.Decoder | 修改日志级别 | 包含四种不同的级别:NONE、BASIC、HEADERS、FULL |
| feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 |
| feign.codec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 |
| feign. Contract | 支持的注解格式 | 默认是SpringMVC的注解 |
| feign. Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 |

自定义Fegin的配置

一般配置Fegin日志一般有两种方式:

方法一:

1.全局生效:

ruby 复制代码
feign:
  client:
    config: 
      default: #这里default就是全局变量,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #日志级别

2.局部生效

ruby 复制代码
feign:
  client:
    config: 
      userservice: #这里userseervice就是局部变量
        loggerLevel: FULL #日志级别

方法二(java代码方式):

java 复制代码
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}

1.如果是全局配置,则将它放到@EnableFeginClients这个注解中:

java 复制代码
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeign

2.如果是局部配置,则把它放到@FeginClient这个注解中:

java 复制代码
@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)

Fegin性能优化

Fegin的底层的客户端实现:

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

优化Fegin的性能主要包括:

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

Fegin添加FttpClient的支持:

引入依赖:

XML 复制代码
 <!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

配置连接池:

ruby 复制代码
feign:
  client:
    config:
      default: #这里default就是全局变量,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #日志级别
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数

Fegin的最佳实践

java 复制代码
@EnableFeignClients(clients ="com.ffyc.fegin.clients")

如果按照第二种方法将Fegin客户端独立出去,在启动SpringBootAppliaction的扫描包范围时,这些Fegin客户端无法使用,所以我们需要去解决这个问题

方式一(指定FeginClient所在包):

java 复制代码
@EnableFeignClients(clients ="ffyc.com.fegin.clients")

方式二(指定FeginClient字节码):

java 复制代码
@EnableFeignClients(clients ={ UserClient.class})
相关推荐
代码山河3 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
天远API3 小时前
零信任架构实战:基于天远租凭分期报告构建自动化智慧租房免押分期履约评估网关
运维·人工智能·架构·自动化
视频技术分享4 小时前
远程会诊产品设计复盘:音视频架构拆解与四大避坑
架构·音视频
Flynn Liang5 小时前
Spring AI 上生产:限流熔断、密钥与成本治理、私有化/混合部署、降级与 Prompt 灰度架构全解
人工智能·spring·架构·高可用·springai·成本治理·生产架构
夜雪一千5 小时前
Qwen3.8-Flash-Next 详细介绍:Qwen4架构先行版,125B总参、6B激活的稀疏MoE多模态模型
架构
分布式存储与RustFS5 小时前
JuiceFS 接 RustFS 当数据后端:把对象存储挂成本地文件系统
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
FPGA小迷弟6 小时前
FPGA 千兆以太网帧格式全解:从 IEEE 802.3 帧结构到 Verilog 收发实现
人工智能·5g·fpga开发·架构·硬件架构
Decay__7 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
孔令飞8 小时前
很多人想学AI Infra,今天推荐一个 AI Agent / AI Infra 学习路线
云原生·go·ai编程
行走的陀螺仪8 小时前
Super-Agent 架构演进(下):解耦设计与 NestJS 工程落地
架构·大模型·agent