这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 . 前言
文章目的 :
- 深入 Client 端服务发现的流程
概念补充
region:可以简单理解为地理上的分区,比如上海地区,或者广州地区,再或者北京等等,没有具体大小的限制。根据项目具体的情况,可以自行合理划分region。
zone:可以简单理解为region内的具体机房,比如说region划分为北京,然后北京有两个机房,就可以在此region之下划分出zone1,zone2两个zone。
二 . 调用的起点
2.1 初始化
Eureka Client 在初始化 EurekaClient 类的同时发起了服务发现的逻辑 , 主要调用流程为 :
Step 1 : C- EurekaClientAutoConfiguration
- PVC- RefreshableEurekaClientConfiguration 中进行 EurekaClient 的 Bean 加载
Step 2 : 调用 DiscoveryClient 构造器
Step 3 : Client 发起 FullRegistry 操作
Step 1 : Configuration 的 Bean 加载
1 | java复制代码public EurekaClient eurekaClient(ApplicationInfoManager manager, |
Step 2 : DiscoveryClient full Registry
1 | java复制代码private boolean fetchRegistry(boolean forceFullRegistryFetch) { |
Step 3 : 查询 Registry
1 | java复制代码private void getAndStoreFullRegistry() throws Throwable { |
三 . 服务的发现
从上面看到 , 通过 Client 搜索了 Registy 对象 , 后面看一下具体的查询流程
3.1 service 的获取
Step 1 : EurekaDiscoveryClient 发起请求
1 | java复制代码// EurekaDiscoveryClient 中通过如下代码获取 : |
Step 2 : 获取 Applications
1 | java复制代码// 这里是通过一个原之类缓存了所有的 Applications |
PS : Applications 数据如下
Step 3 : Applications 的缓存
上文知道了获取的时机 , 这里再来看一下数据是在什么时候缓存进去的 :
1 | java复制代码// 节点一 : 获取 Client Registry |
补充 : Eureka HttpClient 体系
补充 : application 信息
1 | java复制代码 |
四 . 请求的使用
请求的使用可以参考 Feign 负载均衡 , 其本身也是从容器中获取 Server 列表
1 | java复制代码public Object getServicesList() { |
Step : Applicaiton 的存储
1 | java复制代码public List<String> getServices() { |
五 . 总结
核心对象就是一个 AtomicReference ,通过 AbstractJerseyEurekaHttpClient 调用 /app 查询所有的 Server
本文转载自: 掘金