Eureka源码2-Eureka预备知识和核心类

Spring Cloud Alibaba源码深度解析:Nacos服务发现与Sentinel流量控制核心机制 在微服务架构中,服务发现与流量控制是保障系统高可用与稳定性的两大基石。服务发现机制负责管理服务实例的注册与寻址,其核心在于通过心跳检测和状态同步来维护服务注册表的实时性与一致性。流量控制则通过统计请求指标并应用规则,防止系统因突发流量过载,其关键在于高并发下精准、低开销的指标采集与判断。理解这些底层原理,对于构建健壮的分布式系统、进行有效的故障排查与性能调优至关重要。以Spring Cloud Alibaba生态中的Nacos和Sentinel为例,Nacos通过客户端心跳、服务端健康检查及最终一致性协议( 阅读详情

1. 前言

1.1 Eureka的异地多活

异地多活一般是指在不同城市建立独立的数据中心。

活是相对于主备关系中的热备而言的。热备是指备份机房随时全量备份着主机房中的数据,但平时不 支撑业务需求,即不对外提供服务。只有在主机房出现故障时才会切换到备份机房,由备份机房对外提 供服务。也就是说,平时只有主机房是活的。

多活则是指这些机房间属于主从关系,即这些机房平时都支撑业务需求,都对外提供服务,相互备 份。

1.2 Region和Zone

Eureka中具有Region与Availability Zone(简称AZ)概念,都是云计算中的概念。

为了方便不同地理区域中用户的使用,大型云服务提供商一般会根据用户需求量在不同的城市、省份、 国家或洲创建不同的大型云计算机房。这些不同区域机房间一般是不能“内网连通”的。这些区域就称为 一个Region。

这里存在一个问题:同一Region机房是如何实现同域容灾的?为了增强容灾能力,在一个Region中又 设置了不同的Availability Zone。这些AZ间实现了内网连通,且用户可以根据自己所在的具体位置自动 选择同域中的不同AZ。当用户所要访问的AZ出现问题后,系统会自动切换到其它可用的AZ。

例如,AWS将全球划分为了很多的Region,例如美国东部区、美国西部区、欧洲区、非洲开普敦区、 亚太区等。像Eureka系统架构图中的us-east-1c、us-east-1d、us-east-1e就是us-east-1这个Region中 的c、d、e三个AZ。

再如,阿里云在我国境内的Region有杭州、北京、深圳、青岛、香港等,境外Region有亚太东南1区 (新加坡)、亚太东南2区(悉尼)、亚太东北1区(东京)等

1.3 Region和AZ需求

假设某公司的服务器有Beijing、Shanghai等多个Region。Beijing这个Region中存在两个AZ,分别是 bj-1与bj-2,每个AZ中有三台Eureka Server。

h-1与h-2两台主机提供的都是相同的Service服务,根据地理位置的不同,这两台主机分别注册到了距 离自己最近的不同AZ的Eureka Server。

2.核心类

2.1 客户端核心类

2.1.1 InstanceInfo-实例信息类

// 客户端中,表示自身实例信息
// 服务端中,表示实例存在服务端注册表中的信息
public class InstanceInfo {

    // ......  

    // 客户端中,表示自己的真实工作状态
    // 服务端中,表示服务发现时实例想要暴露给其他实例的工作状态,不一定是实例的真实工作状态
    private volatile InstanceStatus status = InstanceStatus.UP;

    // 覆盖状态,服务端可以根据一定规则匹配出 status
    // 外界修改实例在服务端中状态(比如通过 actuator 修改状态)就是修改覆盖状态
    private volatile InstanceStatus overriddenStatus = InstanceStatus.UNKNOWN;

    // 判断实例信息在服务端中是否是脏的
    private volatile boolean isInstanceInfoDirty = false;

    // 租约信息
    private volatile LeaseInfo leaseInfo;

    // 记录实例信息在服务端最近一次修改的时间
    private volatile Long lastUpdatedTimestamp;

    // 记录实例信息在客户端最近一次修改的时间
    private volatile Long lastDirtyTimestamp;

    // ......

}

  • InstanceStatus-实例状态类
public enum InstanceStatus {
    UP, // 启动状态,表示实例对外正常提供服务
    DOWN, // 下线状态,实例健康检查失败时修改为该状态
    STARTING, // 启动中状态,表示实例正在初始化启动中
    OUT_OF_SERVICE, // 停止服务状态,表示实例不对外提供服务
    UNKNOWN; // 未知状态

    // ......
}

  • LeaseInfo 租约信息类
public class LeaseInfo {

    public static final int DEFAULT_LEASE_RENEWAL_INTERVAL = 30;
    public static final int DEFAULT_LEASE_DURATION = 90;

    // 客户端维护的心跳间隔时间
    private int renewalIntervalInSecs = DEFAULT_LEASE_RENEWAL_INTERVAL;
    // 客户端维护的租约持续时间
    private int durationInSecs = DEFAULT_LEASE_DURATION;

    // 服务端维护的实例注册时间
    private long registrationTimestamp;
    // 服务端维护的实例最近一次更新时间
    private long lastRenewalTimestamp; 
    // 服务端维护的实例过期清理时间
    private long evictionTimestamp;
    // 服务端维护的实例启动时间
    private long serviceUpTimestamp;

    // ......
}

2.1.2 Application

一个Application实例保存着一个特定微服务的所有提供者实例

public class Application {

    private static Random shuffleRandom = new Random();
    private String name;

    @XStreamOmitField
    private volatile boolean isDirty = false;

    /**
     * 保存着当前name所指定的微服务名称的所有InstanceInfo 实例
     */
    @XStreamImplicit
    private final Set<InstanceInfo> instances;

    private final AtomicReference<List<InstanceInfo>> shuffledInstances;

    // key:instanceId  value:InstanceInfo实例
    private final Map<String, InstanceInfo> instancesMap;

2.1.3 Applications

该类封装了来自于Eureka Server的所有注册信息,我们可成为 "客户端注册表"

public class Applications {
    private static class VipIndexSupport {
        final AbstractQueue<InstanceInfo> instances = new ConcurrentLinkedQueue<>();
        final AtomicLong roundRobinIndex = new AtomicLong(0);
        final AtomicReference<List<InstanceInfo>> vipList = new AtomicReference<List<InstanceInfo>>(Collections.emptyList());

        public AtomicLong getRoundRobinIndex() {
            return roundRobinIndex;
        }

        public AtomicReference<List<InstanceInfo>> getVipList() {
            return vipList;
        }
    }

    private static final String STATUS_DELIMITER = "_";

    private String appsHashCode;
    private Long versionDelta;
    @XStreamImplicit
    private final AbstractQueue<Application> applications;
    // key:微服务名称 value:Application实例
    private final Map<String, Application> appNameApplicationMap;
    private final Map<String, VipIndexSupport> virtualHostNameAppMap;
    private final Map<String, VipIndexSupport> secureVirtualHostNameAppMap;
}

2.2 服务端

2.2.1 AbstractInstanceRegistry

服务端具体处理客户端请求(心跳续租、注册、变更状态等等)的类

public abstract class AbstractInstanceRegistry implements InstanceRegistry {

    // ......

    // 服务实例租约信息
    private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
            = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();

    // 覆盖状态 map
    protected final ConcurrentMap<String, InstanceStatus> overriddenInstanceStatusMap = CacheBuilder
            .newBuilder().initialCapacity(500)
            .expireAfterAccess(1, TimeUnit.HOURS)
            .<String, InstanceStatus>build().asMap();

    // 最近注册队列,实例注册到服务端时添加
    // 先进先出队列,满1000时移除最先添加的
    private final CircularQueue<Pair<Long, String>> recentRegisteredQueue;

    // 最近下架队列,实例从服务端下架时添加
    // 先进先出队列,满1000时移除最先添加的
    private final CircularQueue<Pair<Long, String>> recentCanceledQueue;

    // 最近变更队列
    // 有定时任务维护的队列,每30s执行一次,移除添加进该队列超过3分钟的实例变更信息
    private ConcurrentLinkedQueue<RecentlyChangedItem> recentlyChangedQueue = new ConcurrentLinkedQueue<RecentlyChangedItem>();

    private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    // 读锁(处理客户端注册、下架、状态变更、删除状态时使用)
    private final Lock read = readWriteLock.readLock();
    // 写锁(处理客户端拉取增量注册表时使用)
    private final Lock write = readWriteLock.writeLock();

    // 服务端统计最近一分钟预期收到客户端实例心跳续租的请求数
    protected volatile int numberOfRenewsPerMinThreshold;

    // 服务端统计预期收到心跳续租的客户端实例数
    protected volatile int expectedNumberOfClientsSendingRenews;

    // 响应缓存
    // 服务端处理客户端拉取注册表请求时使用
    protected volatile ResponseCache responseCache;

    // ......

    // 处理注册
    public void register(InstanceInfo registrant, int leaseDuration, boolean isReplication) {...}

    // 处理下架
    public boolean cancel(String appName, String id, boolean isReplication) {...}

    // 具体下架处理
    protected boolean internalCancel(String appName, String id, boolean isReplication) {...}

    // 处理心跳续租
    public boolean renew(String appName, String id, boolean isReplication) {...}

    // 处理变更状态
    public boolean statusUpdate(String appName, String id,
                                InstanceStatus newStatus, String lastDirtyTimestamp,
                                boolean isReplication) {...}

    // 处理删除状态
    public boolean deleteStatusOverride(String appName, String id,
                                        InstanceStatus newStatus,
                                        String lastDirtyTimestamp,
                                        boolean isReplication) {...}

    // 处理实例过期清理
    public void evict(long additionalLeaseMs) {...}

    // 处理拉取全量注册表(本地全量注册表 + 可能包含全部远程 region 注册表)
    public Application getApplication(String appName, boolean includeRemoteRegion) {...}

    // 处理拉取全量注册表(本地全量注册表 + 可能包含指定远程 region 全量注册表)
    public Applications getApplicationsFromMultipleRegions(String[] remoteRegions) {...}

    // 处理拉取增量注册表(本地增量注册表 + 可能包含指定远程 region 增量注册表)
    public Applications getApplicationDeltasFromMultipleRegions(String[] remoteRegions) {...}

    ...... 
}

  • Lease-只有服务端维护的实例租约信息类
public class Lease<T> {

    // 实例下架时间
    private long evictionTimestamp;

    // 实例注册时间
    private long registrationTimestamp;

    // 实例启动时间
    private long serviceUpTimestamp;

    // 实例租约过期时间
    private volatile long lastUpdateTimestamp;

    ......

}

  • ResponseCacheImpl:响应缓存实现类
public class ResponseCacheImpl implements ResponseCache {

    // ......

    // 只读缓存
    private final ConcurrentMap<Key, Value> readOnlyCacheMap = new ConcurrentHashMap<Key, Value>();

    // 读写缓存
    // LoadingCache:Guava 提供的本地缓存,多线程的场景下保证只有一个线程加载相应缓存项
    private final LoadingCache<Key, Value> readWriteCacheMap;

    // 判断是否使用只读缓存
    private final boolean shouldUseReadOnlyResponseCache;

    // ......
}

2.2.2 PeerAwareInstanceRegistryImpl

处理集群节点间相关操作的实现类

public class PeerAwareInstanceRegistryImpl extends AbstractInstanceRegistry implements PeerAwareInstanceRegistry {

    // 当前服务端节点的启动时间
    private long startupTime = 0;

    // 判断服务端启动时同步集群节点注册表的实例数是否为空
    private boolean peerInstancesTransferEmptyOnStartup = true;

    // 最近一分钟同步复制给集群节点的次数 
    private final MeasuredRate numberOfReplicationsLastMin;

    // 服务端的相邻集群节点,配置文件中配置
    protected volatile PeerEurekaNodes peerEurekaNodes;
}

3. Jersey通信框架

Spring Cloud中Eureka Client与Eureka Server的通信,及Eureka Server间的通信,均采用的是Jersey框架。

Jersey框架是一个开源的RESTful框架,实现了JAX-RS规范。该框架的作用与SpringMVC是相同的,其 也是用户提交URI后,在处理器中进行路由匹配,路由到指定的后台业务。这个路由功能同样也是通过 处理器完成的,只不过这里的处理器不叫Controller,而叫Resource。

@Produces({"application/xml", "application/json"})
public class InstanceResource {
    private static final Logger logger = LoggerFactory
            .getLogger(InstanceResource.class);

    private final PeerAwareInstanceRegistry registry;
    private final EurekaServerConfig serverConfig;
    private final String id;
    private final ApplicationResource app;

    InstanceResource(ApplicationResource app, String id, EurekaServerConfig serverConfig, PeerAwareInstanceRegistry registry) {
        this.app = app;
        this.id = id;
        this.serverConfig = serverConfig;
        this.registry = registry;
    }
    ...
}
Eureka服务fetch registries(一) client端分析 根据前两章节的分析,我们知道eureka客户端通过创建DiscoveryClient对象调用构造方法来实现了register,renew, heartbeat, registries fetch的功能。 本章节主要分析registries fetch在源码中的实现。 Clinet端的处理逻辑 DiscoveryClient在构造方法中创建了一个cacheRefreshExecutor的守护线程池,核心线程数为1,默认cacheRefreshExecutorThreadPoolSize为2。 顺着源码往下看, 阅读详情

相关推荐

多AZ的高可用方案

AWS在每个Region都有多个AZ(Availability Zone)多个AZ之间物理隔离,供电也是独立的,这样部署业务时,可以充分利用多AZ实现高可用方案,避免亚马逊底层机房事故导致业务中断。(1)前端ELB层,可以将ELB设置成跨多个AZ,即将需要的子网(Available Subnet)添加进ELB就行,(点击Available Subnet前面的绿色加号按钮),这个时候,每个AZ至少选择

王飞Vincent-Fei的AWS专栏 1万+

Spring Cloud Eureka Server高可用(主备部署模式)

接到师父安排的任务:微服务项目部署增加主备模式。有点慌,主备部署,是什么? 主备部署,就是字面意思,有主机,还有备用机。平常工作就是在主机上,备用机默默在背后同步主机的数据,时刻待命。再研究这个Eureka的主备,其实就是Eureka Server的高可用。在生产环境中,如果是单节点的部署模式,万一Eureka Server宕机,很可能影响其他服务之间的调用,严重影响整个系统的可用性,所以一般常常部署一个高可用的Eureka Server的集群。 Eureka ...

日技 1862

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、

我的笔记 4115

Spring Cloud Eureka独立部署中间件

一,创建高可用的eureka sever 1. 创建eureka server 2.配置application.properties 和 注解@EnableEurekaServer #注册的应用名称 spring.application.name=eureka-server #eureka默认端口 server.port=8761 #eureka.instance.hostname=eureka1 #注册的eureka服务端地址 eureka.client.service-url.defaultZo.

weixin_41908066的博客 848

ST-Link V2的隐藏技能:多通道串口调试的终极指南

本文深入探讨了ST-Link V2的多通道串口调试功能,突破传统烧录工具的限制。通过详细的硬件配置、Arduino IDE设置和实战案例,展示了如何利用SWD接口实现多通道数据监控,提升STM32F103C8T6等开发板的调试效率。文章还提供了PCB布局优化和性能调优技巧,助力开发者充分发挥ST-Link V2的潜能。

weixin_29285605的博客 355

ICM42670 IIC驱动与卡尔曼+四元数姿态解算实战

惯性测量单元(IMU)是运动控制、无人机飞控和AR/VR设备的核心传感器,其数据质量直接取决于底层硬件通信可靠性与姿态估计算法鲁棒性。IIC(I²C)作为嵌入式系统中最常用的低速串行总线,需满足确定性时序、抗干扰与实时采样要求;卡尔曼滤波则通过状态建模与噪声协方差优化,在动态环境中融合加速度计与陀螺仪数据;而四元数因其无万向锁、插值平滑、旋转合成高效等优势,成为高精度姿态解算的数学基础。本文以高性能六轴IMU ICM42670为载体,深入剖析IIC硬件设计要点、裸机级驱动优化、Allan方差驱动的卡尔曼参数

weixin_27076351的博客 251

Eureka源码之Region、Zone、serviceUrls

一  getServiceUrlsMapFromConfig函数 public static Map&lt;String, List&lt;String&gt;&gt; getServiceUrlsMapFromConfig(EurekaClientConfig clientConfig, String instanceZone, boolean preferSameZone) { ...

实践求真知 1976

<蓝桥杯软件赛>零基础备赛20周--第16周--GCD和LCM

gcd,lcm

罗勇军的博客 7602

eureka原理_Eureka的工作原理以及它与ZooKeeper的区别

1、Eureka 简介:Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。其中, Eureka 又可细分为 Eureka Server 和 Eureka Client。​1.基本原理上图是来自eureka的官方架构图,这是基于集群配置的eureka; - 处于不同节点的eureka通过Replicate进...

weixin_39751453的博客 339

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序

KyleKuang的博客 8331

3.嵌入式控制器EC学习,源码框架(60/64端口)(一)

服务函数剖析 上一篇讲到while循环会一直查询十六个标志位是否满足要求,一旦其中某个标志位为1时,程序将会执行相应的服务函数,而执行服务函数是通过函数指针(service_table[ _R1 ])();来实现的。接下来我们分别来看看这十六个服务函数分别包含了哪些内容。 16个函数的函数名如下: const FUNCT_PTR_V_V code service_table[16] = { // Hi-Level Service Service_PCI, // Host 6

qq_30135687的博客 4159

搭建Eureka注册中心集群 ,实现负载均衡

问题:微服务RPC远程服务调用最核心的是什么高可用,试想你的注册中心只有一个only one, 它出故障了那就呵呵( ̄▽ ̄)"了,会导致整个为服务环境不可用,所以解决办法:搭建Eureka注册中心集群 ,实现负载均衡+故障容错。...

一个菜鸡的博客 860

Playwright MCP:开启浏览器自动化的新篇章

在当今数字化时代,浏览器自动化技术在众多领域发挥着至关重要的作用,从简单的网页爬取到复杂的自动化测试,再到智能代理与网页的交互等场景,都离不开高效、可靠的浏览器自动化工具。而微软推出的项目,正是在这一领域的一次创新性探索,它为开发者带来了全新的视角和强大的功能支持。本文将深入探讨的概念、架构、代码示例、应用场景、注意事项以及未来发展方向,帮助读者全面了解这一前沿技术。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 5261

Spring Cloud Eureka Client 源码解析(一)预备知识、自动配置类的加载解析

1.预备知识 1.1 Region 与 Zone 1.1.1 概念 Eureka 中具有 Region 与 Availability Zone(简称 AZ)概念,是云计算中的概念。 为了方便不同地理区域中用户的使用,大型云服务提供商一般会根据用户需求量在不同的城市、省份、国家或洲创建不同的大型云计算机房。这些不同区域机房间一般是不能“内网连通”的。这些区域就称为一个 Region。 这里存在一个问题:同一 Region 机房是如何实现同域容灾的?为了增强容灾能力,在一个 Region 中又设置了不同的 A

语雀同名:犬豪 yuque.com/qhao 496

海德汉机床采集数据

海德汉数控系统我一般在高端机床上见得比较多。有好多五轴加工精度比较高的机床都用的是海德汉的系统。市面上常见的有530和640等型号。海德汉的采集还是有点难度的,需要对SDK有深度的了解。

若云流风的专栏 1525

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringCloud Eureka 服务发现组件(内部做了什么)---核心类[理论点]

大家儿,这篇手稿给点进来的‘码’同志们,分享、分析Eureka(服务发现组件)的核心类、设计思想、参数优调及故障演练。–注意⚠️偏理论 Eureka-核心一、Eureka的核心类1 > InstanceInfo类(是用来-代表注册的服务实例)1-1 InstanceInfo类(同⬆️类)中的 InstanceStatus 枚举(enum)2 > LeaseInfo类(是用来-标识应用实例的租约信息)2 > ServiceInstance 接口 (是用来-对Service Discovery

Ssssongsmith 天璇星 452

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Eureka服务端Jersey接口

eureka

qq_39939541的博客 685

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

细说Spring cloud ——eureka 的几种主动下线服务的方式

本文会介绍几种eureka 注册中心服务下线的方式1. 直接停掉服务。默认情况下,如果Eureka Server在90秒没有收到Eureka客户的续约,它会将实例从其注册表中删除。但这种做法的不好之处在于, 客户端已经停止了运行,但仍然在注册中心的列表中。 虽然通过一定的负载均衡策略或使用熔断器可以让服务正常进行,但有没有方法让注册中心马上知道服务已经下线呢? 2.为了让注册中心马上知道服务要下线...

sinat_25596967的博客 3万+

eureka集群和ribbon负载均衡迅速搭建

整体架构图: 1. eureka集群搭建 集群有两个注册中心模块,模块名分别是:spring-cloud-eureka-server-7001和spring-cloud-eureka-server-7002 以下介绍spring-cloud-eureka-server-7001的搭建,spring-cloud-eureka-server-7002同理。 1.1 pom.xml配置文...

行走巨人国 1948

使用spring cloud eureka构建高可用注册中心遇到的神坑,备忘

最近开始尝试spring cloud框架构建分布式服务,开启近年来十分火热的微服务之旅。 接触过分布式微服务技术概念的都应该知道,分布式服务构建应遵循的最著名的CAP理论,而对分布式架构起着关键核心作用的组件之一,莫过于服务注册与发现组件。 对比当前比较流行的一些分布式服务注册中心,只有eureka最贴近标准的分布式构架理论,提供了高可用保障和分区容错机制。因此在一段时间的理论基础准备后,着手

lonng的专栏——玩的也要有深度 6265

Eureka集群间通信

确保您已访问此页面以了解Eureka群集配置。 Eureka客户试图在同一区域与Eureka Server交谈。如果与服务器通信时出现问题或者同一区域中不存在服务器,则客户端将故障转移到其他区域中的服务器。 一旦服务器开始接收流量,服务器上执行的所有操作都将复制到服务器知道的所有对等节点。如果某个操作由于某种原因而失败,则会在下一个也会在服务器之间复制的心跳上协调该信息。 当Eureka服务...

lc的大脑备份 2449

SpringCloud Eureka参数配置项详解

Eureka涉及到的参数配置项数量众多,它的很多功能都是通过参数配置来实现的,了解这些参数的含义有助于我们更好的应用Eureka的各种功能,下面对Eureka的配置项做具体介绍,供大家参考。 Eureka客户端配置 1、RegistryFetchIntervalSe...

chongcuoshen6607的博客 484

SpringCloud(三):Eureka基础知识,单机配置、集群配置、自我保护

前情回顾 SpringCloud(一):SpringBoot、SpringCloud版本选择,微服务架构编码构建 在(一)和(二)中,我们搭建了两个模块,Order和Payment通过RestTempate实现了RestFul风格的地址调用,但还未用到微服务相关的知识。 接下来,我们将要把这些技术,一块块的往上加,让他越来越庞大和复杂,也越来越强大。 我们先加第一个组件,服务注册中心,虽然我们(一)和(二)没有通过服务注册中心就能互相调用,但是如果服务很多,那么将会出现问题。 我们来学习服务注册中

Clawww的学习笔记 806

Eureka客户端初始化(4)

10. 上接RetryableEurekaHttpClient#execute,继续执行clientFactory.newClient(currentEndpoint);返回的是new RedirectingEurekaHttpClient(endpoint.getServiceUrl(), delegateFactory, dnsService);requestExecutor.execute(...

530

Eureka核心源码解析

https://blog.youkuaiyun.com/trunks2009/article/details/106425297?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0-106425297-blog-110039533.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3 Eureka

yygr的博客 1286
上一篇: 太神了!开源大佬的SpringBoot+微服务架构笔记,一般人真肝不出来
下一篇: 针对springboot查询的数据null转空串
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值