当前位置: 首页 > news >正文

网站快照海陵区建设局网站

网站快照,海陵区建设局网站,网站建设 售后服务,百度财报q3文章目录 前言正文一、书接上回#xff0c;从代理对象入手二、ReflectiveFeign.FeignInvocationHandler#invoke()三、SynchronousMethodHandler#invoke(...) 的实现原理3.1 invoke(...)源码3.2 executeAndDecode(...) 执行请求并解码 四、如何更换client 的实现 附录附1#… 文章目录 前言正文一、书接上回从代理对象入手二、ReflectiveFeign.FeignInvocationHandler#invoke()三、SynchronousMethodHandler#invoke(...) 的实现原理3.1 invoke(...)源码3.2 executeAndDecode(...) 执行请求并解码 四、如何更换client 的实现 附录附1本系列文章链接附2比较HttpURLConnection、Apache HttpClient、OkHttp 前言 本篇是SpringCloud原理系列的 OpenFeign 模块的第四篇。 在我们启动完应用后Spring容器也初始化好了很多我们用到的类。什么你不知道烦请先看看第三篇 那么我们下一步要做的就是发出rest请求然后调用FeignClient标注的接口方法。这篇文章我们就来看看它的原理。 本文关键词RequestTemplate、SynchronousMethodHandler 使用java 17spring cloud 4.0.4springboot 3.1.4 使用项目是本系列第一篇中的项目 正文 一、书接上回从代理对象入手 第三篇文章时我们看到了SpringCloud将 OpenFeign的接口映射为一个代理对象。 打个比方使用如下接口 FeignClient(name helloFeignClient, url http://localhost:10080) public interface HelloFeignClient {PostMapping(/hello/post)HelloResponse postHello(RequestBody HelloRequest helloRequest); }最终生成的代理对象是对 HelloFeignClient 接口的代理并且绑定了handler。handler的类型是ReflectiveFeign.FeignInvocationHandler 换句话说就是当我们调用接口HelloFeignClient 中的方法时会触发调用ReflectiveFeign.FeignInvocationHandler 的invoke(...)方法。 二、ReflectiveFeign.FeignInvocationHandler#invoke() 查看源码可以知道这里invoke方法实际是先从 dispatch中找到对应方法的真正的处理器然后进行调用。 从第三篇文章我们能知道 dispatch 是对 method 的映射。 比如接口HelloFeignClient 会被映射为dispatch一个方法对应为一对key、value值。dispatch的类型是 private final MapMethod, InvocationHandlerFactory.MethodHandler dispatch;也就是说Method 只是作为一个桥梁连接起了HelloFeignClient 内的方法和真正执行的handler实例。这里的实例真正的实现是SynchronousMethodHandler。也就是说当我们调用接口方法时会执行SynchronousMethodHandler#invoke(...)。 三、SynchronousMethodHandler#invoke(…) 的实现原理 3.1 invoke(…)源码 public Object invoke(Object[] argv) throws Throwable {// 创建请求模板包装请求头、请求体url等字段参数RequestTemplate template this.buildTemplateFromArgs.create(argv);// 获取连接超时等参数Request.Options options this.findOptions(argv);// 重试Retryer retryer this.retryer.clone();while(true) {try {// 执行请求并解码return this.executeAndDecode(template, options);} catch (RetryableException var9) {RetryableException e var9;try {retryer.continueOrPropagate(e);} catch (RetryableException var8) {Throwable cause var8.getCause();if (this.propagationPolicy ExceptionPropagationPolicy.UNWRAP cause ! null) {throw cause;}throw var8;}if (this.logLevel ! Level.NONE) {this.logger.logRetry(this.metadata.configKey(), this.logLevel);}}}}3.2 executeAndDecode(…) 执行请求并解码 Object executeAndDecode(RequestTemplate template, Request.Options options) throws Throwable {// 通过模版获取请求体执行所有请求拦截器Request request this.targetRequest(template);if (this.logLevel ! Level.NONE) {this.logger.logRequest(this.metadata.configKey(), this.logLevel, request);}long start System.nanoTime();Response response;try {// 使用客户端执行请求response this.client.execute(request, options);// 使用响应建造器构造一个响应体包含请求和请求模板response response.toBuilder().request(request).requestTemplate(template).build();} catch (IOException var9) {if (this.logLevel ! Level.NONE) {this.logger.logIOException(this.metadata.configKey(), this.logLevel, var9, this.elapsedTime(start));}throw FeignException.errorExecuting(request, var9);}long elapsedTime TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);// 处理响应结果记录日志响应解码return this.responseHandler.handleResponse(this.metadata.configKey(), response, this.metadata.returnType(), elapsedTime);}通过分析发现是先创建了RequestTemplate 实例然后调用了client实例进行远程调用。而client的实现有多个我这边看到内部实现了一个默认的 public static class Default implements Client {public Response execute(Request request, Request.Options options) throws IOException {HttpURLConnection connection this.convertAndSend(request, options);return this.convertResponse(connection, request);} }也就是说到了这一步就涉及到远程连接了。 这里用的是比较原始的HttpURLConnection。每次都创建新的连接去请求然后断开连接。这样很多时间也就浪费在建立连接等操作上了。而且调用量一旦变大很容易出错。 问题来了有没有什么办法能优化下呢 四、如何更换client 的实现 上文提到 HttpURLConnection 是默认的连接方式。那麽我们有什么优化方案吗 可替代方案一般有两种一种是带有连接池的Apache HttpClient ,另一种是协议上占有优势的 OkHttp。 至于它们的更详细的优缺点以及不同之处请查看本文的附2。 另外我的下一篇文打算单独将这块写一下 SpringCloud实用-OpenFeign整合okHttp 戳附录中的【本系列文章链接】查看文章。 附录 附1本系列文章链接 SpringCloud系列文章目录总纲篇 附2比较HttpURLConnection、Apache HttpClient、OkHttp 参考七大主流的HttpClient程序比较 Client优点缺点HttpURLConnectionjdk自带、原始、简单缺乏连接池管理、域名机械控制等特性支持性能效率较低一般不建议使用Apache HttpClient (已经停止开发)Apache HttpComponents HttpClient1. 支持连接池、多线程 2. 易用灵活安卓社区不再使用它替换为了okHttp需要自己做一层封装java.net.http.HttpClientjava11正式启用替代原先的HttpURLConnection如果使用的版本是java11以下的用不了它okHttp性能方面与HttpClient基本一样链接复用Response 缓存和 Cookie默认 GZIP请求失败自动重连DNS 扩展Http2/SPDY/WebSocket 协议支持默认情况下OKHttp会自动处理常见的网络问题像二次连接、SSL的握手问题。从Android4.4开始HttpURLConnection的底层实现采用的是okHttp. 一般情况下如果使用了SpringCloud基本都会选择 OpenFeignokHttp的组合。
http://www.tj-hxxt.cn/news/138620.html

相关文章:

  • 徐州开发区中学网站西安 美院 网站建设
  • 哪些网站可以免费备案域名购买腾讯云
  • 北京网站设计制作教程网站开发一般有几个服务器
  • 汤姆叔叔官方网站建设wordpress+程序优化
  • 公众平台的微信网站开发关于做甜品的网站
  • domino 网站开发排名网站
  • 违法人员都是怎么建设网站的开封建设教育协会网站
  • 网站开发费属于软件费吗济南百度推广seo
  • 网站开发响应式专业培训机构
  • 低成本网站制作编辑wordpress菜单
  • 哪些网站布局设计做的比较好的网上做网站网站吗
  • 个人网站注册名称口碑好的五屏网站建设
  • 做网站充值微信必须是企业安顺市住房与城乡建设局网站
  • 苏州市吴江区建设局网站潍坊市建设工程质量安全监督站网站
  • 门户类网站有哪些丽水做企业网站的地方
  • 做设计适合关注的网站如何查网站的备案信息
  • 个体营业执照可以做网站嘛php微信公众号开发教程
  • 看网站搜什么关键词网页传奇哪个最好玩
  • 重庆在百度做个网站多少钱一个做网站的团队需要哪些
  • 设计师品牌 网站wordpress 付费会员分类
  • 做视频的网站平台类网站有哪些
  • 域名怎么解析到网站如何制作自己的微信小程序
  • 网站空间管理地址dz 做企业网站
  • 长春模板网站建设企业wordpress谷歌广告代码
  • 南通建网站的公司如何用万网建设网站
  • 温州网站建设推广服务wordpress转typecho
  • 本地网站建设开发信息大全低价建设网站
  • 上海cms网站建设展厅设计图
  • 佛山网站免费制作网站被降权的原因
  • 个人网站做淘宝客会怎样p2p电影网站开发