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

openfeign、nacos获取接口提供方真实IP

源码分析

client 是 LoadBalancerFeignClient
org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient#execute

public Response execute(Request request, Request.Options options) throws IOException {try {URI asUri = URI.create(request.url());String clientName = asUri.getHost();URI uriWithoutHost = cleanUrl(request.url(), clientName);// 封装 ribbon 请求组件FeignLoadBalancer.RibbonRequest ribbonRequest = new FeignLoadBalancer.RibbonRequest(this.delegate, request, uriWithoutHost);IClientConfig requestConfig = getClientConfig(options, clientName);// 这行是关键return // 获取 FeignLoadBalancerlbClient(clientName)// 负载之后请求真实的url// com.netflix.client.AbstractLoadBalancerAwareClient#executeWithLoadBalancer(....).executeWithLoadBalancer(ribbonRequest,requestConfig).toResponse();}catch (ClientException e) {....throw new RuntimeException(e);}}

com.netflix.client.AbstractLoadBalancerAwareClient#executeWithLoadBalancer

public T executeWithLoadBalancer(final S request, final IClientConfig requestConfig) throws ClientException {LoadBalancerCommand<T> command = buildLoadBalancerCommand(request, requestConfig);try {// 在com.netflix.loadbalancer.reactive.LoadBalancerCommand#submit 中会根据 负载均衡算法之后获取到真实的ip地址return command.submit(new ServerOperation<T>() {@Override// 传入的server 就是真实的ippublic Observable<T> call(Server server) {URI finalUri = reconstructURIWithServer(server, request.getUri());// 路径替换把原本 http://client-name/xxxx 地址改为 http://127.0.0.1:9090/xxxxS requestForServer = (S) request.replaceUri(finalUri);try {// 请求父类中的 execute 方法,也就是 上面 lbClient(clientName) 返回的 FeignLoadBalancerreturn Observable.just(AbstractLoadBalancerAwareClient.this.execute(requestForServer, requestConfig));} catch (Exception e) {return Observable.error(e);}}}).toBlocking().single();} catch (Exception e) {Throwable t = e.getCause();if (t instanceof ClientException) {throw (ClientException) t;} else {throw new ClientException(e);}}}

org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer#execute

@Overridepublic RibbonResponse execute(RibbonRequest request, IClientConfig configOverride)throws IOException {Request.Options options;.....// 这里的 request 就是 `org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient#execute` // 封装的FeignLoadBalancer.RibbonRequest// request.client() 返回就是 feign.Client.DefaultResponse response = request.client().execute(request.toRequest(), options);return new RibbonResponse(request.getUri(), response);}

feign.Client.Default#execute

 @Overridepublic Response execute(Request request, Options options) throws IOException {HttpURLConnection connection = convertAndSend(request, options);return convertResponse(connection).toBuilder().request(request).build();}

这里的request 中 url 就是真实的url资源路径了
现在屡屡逻辑

org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient和feign.Client.Default
都实现了 feign.Client 接口,但是 LoadBalancerFeignClient 实际上调用的还是 feign.Client.Default,无非做了自己处理(负载),有些类似于静态代理

http://www.lryc.cn/news/234452.html

相关文章:

  • Linux系统编程学习 NO.9——git、gdb
  • 【联邦学习+区块链】TORR: A Lightweight Blockchain for Decentralized Federated Learning
  • 《网络协议》08. 概念补充
  • 利用NVIDIA DALI读取视频帧
  • TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
  • 【算法每日一练]-图论(保姆级教程 篇5(LCA,最短路,分层图)) #LCA #最短路计数 #社交网络 #飞行路线 # 第二短路
  • 德迅云安全为您介绍关于抗D盾的一些事
  • leetcode算法之位运算
  • java常用的几个图片处理工具对Tiff文件的支持
  • SQL必知会(二)-SQL查询篇(11)-联结表
  • 多模态大一统:开启全模态LLM和通用AI时代的大门
  • Alibaba Nacos注册中心实战
  • 京东数据采集与挖掘(京东大数据):2023年10月京东冰箱品牌销售排行榜
  • 某事业单位转型二类后绩效项目成功案例纪实
  • MySQL 和 SQL Server之间的数据迁移方法
  • 单元测试实战(五)普通类的测试
  • js 迭代器iterator 和 生成器Generator 10
  • 100套Axure RP大数据可视化大屏模板及通用组件库
  • 【OpenGauss源码学习 —— 执行算子(Append算子)】
  • Java(一)(引用类型的参数在传递,方法重载,面向对象编程基础)
  • Vue第1天:特性概览
  • C++语法基础知识面经汇总
  • AM@幂级数性质@幂级数和函数求解
  • PHP低版本安全问题
  • 结构体——C语言初阶
  • 基于django电影推荐系统
  • 【问题处理】WPS提示不能启动此对象的源应用程序如何处理?
  • UE 程序化网格 计算横截面
  • 【Spring】IoC容器的一些总结与补充
  • Java GUI实现五子棋游戏