跟我一起研究feign-2

186 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

组件介绍

01 Client

  1. 提交Http请求,实现类需要是线程安全的

  2. 对Http的抽象,实现类有 HttpClient,JDK自带的Http, OKHttpClient等

  3. 设计思想: 问题:由于存在多种框架来实现Http请求,如何对多种框架来做兼容,或者说如何对多种框架来做集成? 对Http请求链接向上抽象, 定义自己的接口,自己的接口在自己的框架内交互, 交互过程中,框架内其他类对于什么实现这个借口并不关心。 这里使用适配器模式中-对象结构型模式 02client1.png

    例如:ApacheHttpClient包集成,想要把Apache的HttpClient 转换(适配)为Feign的Client, 则需要有个适配者 ApacheHttpClient来做这个工作, ApacheHttpClient 聚合了HttpClient,实现了Client接口。

02client2.png

  1. 参数Request,是对请求的封装,包含有: method(GET/POST…),url,headers,body,charset
  2. 响应值Response,是对请求响应的封装,包含有: status(响应状态码), reason,headers,body,request;其中 包含内部类Builder,方便构建Response。
  3. 参数Options,配置信息封装,包含:connectTimeout,connectTimeoutUnit,readTimeout,readTimeoutUnit,followRedirects(是否重定向)
  4. 针对于Client的包装类,MeteredClient,包装过程查看主流程讲解

02 Retryer

重试策略

每次调用都克隆到{@link Client#execute(Request, feign.Request.Options)}。

实现可以保持状态以确定重试操作是否应该继续。

  1. Retryer类图,Retryer包含两种, Retryer.Default是进行重试默认频率为 重试次数 5,过期时间1分钟, 匿名内部类 Retryer.NEVER_RETRY
  2. continueOrPropagate(RetryableException e) 方法,如果允许重试, 直接返回,否则传播异常。
  3. Retryer clone() 克隆方法,保持重试的状态, 通知下次重试的时候为第几次重试

03 RequestInterceptor

请求拦截器,在请求发送之前,对RequestTemplate 做出修改, 例如: 修改请求头, 请求参数等

void apply(RequestTemplate template);

参数RequestTemplate:请求HTTP目标的构建器。这个类是UriTemplate的一个变体,其中,除了uri, header和Query信息也支持模板表达式。