SpringClound Eureka 1.9.12 版本源码解析

这篇具有很好参考价值的文章主要介绍了SpringClound Eureka 1.9.12 版本源码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Eureka启动,原生启动与SpringCloudEureka启动异同

我们先看看作为原生的EurekaServer启动的过程,作为一个Servlet应用,他的启动入口就是他的主要ServletContextListener类(这里是EurekaBootStrap)的contextInitialized方法
EurekaServerBootstrap

@Override
public void contextInitialized(ServletContextEvent event) {
try {
initEurekaEnvironment();
initEurekaServerContext();

    ServletContext sc = event.getServletContext();
    sc.setAttribute(EurekaServerContext.class.getName(), serverContext);
} catch (Throwable e) {
    logger.error("Cannot bootstrap eureka server :", e);
    throw new RuntimeException("Cannot bootstrap eureka server :", e);
}

}

可以看出主要做了两件事,initEurekaEnvironment()与initEurekaServerContext()
对于initEurekaEnvironment()只是初始化一些必要的环境变量,由于Eureka配置基于Spring的配置中间件Archaius,这些环境变量都是针对这个配置中间件使用的。
initEurekaServerContext()是我们重点需要关心的,它初始化了EurekaServer需要的所有组件:

protected void initEurekaServerContext() throws Exception {
EurekaServerConfig eurekaServerConfig = new DefaultEurekaServerConfig();

//设置json与xml序列化工具
JsonXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
XmlXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
logger.info("Initializing the eureka client...");
logger.info(eurekaServerConfig.getJsonCodecName());
ServerCodecs serverCodecs = new DefaultServerCodecs(eurekaServerConfig);


ApplicationInfoManager applicationInfoManager = null;

//初始化EurekaClient,EurekaClient用来与其他EurekaServer进行交互
//有可能通过guice初始化Eureka,这时eurekaClient和ApplicationInfoManager通过依赖注入先被初始化
if (eurekaClient == null) {
    EurekaInstanceConfig instanceConfig = isCloud(ConfigurationManager.getDeploymentContext())
            ? new CloudInstanceConfig()
            : new MyDataCenterInstanceConfig();

    applicationInfoManager = new ApplicationInfoManager(
            instanceConfig, new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());

    EurekaClientConfig eurekaClientConfig = new DefaultEurekaClientConfig();
    eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig);
} else {
    applicationInfoManager = eurekaClient.getApplicationInfoManager();
}

//初始化PeerAwareInstanceRegistry, 这个类里面的方法就是与集群内其他EurekaServer实例保持业务同步的机制
PeerAwareInstanceRegistry registry;
if (isAws(applicationInfoManager.getInfo())) {
    registry = new AwsInstanceRegistry(
            eurekaServerConfig,
            eurekaClient.getEurekaClientConfig(),
            serverCodecs,
            eurekaClient
    );
    awsBinder = new AwsBinderDelegate(eurekaServerConfig, eurekaClient.getEurekaClientConfig(), registry, applicationInfoManager);
    awsBinder.start();
} else {
    registry = new PeerAwareInstanceRegistryImpl(
            eurekaServerConfig,
            eurekaClient.getEurekaClientConfig(),
            serverCodecs,
            eurekaClient
    );
}

//初始化PeerEurekaNodes,里面有定时维护Eureka集群的业务逻辑
PeerEurekaNodes peerEurekaNodes = getPeerEurekaNodes(
        registry,
        eurekaServerConfig,
        eurekaClient.getEurekaClientConfig(),
        serverCodecs,
        applicationInfoManager
);


//初始化EurekaServer上下文
serverContext = new DefaultEurekaServerContext(
        eurekaServerConfig,
        serverCodecs,
        registry,
        peerEurekaNodes,
        applicationInfoManager
);

EurekaServerContextHolder.initialize(serverContext);

serverContext.initialize();
logger.info("Initialized server context");

//从其他节点中读取注册信息,并开放服务注册
// Copy registry from neighboring eureka node
int registryCount = registry.syncUp();
registry.openForTraffic(applicationInfoManager, registryCount);

// Register all monitoring statistics.
EurekaMonitors.registerAllStats();

}

总结下来,总共如下几点:

1.初始化并设置序列化反序列化工具
2.初始化通信客户端EurekaClient
3.初始化集群通信类PeerAwareInstanceRegistry与PeerEurekaNodes
4.初始化EurekaServer上下文serverContext
5.从其他节点中读取注册信息,并开放服务注册

然后,由于原生的EurekaServer利用Jersey框架初始化restApi,这里还有:
6.载入Jersey,初始化Restful服务api

对于胶水代码,实现了大致同样的但是略微有些区别的功能:
一、 Server 有哪些功能:

提供服务注册功能。
消费者可以获取服务列表。
服务可以续约。
Server 集群之间的数据共享

二、 提供服务注册功能

我们使用 EurekaServer 的时候,需要在启动类上加入 @EnableEurekaServer注解,这个注解肯定就是我们研究的入口。

EnableEurekaServer 类:

/**

  • Annotation to activate Eureka Server related configuration.
  • {@link EurekaServerAutoConfiguration}
  • @author Dave Syer
  • @author Biju Kunjummen

*/

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EurekaServerMarkerConfiguration.class)
public @interface EnableEurekaServer {

}

EurekaServerAutoConfiguration

@Configuration
@Import(EurekaServerInitializerConfiguration.class)
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
@EnableConfigurationProperties({ EurekaDashboardProperties.class,
InstanceRegistryProperties.class })
@PropertySource(“classpath:/eureka/server.properties”)
public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter{

}

EurekaServerInitializerConfiguration 由于实现了SmartLifecycle, 初始化启动start()方法; 额外新创建一个线程初始化initEurekaServerContext() , 发布事件等工作

@Configuration
public class EurekaServerInitializerConfiguration
implements ServletContextAware, SmartLifecycle, Ordered {
@Override
public void start() {
new Thread(new Runnable() {
@Override
public void run() {
try {
// TODO: is this class even needed now?
eurekaServerBootstrap.contextInitialized(
EurekaServerInitializerConfiguration.this.servletContext);
log.info(“Started Eureka Server”);

				publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig()));
				EurekaServerInitializerConfiguration.this.running = true;
				publish(new EurekaServerStartedEvent(getEurekaServerConfig()));
			}
			catch (Exception ex) {
				// Help!
				log.error("Could not initialize Eureka servlet context", ex);
			}
		}
	}).start();
}

}

EurekaServerAutoConfiguration 中注入EurekaServerContext

@Bean
public EurekaServerContext eurekaServerContext(ServerCodecs serverCodecs,
		PeerAwareInstanceRegistry registry, PeerEurekaNodes peerEurekaNodes) {
	return new DefaultEurekaServerContext(this.eurekaServerConfig, serverCodecs,
			registry, peerEurekaNodes, this.applicationInfoManager);
}

在初始化化DefaultEurekaServerContext 类的时候,会初始化initialize()方法,是因为在此方法上面@PostConstruct注解. peerEurekaNodes.start() 中。使用单定时任务线程池,维护eureka节点文章来源地址https://www.toymoban.com/news/detail-849030.html

@PostConstruct
@Override
public void initialize() {
    logger.info("Initializing ...");
    peerEurekaNodes.start();
    try {
        registry.init(peerEurekaNodes);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    logger.info("Initialized");
}

到了这里,关于SpringClound Eureka 1.9.12 版本源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka)

    Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka) 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 如有错误恳请大家批评指正,与大家共同学习、一起成长,万分感谢。 一、构建环境 Spring Cloud 的构建工具可以使用 Maven 或 Gradle ,但 Ma

    2024年02月09日
    浏览(37)
  • Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)

    这篇文章先讲述一下Eureka的应用场景、代码实现案例,多个服务模块注册到Euraka中,服务之间的调用实现我会再下一篇文章中进行讲解! Eureka主要是做: 注册发现中心 服务注册与发现的组件 说到Eureka不得不提到了CAP,那么什么是CAP原则呢,下面一起来看下! CAP 原则: 又称

    2024年02月15日
    浏览(29)
  • Spring Cloud学习笔记:Eureka简介,Eureka简单样例

    这是本人学习的总结,主要学习资料如下 - 马士兵教育 Eureka 是 SpringCloud Nexflix 的核心子模块,其中包含 Server 和 Client 。 Server 提供服务注册,存储所有可用服务节点。 Client 用于简化和 Server 的通讯复杂度。 下面是 Eureka 的简单架构图 每一个服务节点需要在 Eureka Server 中注册

    2024年04月16日
    浏览(33)
  • 2-Spring cloud之Eureka快速剔除失效服务 以及 Eureka原理

    添加如下配置: 每个服务的yml配置如下: 如下: 更多可以参考下面的文章,说的不错 Eureka服务端挂了,为什么微服务还能调通?(原理分析).

    2024年02月13日
    浏览(43)
  • spring cloud 之 eureka

    Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理,SpringCloud将它集成在其子项目spring-cloud-netflix中 在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上 强调一下,eureka从2

    2024年02月12日
    浏览(31)
  • spring eureka集群相关问题

    EurekaServer节点启动的时候,DefaultEurekaServerContext.init()方法调用PeerEurekaNodes.start()方法,start方法中resolvePeerUrls()会从配置文件读取serviceUrl属性值获得集群最新节点信息,通过updatePeerEurekaNodes()方法将最新节点信息更新到PeerEurekaNodes类的属性peerEurekaNodes和peerEurekaNodeUrls中。 PeerE

    2024年01月25日
    浏览(36)
  • 深入解析Eureka和Nacos的区别

    Eureka采用CS架构,由服务注册中心Eureka Server和服务提供者/消费者Eureka Client组成。Nacos采用高可用的P2P设计(无主节点),所有的server节点都是同等作用,支持AP和CP两种模式。 Eureka基于HTTP RESTful API进行通信。Nacos同时支持HTTP和TCP两种通信方式,TCP方式效率更高,适用于服务间通信。

    2024年02月10日
    浏览(30)
  • 解决Eureka与Springcloud的版本匹配问题

    学习Eureka的时候开始就被Springcloud和Eureka的版本匹配问题搞吐了,一直报错 报错如下: 网上大家说这个问题就是Springcloud和Netflix提供的Eureka的版本有冲突导致的 问题是找了半天也没有找到 版本匹配表 ,有个办法是让maven自动匹配两者版本 结果我在dependencyManagement中加入了自

    2023年04月11日
    浏览(36)
  • Spring Cloud Eureka面试题

    序号 内容 链接地址 1 Java面试题 https://blog.csdn.net/golove666/article/details/137360180 2 JVM面试题 https://blog.csdn.net/golove666/article/details/137245795 3 Servlet面试题 https://blog.csdn.net/golove666/article/details/137395779 4 Maven面试题 https://blog.csdn.net/golove666/article/details/137365977 5 Git面试题 https://blog.csdn.n

    2024年04月27日
    浏览(33)
  • Eureka(F版本)教程二 服务消费者

    service-ribbon 0.0.1-SNAPSHOT service-ribbon jar Demo project for Spring Boot java.version1.8/java.version spring-cloud.versionGreenwich.SR2/spring-cloud.version org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-ribbon org.springframewor

    2024年04月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包