Eureka 源码解析 —— Eureka-Server 启动(一)之 ServerConfig

摘要: 原创出处 http://www.iocoder.cn/Eureka/eureka-server-init-first/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 Eureka 1.8.X 版本

  • 1. 概述
  • 2. EurekaServerConfig

  • 1. 概述

    本文主要分享 Eureka-Server 启动的过程

    考虑到整个初始化的过程中涉及的代码特别多,拆分成两两篇文章:

    推荐 Spring Cloud 书籍

    2. EurekaServerConfig

    com.netflix.eureka.EurekaServerConfigEureka-Server 配置接口


    2.1 类关系图


    2.2 配置属性

    点击 EurekaServerConfig 查看配置属性简介,已经添加中文注释,可以对照着英文注释一起理解。这里笔者摘出部分较为重要的属性:

    • 请求认证相关

    • 请求限流相关

      • 《Eureka 源码解析 —— 基于令牌桶算法的 RateLimiter》 有详细解析。
      • #isRateLimiterEnabled() :请求限流是否开启。
      • #isRateLimiterThrottleStandardClients() :是否对标准客户端判断是否限流。标准客户端通过请求头( header )的 "DiscoveryIdentity-Name" 来判断,是否在标准客户端名集合里。
      • #getRateLimiterPrivilegedClients()标准客户端名集合。默认包含"DefaultClient""DefaultServer"
      • #getRateLimiterBurstSize() :速率限制的 burst size ,使用令牌桶算法
      • #getRateLimiterRegistryFetchAverageRate()增量拉取注册信息的速率限制。
      • #getRateLimiterFullFetchAverageRate()全量拉取注册信息的速率限制。

    • 获取注册信息请求相关

      • 《Eureka 源码解析 —— 应用实例注册发现 (六)之全量获取》 有详细解析。
      • 《Eureka 源码解析 —— 应用实例注册发现 (七)之增量获取》 有详细解析。
      • #shouldUseReadOnlyResponseCache() :是否开启只读请求响应缓存。响应缓存 ( ResponseCache ) 机制目前使用两层缓存策略。优先读取只读缓存,读取不到后读取固定过期读写缓存
      • #getResponseCacheUpdateIntervalMs()只读缓存更新频率,单位:毫秒。只读缓存定时更新任务只更新读取过请求 (com.netflix.eureka.registry.Key),因此虽然永不过期,也会存在读取不到的情况。
      • #getResponseCacheAutoExpirationInSeconds()读写缓存写入后过期时间,单位:秒。
      • #getRetentionTimeInMSInDeltaQueue():租约变更记录过期时长,单位:毫秒。默认值 : 3 60 1000 毫秒。
      • #DeltaRetentionTimerIntervalInMs():移除队列里过期的租约变更记录的定时任务执行频率,单位:毫秒。默认值 :30 * 1000 毫秒。

    • 自我保护机制相关

      • 《Eureka 源码解析 —— 应用实例注册发现(四)之自我保护机制》 有详细解析。
      • #shouldEnableSelfPreservation() :是否开启自我保护模式。

        FROM 周立——《理解Eureka的自我保护模式》
        当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。
        一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。
        当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

      • #getRenewalPercentThreshold() :开启自我保护模式比例,超过该比例后开启自我保护模式。

      • #getRenewalThresholdUpdateIntervalMs() :自我保护模式比例更新定时任务执行频率,单位:毫秒。

    • 注册的应用实例的租约过期相关

    • Eureka-Server 远程节点( 非集群 )读取相关

      • TODO[0009]:RemoteRegionRegistry
      • #getRemoteRegionUrlsWithName() :TODO[0009]:RemoteRegionRegistry。

        • key :Eureka-Server 区域( region )
        • value :Eureka-Server 地址

      • #getRemoteRegionAppWhitelist() :TODO[0009]:RemoteRegionRegistry。
      • #getRemoteRegionRegistryFetchInterval() :TODO[0009]:RemoteRegionRegistry。
      • #getRegistrySyncRetries() :Eureka-Server 启动时,从远程 Eureka-Server 读取失败重试次数。
      • #getRegistrySyncRetryWaitMs() :Eureka-Server 启动时,从远程 Eureka-Server 读取失败等待( sleep )间隔,单位:毫秒。
      • #getRemoteRegionFetchThreadPoolSize() :TODO[0009]:RemoteRegionRegistry。
      • #disableTransparentFallbackToOtherRegion() :是否禁用本地读取不到注册信息,从远程 Eureka-Server 读取。

    • Eureka-Server 集群同步相关

      • 《Eureka 源码解析 —— Eureka-Server 集群同步》
      • #getMaxThreadsForPeerReplication() :同步应用实例信息最大线程数。
      • #getMaxElementsInPeerReplicationPool() :待执行同步应用实例信息事件缓冲最大数量。
      • #getMaxTimeForReplication() :执行单个同步应用实例信息状态任务最大时间。
      • #shouldSyncWhenTimestampDiffers() :是否同步应用实例信息,当应用实例信息最后更新时间戳( lastDirtyTimestamp )发生改变。
      • #getWaitTimeInMsWhenSyncEmpty() :Eureka-Server 启动时,从远程 Eureka-Server 读取不到注册信息时,多长时间不允许 Eureka-Client 访问。
      • #getPeerEurekaNodesUpdateIntervalMs() :Eureka-Server 集群节点更新频率,单位:毫秒。


    2.3 DefaultEurekaServerConfig

    com.netflix.eureka.DefaultEurekaServerConfig,基于配置文件Eureka-Server 配置实现类,实现代码如下:


           
           
    public class DefaultEurekaServerConfig implements EurekaServerConfig {
    // ... 省略部分方法和属性
    private static final String ARCHAIUS_DEPLOYMENT_ENVIRONMENT = "archaius.deployment.environment";
    private static final String TEST = "test";
    private static final String EUREKA_ENVIRONMENT = "eureka.environment";
    /
    * 配置文件对象
    /
    private static final DynamicPropertyFactory configInstance = com.netflix.config.DynamicPropertyFactory.getInstance();
    /
    配置文件
    /
    private static final DynamicStringProperty EUREKA_PROPS_FILE = DynamicPropertyFactory
    .getInstance().getStringProperty( "eureka.server.props", "eureka-server");
    /*
    * 命名空间
    */
    private String namespace = "eureka.";
    public DefaultEurekaServerConfig() {
    init();
    }
    public DefaultEurekaServerConfig(String namespace) {
    // 设置 namespace,为 "." 结尾
    this.namespace = namespace;
    // 初始化 配置文件对象
    init();
    }
    private void init() {
    // 初始化 配置文件对象
    String env = ConfigurationManager.getConfigInstance().getString(EUREKA_ENVIRONMENT, TEST);
    ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, env);
    String eurekaPropsFile = EUREKA_PROPS_FILE.get();
    try {
    // ConfigurationManager
    // .loadPropertiesFromResources(eurekaPropsFile);
    ConfigurationManager.loadCascadedPropertiesFromResources(eurekaPropsFile);
    } catch (IOException e) {
    logger.warn( "Cannot find the properties specified : {}. This may be okay if there are other environment "
    + "specific properties or the configuration is installed with a different mechanism.", eurekaPropsFile);
    }
    }
    }
首先,你需要创建一个新的Spring Boot项目,例如命名为`hystrix-demo`。这个项目将作为客户端,依赖于Eureka Server来实现服务发现。以下是步骤: 1. **初始化Hystrix-Demo项目**: - 使用Maven或Gradle初始化新项目,选择合适的模板,如Spring Initializr网站生成一个基本的Spring Boot Web应用项目结构。 - 添加必要的依赖,包括Spring Cloud Hystrix(用于处理断路器和熔断机制)、Spring Cloud Netflix Eureka Client(用于与Eureka Server通信),以及Spring Cloud Config(如果需要外部配置管理)。 ```xml <!-- Maven --> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> </dependencies> // Gradle implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.cloud:spring-cloud-starter-hystrix' ``` 2. **添加Eureka-server依赖**: 如果Eureka-server项目已经存在并且使用的是2.2.1版本,将其作为一个远程仓库或者本地模块引入到hystrix-demo的pom.xml或build.gradle文件中。确保eureka-server提供了一个可用的注册中心服务。 3. **配置Eureka Client**: 在`hystrix-demo`项目的application.yml或application.properties中配置Eureka Client的相关信息,比如Eureka服务器的URL地址、服务名等。 ```yaml eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: hostname: localhost appname: your-app-name ``` 4. **启动和测试**: - 启动eureka-server项目,确认其正常运行。 - 配置好后,运行hystrix-demo项目,它应该能够自动去Eureka Server注册并从那里获取其他微服务的信息。 完成以上步骤后,你就成功地在hystrix-demo项目中集成了一个依赖于eureka-server的子项目,并实现了服务发现功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值