现在我们来开始Eureka源码分析,我们都知道,现在微服务是主流的架构,那么在微服务里用的比较多的框架就是dubbo和spring cloud了,而我们知道dubbbo是用zookeeper作为服务注册中心的,而spring cloud就是用eureka作为服务注册和发现中心。我们就来分析一下eureka是怎么实现服务的注册和发现的。
先从eureka的配置开始,eureka client的配置是由EurekaClientConfig类实现的。默认是DefaultEurekaClientConfig。我们先来看一下DefaultEurekaClientConfig的类的结构
![](https://img.haomeiwen.com/i14842596/33e4616c0da8b24f.png)
我们可以看到,DefaultEurekaClientConfig实现了EurekaClientConfig接口,由DefaultEurekaClientConfigProvider工厂类来生产的。我们再来看一下DefaultEurekaClientConfig的实现
/**
* 命名空间
*/
private final String namespace;
/**
* 配置文件对象
*/
private final DynamicPropertyFactory configInstance;
/**
* HTTP 传输配置
*/
private final EurekaTransportConfig transportConfig;
public DefaultEurekaClientConfig() {
this(CommonConstants.DEFAULT_CONFIG_NAMESPACE);
}
public DefaultEurekaClientConfig(String namespace) {
// 设置 namespace,为 "." 结尾
this.namespace = namespace.endsWith(".")
? namespace
: namespace + ".";
// 初始化 配置文件对象
this.configInstance = Archaius1Utils.initConfig(CommonConstants.CONFIG_FILE_NAME);
// 创建 HTTP 传输配置
this.transportConfig = new DefaultEurekaTransportConfig(namespace, configInstance);
}
再来分析下DefaultEurekaClientConfig都有哪些方法
-
直接配合 Eureka-Server URL 相关
-
#getEurekaServerServiceUrls()
: Eureka-Server 的 URL 集合。
-
-
发现:从 Eureka-Server 获取注册信息相关
-
#shouldFetchRegistry()
:是否从 Eureka-Server 拉取注册信息。 -
#getRegistryFetchIntervalSeconds()
:从 Eureka-Server 拉取注册信息频率,单位:秒。默认:30 秒。 -
#shouldFilterOnlyUpInstances()
:是否过滤,只获取状态为开启( Up )的应用实例集合。 -
#fetchRegistryForRemoteRegions()
:TODO[0009]:RemoteRegionRegistry -
#getCacheRefreshExecutorThreadPoolSize()
:注册信息缓存刷新线程池大小。 -
#getCacheRefreshExecutorExponentialBackOffBound()
:注册信息缓存刷新执行超时后的延迟重试的时间。 -
#getRegistryRefreshSingleVipAddress()
:只获得一个vipAddress
对应的应用实例们的注册信息。
-
-
注册:向 Eureka-Server 注册自身服务
-
#shouldRegisterWithEureka()
:是否向 Eureka-Server 注册自身服务。 -
#shouldUnregisterOnShutdown()
:是否向 Eureka-Server 取消注册自身服务,当进程关闭时。 -
#getInstanceInfoReplicationIntervalSeconds()
:向 Eureka-Server 同步应用实例信息变化频率,单位:秒。 -
#getInitialInstanceInfoReplicationIntervalSeconds()
:向 Eureka-Server 同步应用信息变化初始化延迟,单位:秒。 -
#getBackupRegistryImpl()
:获取备份注册中心实现类。当 Eureka-Client 启动时,无法从 Eureka-Server 读取注册信息(可能挂了),从备份注册中心读取注册信息。目前 Eureka-Client 未提供合适的实现。 -
#getHeartbeatExecutorThreadPoolSize()
:心跳执行线程池大小。 -
#getHeartbeatExecutorExponentialBackOffBound()
:心跳执行超时后的延迟重试的时间。
-
再来看下DefaultEurekaClientConfigProvider的实现
public synchronized EurekaClientConfig get() {
if (config == null) {
config = (namespace == null)
? new DefaultEurekaClientConfig()
: new DefaultEurekaClientConfig(namespace);
// TODO: Remove this when DiscoveryManager is finally no longer used
DiscoveryManager.getInstance().setEurekaClientConfig(config);
}
return config;
}
接下来我们再来介绍一个类DefaultEurekaTransportConfig,这个类实现了EurekaTransportConfig接口,是基于文件配置和网络传输的配置实现类。来看下具体的实现
/**
* 命名空间
*/
private final String namespace;
/**
* 配置文件对象
*/
private final DynamicPropertyFactory configInstance;
public DefaultEurekaTransportConfig(String parentNamespace, DynamicPropertyFactory configInstance) {
// 命名空间
this.namespace = parentNamespace == null
? SUB_NAMESPACE
: (parentNamespace.endsWith(".")
? parentNamespace + SUB_NAMESPACE
: parentNamespace + "." + SUB_NAMESPACE);
// 配置文件对象
this.configInstance = configInstance;
}
DefaultEurekaClinetConfig的分析就到这里了。
网友评论