Feign请求处理流程

前面已经学习完了@Feign代理类的生成,接下来完成基于Feign的请求流程的处理,一个请求过来怎么去获取请求url

目录

  • 基于Fein进行请求的整体流程

1.Feign的请求处理流程

4.Feign请求处理流程 - 图1

基于上篇的内容我们已经知道我们生成的代理类最终会有一个请求接口对应的SynchronousMethodHandler,而该类包含了我们对应发送相关的内容。

  • 1.基于接口找到对应的SynchronousMethodHandler
  • 2.SynchronousMethodHandler找到LoadBalancerFeignClient
  • 3.LoadBalancerFeignClient是和Ribbon进行整合的
  • 4.从Ribbon和EurekaClient整合的代码中找到对应的server并进行url的替换

2.源码讲解

Map dispatch:

2.1.SynchronousMethodHandler

上一篇讲解,我们每个请求方法对应了一个SynchronousMethodHandler,所以请求接口的时候,就会通过Method找到对应的SynchronousMethodHandler执行invoke方法

  1. public Object invoke(Object[] argv) throws Throwable {
  2. RequestTemplate template = buildTemplateFromArgs.create(argv);
  3. Options options = findOptions(argv);
  4. Retryer retryer = this.retryer.clone();
  5. while (true) {
  6. try {
  7. return executeAndDecode(template, options);
  8. } catch (RetryableException e) {
  9. }
  10. }
  11. }
  • 1.构造RestTemplate:包含GET /order/1?status=1 HTTP/1.1请求url等相关信息
  • 2.执行executeAndDecode,这个才是真正处理请求的逻辑

2.2.真正的请求处理流程

  Object executeAndDecode(RequestTemplate template, Options options) throws Throwable {
    Request request = targetRequest(template);

    if (logLevel != Logger.Level.NONE) {
      logger.logRequest(metadata.configKey(), logLevel, request);
    }

    Response response;
    long start = System.nanoTime();
    try {

      response = client.execute(request, options);
      // ensure the request is set. TODO: remove in Feign 12
      response = response.toBuilder()
          .request(request)
          .requestTemplate(template)
          .build();
    } catch (IOException e) {

    }
    //省略decode相关信息
  }
  • 构造request:GET http://SERVICE-ORDER/order/1?status=1 HTTP/1.1
  • LoadBalancerFeignClient:执行excute方法,进行调用
  • LoadBalancerCommand完成server的选择,以及请求重试等逻辑的处理

4.Feign请求处理流程 - 图2

关于