FeignClient原理解读

简介

这一章节主要介绍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

猜你喜欢

转载自blog.csdn.net/soft_z1302/article/details/113473222