FeignClient原理解读

本文深入解析FeignClient如何从Eureka注册中心获取服务地址并进行负载均衡调用。首先介绍了Ribbon在Eureka中的启用及配置,接着详细阐述了Ribbon的初始化、服务器信息获取、负载均衡策略以及调度过程。通过动态代理,LoadBalancerFeignClient实现调用,最终由BaseLoadBalancer选择服务器并执行请求。文中还涉及了DiscoveryClient的线程任务和更新机制,以及不同组件在负载均衡中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

这一章节主要介绍feignClient的地址如何来,如何从feign Server注册中心寻址和调用。

源码解读

在解读源码之前,建议大家要了解一下RPC调度原理以及什么是负载均衡和微服务设计,我这里借用thinkinjava的一个图解析howtodoinjava,若图片有版权问题,请联系我删除!
图片来源若有问题,请链接我删除
feign寻址主要是spring boot的自动配置类org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,这里简介总体流程图

feign负载ribbon源码解读

在这里插入图片描述

eurake的ribbon原理是:

1、初始化工程,决定是否走负载均衡

ribbon: 
	eureka:
		enabled: false
[servicename]:
	ribbon: 
		listOfServers: [ip]:[port]

2、定时任务线程下拉服务器信息DiscoveryClient
3、判断是否需要更新本地共享线程变量DiscoveryClient#remoteRegionVsApps&DiscoveryClient#fetchRegistry

调度原理:

1、动态代理LoadBalancerFeignClient
2、选择调用地址BaseLoadBalancer#chooseServer
3、负载均衡策略决定PredicateBasedRule#choose
4、多线程远程调度
AbstractLoadBalancerAwareClient#executeWithLoadBalancer
5、动态代理调用返回FeignInvocationHandler#invoke

笔记

org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration配置信息
# 不能用yaml格式设置
ribbon.eureka.enabled: false 配置选项 ServerList<T>接口服务器列表实现方式

配置类入口:com.netflix.client.config.DefaultClientConfigImpl#loadProperties
接着加载com.netflix.client.config.DefaultClientConfigImpl#loadDefaultValues初始化给定的默认值


com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList 动态服务器地址
org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList#getUpdatedListOfServers获取地址
com.netflix.loadbalancer.DynamicServerListLoadBalancer#initWithNiwsConfig 负载均衡获取
com.netflix.loadbalancer.DynamicServerListLoadBalancer#updateListOfServers 更新
com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList#eurekaClientProvider
com.netflix.discovery.DiscoveryClient#initScheduledTasks 初始化线程
com.netflix.discovery.DiscoveryClient.CacheRefreshThread 更新线程
com.netflix.discovery.DiscoveryClient#fetchRegistry是否全局更新
com.netflix.discovery.DiscoveryClient#remoteRegionVsApps&DiscoveryClient#fetchRegistry
com.netflix.discovery.DiscoveryClient#getAndUpdateDelta 捕获更新
com.netflix.discovery.DiscoveryClient#getAndStoreFullRegistry 启动一次性注册全部
com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient#execute 获取请求体clientFactory.newClient(currentEndpoint)
com.netflix.discovery.shared.transport.jersey.JerseyApplicationClient 获取请求体
com.sun.jersey.client.apache4.ApacheHttpClient4 原始请求类


com.netflix.loadbalancer.ConfigurationBasedServerList#getUpdatedListOfServers  本地指定服务器地址,由org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#ribbonServerList配置
com.netflix.loadbalancer.ConfigurationBasedServerList#getUpdatedListOfServers 获取地址
com.netflix.loadbalancer.ConfigurationBasedServerList#clientConfig
com.netflix.client.config.DefaultClientConfigImpl#get(com.netflix.client.config.IClientConfigKey<T>)


LoadBalancerFeignClient

feign.ReflectiveFeign.FeignInvocationHandler#invoke
com.netflix.client.AbstractLoadBalancerAwareClient#executeWithLoadBalancer(S, com.netflix.client.config.IClientConfig)
com.netflix.loadbalancer.BaseLoadBalancer#chooseServer  选择负载均衡 rule.choose(key)
com.netflix.loadbalancer.PredicateBasedRule#choose

参考文献

HowToDoInJava

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值