在上篇中已經講了 Eureka Server 的配置文件讀取。接下來講講 Eureka Client 的創建。每一個 eureka server 都是一個 eureka client,是用來和其他 eureka-server 節點注冊和通信的。
EurekaInstanceConfig & EurekaClientConfig
Instance 是實例的意思, EurekaInstanceConfig 就是 eureka client 的配置文件中的服務實例信息。
EurekaInstanceConfig instanceConfig = isCloud(ConfigurationManager.getDeploymentContext())
? new CloudInstanceConfig()
: new MyDataCenterInstanceConfig();
applicationInfoManager = new ApplicationInfoManager(
instanceConfig, new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());
EurekaClientConfig eurekaClientConfig = new DefaultEurekaClientConfig();
EurekaInstanceConfig 就是將 eureka-client.properties 文件中的服務實例信息加載到 ConfigManager 中,然后基于 EurekaInstanceConfig 對外暴露接口,并且提供配置項的默認值。
ApplicationInfoManager,包含了服務實例的信息、配置,作為服務實例管理的一個組件,由 EurekaInstanceConfig 和 InstanceInfo 構建完成,InstanceInfo 的創建是在 new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get()
中,用了構造器模式 LeaseInfo.Builder.newBuilder() 構造了一個復雜的代表一個服務實例的 InstanceInfo 對象。核心思想就是在 EurekaInstanceConfig 中讀取各種實例相關的配置信息,再構造了一些其他的對象,最終完成 InstanceInfo 對象的構建。
public synchronized InstanceInfo get() {
if (instanceInfo == null) {
// Build the lease information to be passed to the server based on config
LeaseInfo.Builder leaseInfoBuilder = LeaseInfo.Builder.newBuilder()
.setRenewalIntervalInSecs(config.getLeaseRenewalIntervalInSeconds())
.setDurationInSecs(config.getLeaseExpirationDurationInSeconds());
if (vipAddressResolver == null) {
vipAddressResolver = new Archaius1VipAddressResolver();
}
//代碼太長,省略其他代碼
}
}
DefaultEurekaClientConfig 就是和 DefaultEurekaServerConfig 一樣,讀取 erueka-client.properties 配置文件的內容。具體方法在 com.netflix.discovery.internal.util.initConfig() 中。最后都是交給 ConfigurationManager 管理。
EurekaInstanceConfig 和 EurekaClientConfig 雖然都是讀取的 erueka-client.propeties ,但是讀取的內容是不一樣的。
EurekaInstanceConfig 接口
EurekaClientConfig 接口
DiscoveryClient
DiscoveryClient 是創建 Erueka Client 的類,由 ApplicationInfoManager 和 EurekaClientConfig 組成。
eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig);
DiscoveryClient 代碼很長。
- appPathIdentifier,服務實例的標識符, appName,代表了一個服務名稱,但是一個服務可能部署多臺機器,每臺機器上部署的就是一個服務實例,如:serviceABC/001
appPathIdentifier = instanceInfo.getAppName() + "/" + instanceInfo.getId();
- 是否需要注冊到別的注冊中心。eurekaServer 有個配置:eureka.client.fetchRegistry,單機情況下為 false。false 表示自己就是注冊中心。職責就是維護服務實例,并不需要去檢索服務。
if (!config.shouldRegisterWithEureka() && !config.shouldFetchRegistry()) {}
- 支持調度的線程池。
scheduler = Executors.newScheduledThreadPool(2,
new ThreadFactoryBuilder()
.setNameFormat("DiscoveryClient-%d")
.setDaemon(true)
.build());
- 支持心跳的線程池。
heartbeatExecutor = new ThreadPoolExecutor(
1, clientConfig.getHeartbeatExecutorThreadPoolSize(), 0, TimeUnit.SECONDS,
new SynchronousQueue< Runnable >(),
new ThreadFactoryBuilder()
.setNameFormat("DiscoveryClient-HeartbeatExecutor-%d")
.setDaemon(true)
.build()
);
- 支持緩存刷新的線程池。
cacheRefreshExecutor = new ThreadPoolExecutor(
1, clientConfig.getCacheRefreshExecutorThreadPoolSize(), 0, TimeUnit.SECONDS,
new SynchronousQueue< Runnable >(),
new ThreadFactoryBuilder()
.setNameFormat("DiscoveryClient-CacheRefreshExecutor-%d")
.setDaemon(true)
.build()
);
- 支持底層的 eureka client 和 eureka server 進行通信的組件。
eurekaTransport = new EurekaTransport();
- 初始化調度任務。
initScheduledTasks();
總結
先創建了 EurekaInstanceConfig,基于 EurekaInstanceConfig 和 InstanceInfo 創建 ApplicationInfoManager,之后才創建 DiscoveryClient。
-
接口
+關注
關注
33文章
8694瀏覽量
151929 -
文件
+關注
關注
1文章
570瀏覽量
24823 -
代碼
+關注
關注
30文章
4828瀏覽量
69063 -
eureka
+關注
關注
0文章
4瀏覽量
1774
發布評論請先 登錄
相關推薦
請問while循環中是怎么調用tcp_client_senddata()和tcp_client_recv()發送接收數據的?
怎樣實現創建TCP Server后連接多個Client?
Symantec Client Security使用入門
Eureka的集群搭建方法-保證高可用
![<b class='flag-5'>Eureka</b>的集群搭建方法-保證高可用](https://file1.elecfans.com//web2/M00/A6/F9/wKgZomUMQZSAEMYQAADZpapAvR8085.png)
ApiBoot Logging整合Spring Cloud Eureka負載均衡上報日志
eureka優瑞家殺菌洗地機全球首發,清潔更專業、健康、高效!
LabVIEW Actor Framwork:邊學邊做server和client
![LabVIEW Actor Framwork:邊學邊做server和<b class='flag-5'>client</b>](https://file.elecfans.com/web2/M00/9B/08/pYYBAGQeT9WAWJnhAAcO9MedGJo046.png)
Eureka Server面向接口的方式讀取配置文件
![<b class='flag-5'>Eureka</b> Server面向接口的方式讀取配置文件](https://file1.elecfans.com/web2/M00/A9/33/wKgZomUjwlCAMsEpAAAqOGXZfFU548.jpg)
Spring Boot啟動 Eureka流程
![Spring Boot啟動 <b class='flag-5'>Eureka</b>流程](https://file1.elecfans.com/web2/M00/A7/86/wKgaomUkx7OAdMOGAAIBWIj8ao0506.jpg)
Eureka!NVIDIA 研究突破為機器人學習注入新動力
![<b class='flag-5'>Eureka</b>!NVIDIA 研究突破為機器人學習注入新動力](https://file1.elecfans.com/web2/M00/A9/EF/wKgaomU3IsaAV9WcAF5_59H8A50094.gif)
Eureka!NVIDIA 研究突破為機器人學習注入新動力
![<b class='flag-5'>Eureka</b>!NVIDIA 研究突破為機器人學習注入新動力](https://file1.elecfans.com//web2/M00/AC/09/wKgZomU4ywaAW1PmAAFtccdApf0157.jpg)
評論