Feign接口使用原理

使用Feign进行服务间调用:订单到商品服务
  1. 订单服务 order-server 调用商品服务 product-server 查询

        /**
         * 方案5 : 使用 Feign 接口--负载均衡
         */
        Product product = productFeignService.get(pid);
  1. 项目启动的时候会扫描所有贴有FeignClient注解的服务

@FeignClient(name = "product-service")
public interface IProductFeignService {

    @GetMapping("/products/{pid}")
    Product get(@PathVariable Long pid);
}
  1. 我们此时拥有IP,端口,接口URL,参数,返回值

  1. 注册中心返回服务清单 例如(product-service : IP:端口)

  1. 从服务清单中获取远程接口后,就可以发起远程调用了

Feign 是一个声明式的 HTTP 客户端,其实现原理主要基于面向接口的动态代理方式,将请求调用委托到动态代理实现类,具体如下: - **实例化与动态代理对象创建**:Feign 使用 builder 模式实例化,在 `build()` 方法中,首先创建动态代理的 `MethodHandler` 工厂类 `SynchronousMethodHandler.Factory`,接着创建用于解析接口配置注解的 `ParseHandlersByName`,最后创建 Feign 实例 `ReflectiveFeign`。通过 `target()` 方法创建动态代理对象。示例代码如下: ```java // 创建动态代理对象 public <T> T target(Target<T> target) { return build().newInstance(target); } public Feign build() { // 根据 builder 创建动态代理的 methodhandler 工厂类 SynchronousMethodHandler.Factory synchronousMethodHandlerFactory = new SynchronousMethodHandler.Factory(client, retryer, requestInterceptors, logger, logLevel, decode404, closeAfterDecode, propagationPolicy); // 用于解析接口配置的注解 ParseHandlersByName handlersByName = new ParseHandlersByName(contract, options, encoder, decoder, queryMapEncoder, errorDecoder, synchronousMethodHandlerFactory); // 创建 feign 实例 return new ReflectiveFeign(handlersByName, invocationHandlerFactory, queryMapEncoder); } ``` - **请求调用处理**:使用 Feign 时,会定义对应的接口类,并在接口类上使用 HTTP 相关的注解来标识 HTTP 请求参数信息。根据调用的方法从 `Map<Method, MethodHandler>` 获取对应的 `MethodHandler`,`MethodHandler` 中的实现类 `DefaultMethodHandler` 处理默认方法(接口的默认方法)的请求,`SynchronousMethodHandler` 实现类完成其它方法的 HTTP 请求。 ```java // 示例接口类 @FeignClient(name = "user-service") public interface UserServiceFeign { // 方法定义 } ``` Feign 还可以与 Ribbon 负载均衡和 Eureka 服务发现集成,实现动态服务发现和负载均衡 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值