EurekaServerAutoConfiguration
2021-05-16 12:30:19 0 举报
AI智能生成
EurekaServer 自动化配置
作者其他创作
大纲/内容
EurekaServerAutoConfiguration
源码
@Configuration 首先当前类是一个配置类
@Import(EurekaServerInitializerConfiguration.class)
核心方法: start()
eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);
@Autowired\tprivate EurekaServerBootstrap eurekaServerBootstrap;
核心方法:public void contextInitialized(ServletContext context)
initEurekaEnvironment();
initEurekaServerContext();
先认识一下XStream 类
官方源码解释说明
JsonXStream
JsonXStream extends XStream
XmlXStream
XmlXStream extends XStream
this.applicationInfoManager.getInfo()
ApplicationInfoManager
我们可以用来干什么呢?
我们可以在EurekaServer 中
pom 中添加web 的依赖
写一个Controller 方法
我们可以看到 我们可以通过它获取服务的配置对象,以及服务的详细信息对象,以及设置服务的状态,添加一个监听器等等
EurekaServerContextHolder.initialize(this.serverContext);
方法源码
源码注释说明
// Copy registry from neighboring eureka node\t\tint registryCount = this.registry.syncUp();
说明: 从相邻的eureka节点复制注册表
从 syncUp() 方法的代码中可以知道是30s一次
方法代码
源码注释
这个类就是EurekaServer的启动引导类
start() 方法中用到了 servletContext
这个值是在什么时候被设置进来的?
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
根据源码注释可知,该注解的作用是往IOC 容器中创建一个Marker bean 用来标识 EurekaServerAutoConfiguration 配置是否已经被激活,也就是说如果IOC 容器中存在这个bean 那么该配置就已经被加载激活过,否则则没有。
@PropertySource(\"classpath:/eureka/server.properties\")
@Autowired\tprivate ApplicationInfoManager applicationInfoManager;
EurekaClientAutoConfiguration 配置类 中实例化的
@Autowired\tprivate EurekaServerConfig eurekaServerConfig;
实例化方法
@Configuration\tprotected static class EurekaServerConfigBeanConfiguration {\t\t@Bean\t\t@ConditionalOnMissingBean\t\tpublic EurekaServerConfig eurekaServerConfig(EurekaClientConfig clientConfig) {\t\t\tEurekaServerConfigBean server = new EurekaServerConfigBean();\t\t\tif (clientConfig.shouldRegisterWithEureka()) {\t\t\t\t// Set a sensible default if we are supposed to replicate\t\t\t\tserver.setRegistrySyncRetries(5);\t\t\t}\t\t\treturn server;\t\t}\t}
@Autowired\tprivate EurekaClientConfig eurekaClientConfig;
EurekaClientAutoConfiguration 配置类 中实例化的
@Autowired\tprivate EurekaClient eurekaClient;
@Autowired\tprivate InstanceRegistryProperties instanceRegistryProperties;
实例化
InstanceRegistryProperties.class
@ConfigurationProperties
印象笔记:@ConfigurationProperties 注解使用姿势,这一篇就够了
@EnableConfigurationProperties
@Import(EnableConfigurationPropertiesImportSelector.class)
这个注解 可以接收一个vale 数组 并且把该数组的 class 注册进IOC 容器
那我们分析一下这个注解是怎么起作用的
首先是系统启动加载了:@EnableAutoConfiguration
@EnableAutoConfiguration @Import 了EnableAutoConfigurationImportSelector.class
EnableAutoConfigurationImportSelector 类的 selectImports 会获取到:ConfigurationPropertiesAutoConfiguration 这个类
核心
org.springframework.boot.context.properties.EnableConfigurationPropertiesImportSelector.ConfigurationPropertiesBeanRegistrar#registerBeanDefinitions
把注解value 进行注入
@Bean\tpublic HasFeatures eurekaServerFeature()
核心代码
@Bean\tpublic HasFeatures eurekaServerFeature() {\t\treturn HasFeatures.namedFeature(\"Eureka Server\
就是创建了一个 名称和EurekaServerAutoConfiguration key value 对应关系的一个对象
我们可以自己 添加映射关系
EurekaClientAutoConfiguration 配置类 里面也有这么类型的一个对象
@Bean\tpublic HasFeatures eurekaFeature() {\t\treturn HasFeatures.namedFeature(\"Eureka Client\
HasFeatures
@Configuration\tprotected static class EurekaServerConfigBeanConfiguration
@Configuration\tprotected static class EurekaServerConfigBeanConfiguration {\t\t@Bean\t\t@ConditionalOnMissingBean\t\tpublic EurekaServerConfig eurekaServerConfig(EurekaClientConfig clientConfig) {\t\t\tEurekaServerConfigBean server = new EurekaServerConfigBean();\t\t\tif (clientConfig.shouldRegisterWithEureka()) {\t\t\t\t// Set a sensible default if we are supposed to replicate\t\t\t\tserver.setRegistrySyncRetries(5);\t\t\t}\t\t\treturn server;\t\t}\t}
就是创建了EurekaServerConfig 的实例对象
@Bean\t@ConditionalOnProperty(prefix = \"eureka.dashboard\
这个实际上就是Eureka 自带的一个Controller 类,对我提供暴露了一下接口
EurekaController
@Bean\tpublic ServerCodecs serverCodecs()
创建了一个编码解码器
@Bean\tpublic PeerAwareInstanceRegistry peerAwareInstanceRegistry
初始化集群注册表
初始化集群节点集合
基于EurekaServer配置 注册表 集群节点集合 以及服务初始化EurekaServer上下文
核心方法
这个是 EurekaServer 启动初始化的入口
流程
我们EurekaServerAutoConfiguration 配置类中的Bean 全部初始化之后
EurekaServerAutoConfiguration 的注解 @Import(EurekaServerInitializerConfiguration.class) 实现了SmartLifecycle 实现了这个接口的 会在项目启动后,调用start() 方法
start() 方法中调用了eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);
初始化EurekaServer
int registryCount = this.registry.syncUp();
从相邻的eureka节点复制注册表
Applications apps = eurekaClient.getApplications();
1. 修改eureka状态为up2. 开启一个定时任务,清理60s没有 续约实例
primeAwsReplicas(applicationInfoManager);
super.postInit();
publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig()))
发布注册中心启动事件
EurekaServerInitializerConfiguration.this.running = true
标记EurekaServer 处于运行中
publish(new EurekaServerStartedEvent(getEurekaServerConfig()));
注册中心服务启动事件
@Bean\tpublic FilterRegistrationBean jerseyFilterRegistration(\t\t\tjavax.ws.rs.core.Application eurekaJerseyApp)
实现过滤器的一种方式
实现过滤器有两种方式
通过FilterRegistrationBean实例注册
通过@WebFilter注解生效
第一种相对于第二种的优点是,可以自己设置过滤器之间的优先级
@Bean\tpublic FilterRegistrationBean traceFilterRegistration(\t\t\t@Qualifier(\"webRequestLoggingFilter\") Filter filter)
EurekaClientAutoConfiguration 是 springboot 启动的时候 org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports 方法加载的
排序之后 我们发现 是先加载 EurekaClientAutoConfiguration 然后再加载EurekaServerAutoConfiguration
EurekaServerAutoConfiguration 配置类的很多@Autowired 注入的对象都是 在 EurekaClientAutoConfiguration 中实例化的
1
这两个是
2
EurekaClientConfigBean
我们可以通过打断点发现 这个return 的client 和EurekaServerAutoConfiguration 注入的对象是同一个
0 条评论
回复 删除
下一页