1. 程式人生 > >註冊中心 Eureka 原始碼解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig

註冊中心 Eureka 原始碼解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig

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

  • 1. 概述

  • 2. EurekaInstanceConfig

    • 2.1 類關係圖

    • 2.2 配置屬性

    • 2.3 AbstractInstanceConfig

    • 2.4 PropertiesInstanceConfig

    • 2.5 MyDataCenterInstanceConfig

  • 2.6 小結

    • 3. InstanceInfo

    • 4. ApplicationInfoManager

  • 666. 彩蛋

友情提示:歡迎關注公眾號【芋道原始碼】。?關注後,拉你進【原始碼圈】微信群討論技術和原始碼。

友情提示:歡迎關注公眾號【芋道原始碼】。?關注後,拉你進【原始碼圈】微信群討論技術和原始碼。

友情提示:歡迎關注公眾號【芋道原始碼】。?關注後,拉你進【原始碼圈】微信群討論技術和原始碼。

1. 概述

本文主要分享 Eureka-Client 自身初始化的過程,不包含 Eureka-Client 向 Eureka-Server 的註冊過程( ?後面會另外文章分享 )。

Eureka-Client 自身初始化過程中,涉及到主要物件如下圖:

  1. 建立 EurekaInstanceConfig物件

  2. 使用 EurekaInstanceConfig物件 建立 InstanceInfo物件

  3. 使用 EurekaInstanceConfig物件 + InstanceInfo物件 建立 ApplicationInfoManager物件

  4. 建立 EurekaClientConfig物件

  5. 使用 ApplicationInfoManager物件 + EurekaClientConfig物件 建立

     EurekaClient物件

考慮到整個初始化的過程中涉及的配置特別多,拆分成三篇文章:

  1. 【本文】(一)EurekaInstanceConfig

  2. (二)EurekaClientConfig

  3. (三)EurekaClient

下面我們來看看每個的實現。

推薦 Spring Cloud 書籍

  • 請支援正版。下載盜版,等於主動編寫低階 BUG 。

  • 程式猿DD —— 《Spring Cloud微服務實戰》

  • 周立 —— 《Spring Cloud與Docker微服務架構實戰》

  • 兩書齊買,京東包郵。

2. EurekaInstanceConfig

com.netflix.appinfo.EurekaInstanceConfig

,Eureka 應用例項配置介面。在下文你會看到 EurekaClientConfig 介面,兩者的區別如下:

  • EurekaInstanceConfig,重在應用例項,例如,應用名、應用的埠等等。此處應用指的是,Application Consumer 和 Application Provider。

  • EurekaClientConfig,重在 Eureka-Client,例如, 連線的 Eureka-Server 的地址、獲取服務提供者列表的頻率、註冊自身為服務提供者的頻率等等。

2.1 類關係圖

EurekaInstanceConfig 整體類關係如下圖:

  • 本文只解析紅圈部分類。

  • EurekaArchaius2ClientConfig 基於 Netflix Archaius 2.x 實現,目前還在開發中,因此暫不解析。

  • CloudInstanceConfig、Ec2EurekaArchaius2InstanceConfig 基於亞馬遜 AWS,大多數讀者和我對 AWS 都不瞭解,因此暫不解析。

2.2 配置屬性

點選 EurekaInstanceConfig 檢視配置屬性簡介,已經新增中文註釋,可以對照著英文註釋一起理解。這裡筆者摘出部分較為重要的屬性:

  • #getLeaseRenewalIntervalInSeconds() :租約續約頻率,單位:秒。應用不斷通過按照該頻率傳送心跳給 Eureka-Server 以達到續約的作用。當 Eureka-Server 超過最大頻率未收到續約(心跳),契約失效,進行應用移除。應用移除後,其他應用無法從 Eureka-Server 獲取該應用。

  • #getLeaseExpirationDurationInSeconds() :契約過期時間,單位:秒。

  • #getDataCenterInfo() :資料中心資訊。com.netflix.appinfo.DataCenterInfo,資料中心資訊介面,目前較為簡單,標記所屬資料中心名。一般情況下,我們使用 Name.MyOwn。介面實現程式碼如下:

    public interface DataCenterInfo {
    /**
    * 資料中心名列舉
    */

    enum Name {
       Netflix,
       Amazon,
       MyOwn
    }

    /**
    * @return 歸屬的資料中心名
    */

    Name getName();
    }
  • #getNamespace() :配置名稱空間,預設使用 eureka。以 eureka-client.properties 舉個例子:

    eureka.name=eureka
    eureka.port=8080
    eureka.vipAddress=eureka.mydomain.net
    • 每個屬性最前面的 eureka 即是配置名稱空間,一般情況無需修改。

  • TODO[0004]:健康檢查

  • #isInstanceEnabledOnit() :應用初始化後是否開啟。在「3. InstanceInfo」詳細解析。

2.3 AbstractInstanceConfig

com.netflix.appinfo.AbstractInstanceConfig,Eureka 應用例項配置抽象基類,主要實現一些相對通用的配置,實現程式碼如下:

public abstract class AbstractInstanceConfig implements EurekaInstanceConfig {

   /**
    * 契約過期時間,單位:秒
    */

   private static final int LEASE_EXPIRATION_DURATION_SECONDS = 90;
   /**
    * 租約續約頻率,單位:秒。
    */

   private static final int LEASE_RENEWAL_INTERVAL_SECONDS = 30;
   /**
    * 應用 https 埠關閉
    */

   private static final boolean SECURE_PORT_ENABLED = false;
   /**
    * 應用 http 埠開啟
    */

   private static final boolean NON_SECURE_PORT_ENABLED = true;
   /**
    * 應用 http 埠
    */

   private static final int NON_SECURE_PORT = 80;
   /**
    * 應用 https 埠
    */

   private static final int SECURE_PORT = 443;
   /**
    * 應用初始化後開啟
    */

   private static final boolean INSTANCE_ENABLED_ON_INIT = false;
   /**
    * 主機資訊
    * key:主機 IP 地址
    * value:主機名
    */

   private static final Pair<String, String> hostInfo = getHostInfo();
   /**
    * 資料中心資訊
    */

   private DataCenterInfo info = new DataCenterInfo() {
       @Override
       public Name getName() {
           return Name.MyOwn;
       }
   };

   private static Pair<String, String> getHostInfo() {
       Pair<String, String> pair;
       try {
           InetAddress localHost = InetAddress.getLocalHost();
           pair = new Pair<String, String>(localHost.getHostAddress(), localHost.getHostName());
       } catch (UnknownHostException e) {
           logger.error("Cannot get host info", e);
           pair = new Pair<String, String>("", "");
       }
       return pair;
   }

   // .... 省略 setting / getting 方法
}
  • #getHostInfo() 方法,獲取本地伺服器的主機名和主機 IP 地址。如果主機有多網絡卡或者虛擬機器網絡卡,這塊要小心,解決方式如下:

    • 手動配置本機的 hostname + etc/hosts 檔案,從而對映主機名和 IP 地址。

    • 使用 Spring-Cloud-Eureka-Client 的話,參考周立 —— 《Eureka服務註冊過程詳解之IpAddress》解決。

2.4 PropertiesInstanceConfig

com.netflix.appinfo.PropertiesInstanceConfig,基於配置檔案的 Eureka 應用例項配置抽象基類,實現程式碼如下:

public abstract class PropertiesInstanceConfig extends AbstractInstanceConfig implements EurekaInstanceConfig {

   /**
    * 名稱空間
    */

   protected final String namespace;
   /**
    * 配置檔案物件
    */

   protected final DynamicPropertyFactory configInstance;
   /**
    * 應用分組

相關推薦

註冊中心 Eureka 原始碼解析 —— Eureka-Client 初始 EurekaInstanceConfig

本文主要基於 Eureka 1.8.X 版本1. 概述2. EurekaInstanceConf

註冊中心 Eureka 原始碼解析 —— Eureka-Client 初始 EurekaClient

本文主要基於 Eureka 1.8.X 版本1. 概述2. EurekaClient2.1 Lo

配置中心 Apollo 原始碼解析 —— 客戶端 API 配置 ConfigFile

������關注微信公眾號:【芋道原始碼】有福利: 1. RocketMQ / MyCAT / Sharding-JDBC 所有原始碼分析文章列表 2. RocketMQ / MyCAT / Sharding-JDBC 中文註釋

精盡 MyBatis 原始碼分析 - MyBatis 初始載入 mybatis-config.xml

> 該系列文件是本人在學習 Mybatis 的原始碼過程中總結下來的,可能對讀者不太友好,請結合我的原始碼註釋([Mybatis原始碼分析 GitHub 地址](https://github.com/liu844869663/mybatis-3)、[Mybatis-Spring 原始碼分析 GitHub 地址

springMVC原始碼分析--容器初始ContextLoaderListener

在spring Web中,需要初始化IOC容器,用於存放我們注入的各種物件。當tomcat啟動時首先會初始化一個web對應的IOC容器,用於初始化和注入各種我們在web執行過程中需要的物件。當tomcat啟動的時候是如何初始化IOC容器的,我們先看一下在web.xml中經常看

深入理解Linux網路技術內幕——裝置的註冊初始

副標題:設備註冊相關的基本結構的原理框架 設備註冊與刪除時間 裝置在下列兩種情況下進行註冊: 1)載入NIC驅動時 2)插入熱插拔裝置時 這裡NIC與熱插拔裝置有些不同。a.對於非熱插拔NIC來說,NIC的註冊是伴隨著其驅動的發生的,而NIC可以內建到核心,也可以作為模組

精盡MyBatis原始碼分析 - MyBatis初始載入 Mapper 介面與 XML 對映檔案

> 該系列文件是本人在學習 Mybatis 的原始碼過程中總結下來的,可能對讀者不太友好,請結合我的原始碼註釋([Mybatis原始碼分析 GitHub 地址](https://github.com/liu844869663/mybatis-3)、[Mybatis-Spring 原始碼分析 GitHub 地址

精盡MyBatis原始碼分析 - MyBatis初始 SQL 初始

> 該系列文件是本人在學習 Mybatis 的原始碼過程中總結下來的,可能對讀者不太友好,請結合我的原始碼註釋([Mybatis原始碼分析 GitHub 地址](https://github.com/liu844869663/mybatis-3)、[Mybatis-Spring 原始碼分析 GitHub 地址

SQL Server 2017 AlwaysOn AG 自動初始

see 個數 一起 配置 備份 日誌 創建 還原 初始化 技術背景在 SQL Server 2012 和 2014 中,初始化 SQL Server Always On 可用性組中的次要副本的唯一方法是使用備份、復制和還原。SQL Server 2016 引入了用於初始化次

python資料分析numpy初始

以下都用numpy的標準“import numpy as np” 1.numpy是同構資料多維容器,同構即資料型別相同 2.初始化: 2.1np.arange([start,] end [, step

Ant Design Vue Pro 專案實戰-專案初始

 寫在前面     時間真快,轉眼又是新的一年。隨著前後端技術的不斷更新迭代,尤其是前端,在目前前後端分離開發模式這樣的一個大環境下,互動性、相容性等傳統的開發模式已經顯得有些吃力。之前一直用的是react,隨著後面鉤子的加入更讓人愛不釋手,但是整個團隊需要更新技術,這裡選擇了

註冊中心 Eureka 原始碼解析 —— Eureka-Server 叢集同步

點選上方“芋道原始碼”,選擇“置頂公眾號”技術文章第一時間送達!原始碼精品專欄 摘要: 原創出處

Eureka 原始碼解析 —— 應用例項註冊發現註冊

// DiscoveryClient.javaboolean register() throws Throwable { logger.info(PREFIX + appPathIdentifier + ": registering service..."); EurekaHttpResponse&l

Eureka初始1

1. 基於1.X版本的原始碼ExampleEurekaService的main函式啟動。通過配置中介軟體Archaius獲取全域性通用配置例項,例項化MyDataCenterInstanceConfig,父類PropertiesInstanceConfig以及Abstract

Eureka客戶端初始4

10. 上接RetryableEurekaHttpClient#execute,繼續執行clientFactory.newClient(currentEndpoint);返回的是new RedirectingEurekaHttpClient(endpoint.getServi

Eureka服務端初始1

1. 服務啟動時會執行ServletContextListener即EurekaBootStrap,初始化通用配置的屬性,再初始化服務上下文initEurekaServerContext,最後儲存在ServletContext中 public void contextIni

Eureka服務端初始2

4. 註冊中心初始化registry.init(peerEurekaNodes); public void init(PeerEurekaNodes peerEurekaNodes) throws Exception { this.numberOfRepli

Eureka客戶端初始3

6. 根據配置clientConfig.shouldRegisterWithEureka()生成eurekaTransport的註冊客戶端工廠newRegistrationClientFactory static EurekaHttpClientFactory canoni

spring boot 原始碼解析2-SpringApplication初始

前言 我們生成一個spring boot 專案時,會自帶一個啟動類. 程式碼如下: @SpringBootApplication public class DemoApplication { public static void main(St

Spring IOC容器的初始-BeanDefinition的註冊

store erro pan customize 註冊 failed mono def override ---恢復內容開始--- 前言 在上一篇中有一處代碼是BeanDefiniton註冊的入口,我們回顧一下。 1.BeanDefiniton在IOC容器註冊 首先我