在上篇中已经讲了 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文章
7970浏览量
149243 -
文件
+关注
关注
1文章
541浏览量
24467 -
代码
+关注
关注
30文章
4601浏览量
67335 -
eureka
+关注
关注
0文章
4浏览量
1751
发布评论请先 登录
相关推荐
请问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负载均衡上报日志
如何使用kubernetes client-go实践一个简单的与K8s交互过程
![如何使用kubernetes <b class='flag-5'>client</b>-go实践一个简单的与K8s交互过程](https://file.elecfans.com/web1/M00/DE/5F/pIYBAGAYxO6AH-XxAAB0jY76Iww004.jpg)
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)
I2C控制器节点创建
![I2C控制器节点<b class='flag-5'>创建</b>](https://file1.elecfans.com/web2/M00/8D/80/wKgZomS7h5eAJbJHAADKTFyWHg4734.jpg)
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/AC/09/wKgZomU4ywaAW1PmAAFtccdApf0157.jpg)
评论