註冊中心 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 自身初始化過程中,涉及到主要物件如下圖:
建立 EurekaInstanceConfig物件
使用 EurekaInstanceConfig物件 建立 InstanceInfo物件
使用 EurekaInstanceConfig物件 + InstanceInfo物件 建立 ApplicationInfoManager物件
建立 EurekaClientConfig物件
使用 ApplicationInfoManager物件 + EurekaClientConfig物件 建立
考慮到整個初始化的過程中涉及的配置特別多,拆分成三篇文章:
【本文】(一)EurekaInstanceConfig
(二)EurekaClientConfig
(三)EurekaClient
下面我們來看看每個類的實現。
推薦 Spring Cloud 書籍:
請支援正版。下載盜版,等於主動編寫低階 BUG 。
程式猿DD —— 《Spring Cloud微服務實戰》
周立 —— 《Spring Cloud與Docker微服務架構實戰》
兩書齊買,京東包郵。
2. EurekaInstanceConfig
com.netflix.appinfo.EurekaInstanceConfig
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容器註冊
首先我