经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
EurekaServer自动装配及启动流程解析
来源:cnblogs  作者:石玉军  时间:2019/10/12 9:29:03  对本文有异议

在开始本篇文章之前,我想你对SpringCloud和SpringBoot的基本使用已经比较熟悉了,如果不熟悉的话可以参考我之前写过的文章
本篇文章的源码基于SpringBoot2.0,SpringCloud的Finchley.RELEASE

@EnableEurekaServer注解

我们知道,在使用Eureka作为注册中心的时候,我们会在启动类中增加一个@EnableEurekaServer注解,这个注解我们是一个自定义的EnableXXX系列的注解,主要作用我们之前也多次提到了,就是引入配置类而已。看一下源码吧

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Import({EurekaServerMarkerConfiguration.class})
  5. public @interface EnableEurekaServer {
  6. }

引入了一个配置类EurekaServerMarkerConfiguration,看一下这个类的具体内容

  1. @Configuration
  2. public class EurekaServerMarkerConfiguration {
  3. @Bean
  4. public Marker eurekaServerMarkerBean() {
  5. return new Marker();
  6. }
  7. class Marker {
  8. }
  9. }

现在看这里好像难以理解,这是啥意思,搞个空的类干啥的,不要着急,接着往下看

自动装配

既然注解上没有找到我们想要的东西,那么就看一下spring.factories文件吧,这里自动配置的实现类是EurekaServerAutoConfiguration

由于这个类涉及的代码实在是太多了,这里就不贴了,咱们直接来解析这个类:

1. 引入EurekaServerInitializerConfiguration类

看名字就知道了这个类是负责Eureka的初始化工作的,这个类实现了SmartLifecycle接口,所以在spring初始化和销毁的时候,就会分别调用它的start和stop方法

首先看一下start方法

  1. public void start() {
  2. new Thread(new Runnable() {
  3. @Override
  4. public void run() {
  5. try {
  6. //启动EurekaServer
  7. eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);
  8. log.info("Started Eureka Server");
  9. publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig()));
  10. EurekaServerInitializerConfiguration.this.running = true;
  11. publish(new EurekaServerStartedEvent(getEurekaServerConfig()));
  12. }
  13. catch (Exception ex) {
  14. // Help!
  15. log.error("Could not initialize Eureka servlet context", ex);
  16. }
  17. }
  18. }).start();
  19. }

这个代码好像比较直接了当啊,直接就起个线程启动了EurekaServer,然后发布了一些启动事件,来看启动的过程吧

  1. public void contextInitialized(ServletContext context) {
  2. try {
  3. //初始化执行环境
  4. initEurekaEnvironment();
  5. //初始化上下文
  6. initEurekaServerContext();
  7. context.setAttribute(EurekaServerContext.class.getName(), this.serverContext);
  8. }
  9. catch (Throwable e) {
  10. log.error("Cannot bootstrap eureka server :", e);
  11. throw new RuntimeException("Cannot bootstrap eureka server :", e);
  12. }
  13. }

这里一共包含初始化环境和初始化上下文两个分支

初始化执行环境

这个不是很重要,可以过滤掉

  1. protected void initEurekaEnvironment() throws Exception {
  2. log.info("Setting the eureka configuration..");
  3. //AWS相关的东西,可以忽略
  4. String dataCenter = ConfigurationManager.getConfigInstance()
  5. .getString(EUREKA_DATACENTER);
  6. if (dataCenter == null) {
  7. log.info(
  8. "Eureka data center value eureka.datacenter is not set, defaulting to default");
  9. ConfigurationManager.getConfigInstance()
  10. .setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, DEFAULT);
  11. }
  12. else {
  13. ConfigurationManager.getConfigInstance()
  14. .setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, dataCenter);
  15. }
  16. //设置 Eureka 环境,默认为test
  17. String environment = ConfigurationManager.getConfigInstance()
  18. .getString(EUREKA_ENVIRONMENT);
  19. if (environment == null) {
  20. ConfigurationManager.getConfigInstance()
  21. .setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, TEST);
  22. log.info(
  23. "Eureka environment value eureka.environment is not set, defaulting to test");
  24. }
  25. else {
  26. ConfigurationManager.getConfigInstance()
  27. .setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, environment);
  28. }
  29. }
初始化上下文
  1. protected void initEurekaServerContext() throws Exception {
  2. // 设置json与xml序列化工具
  3. JsonXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(),
  4. XStream.PRIORITY_VERY_HIGH);
  5. XmlXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(),
  6. XStream.PRIORITY_VERY_HIGH);
  7. if (isAws(this.applicationInfoManager.getInfo())) {
  8. this.awsBinder = new AwsBinderDelegate(this.eurekaServerConfig,
  9. this.eurekaClientConfig, this.registry, this.applicationInfoManager);
  10. this.awsBinder.start();
  11. }
  12. EurekaServerContextHolder.initialize(this.serverContext);
  13. log.info("Initialized server context");
  14. // 同步Eureka集群数据
  15. int registryCount = this.registry.syncUp();
  16. this.registry.openForTraffic(this.applicationInfoManager, registryCount);
  17. // 注册监控统计信息
  18. EurekaMonitors.registerAllStats();
  19. }

这个方法中同步集群数据和注册监控信息都涉及的内容比较多,所以本篇文章就不再展开了,请关注我留意后续文章

@ConditionalOnBean({Marker.class})

看到这里就揭开了开篇@EnableEurekaServer注解注入的那个bean的含义了。也就是说如果咱们的启动类没有使用@EnableEurekaServer注解的话,这个自动配置类就不会执行,那也就没有Eureka的事了

@EnableConfigurationProperties({EurekaDashboardProperties.class, InstanceRegistryProperties.class})

深入这个注解发现这个还是使用的@Import注解的机制引入了两个类,这个注解在之前的源码解析文章中也多次提到了,这里就不展开了

EurekaDashboardProperties这个类比较简单,主要是Eureka的控制台的相关配置

  1. //控制台默认路径
  2. private String path = "/";
  3. //是否开启控制台
  4. private boolean enabled = true;

InstanceRegistryProperties,这个类是控制Eureka的注册时的配置信息

  1. //每分钟续约次数
  2. @Value("${eureka.server.expectedNumberOfRenewsPerMin:1}")
  3. private int expectedNumberOfRenewsPerMin = 1;
  4. //默认打开的通信数量
  5. @Value("${eureka.server.defaultOpenForTrafficCount:1}")
  6. private int defaultOpenForTrafficCount = 1;
@PropertySource("classpath:/eureka/server.properties")

相信大家比较熟悉这个注解,加载Eureka的配置文件而已

配置文件中也仅仅只包含这个信息

  1. spring.http.encoding.force=false
自动注入的bean

EurekaServerAutoConfiguration类上几个注解就解析完了,接着看一下这个类中注入的几个比较重要的类吧

配置类EurekaServerConfigBeanConfiguration

EurekaServerConfig
如果当前应用允许注册到其他Eureka服务中时,也就是属性eureka.client.fetch-registry为true时。就设置属性registrySyncRetries的值为5,这个属性的意思是当Eureka服务器启动时尝试去获取集群里其他服务器上的注册信息的次数

EurekaController

这个就是Eureka自己的controller了,控制台的相关信息就是从这里获取的

ServerCodecs

设置Eureka的序列化工具

PeerAwareInstanceRegistry

集群注册信息同步相关的类,请期待后续深入解析文章

FilterRegistrationBean

EurekaServer接受请求的一个拦截器,感兴趣的同学可以研究一下

原文链接:http://www.cnblogs.com/zhixiang-org-cn/p/11657756.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号