`
357029540
  • 浏览: 735625 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论
阅读更多

         前面我们了解完了eureka client的源码,我们接下来了解下server端的源码,server端主要是用于服务的发现,高可用,客户端异常如何实现自我保护机制,我们还是首先通过META-INFO下的spring.factories了解到入口类是EurekaServerAutoConfiguration,通过下图可以看到该类的结构如下


   在类中实现了很多bean的初始化,下面我们看下它是如何实现高可用的。

   进入到EurekaServerContext对应的bean方法中,它返回了一个默认的DefaultEurekaServerContext类,进入到该类可以立即看到它实现了一个initialize()方法,在这个方法中调用了PeerEurekaNodes类的 start()方法,这里需要说明的是因为eureka是C(最终一致性)A(可用性)P(分区容错性)理论中的AP,因此各个服务节点是平等的,没有主从节点的说法,进入到start()方法它有这样一段代码

updatePeerEurekaNodes(resolvePeerUrls());
Runnable peersUpdateTask = new Runnable() {
    @Override
    public void run() {
        try {
            updatePeerEurekaNodes(resolvePeerUrls());
        } catch (Throwable e) {
        .....
        }
    }
};
taskExecutor.scheduleWithFixedDelay(
    peersUpdateTask,
    serverConfig.getPeerEurekaNodesUpdateIntervalMs(),
    serverConfig.getPeerEurekaNodesUpdateIntervalMs(),
    TimeUnit.MILLISECONDS
);

   resolvePeerUrls()方法通过去获取eureka.client.serviceUrl的配置服务端地址列表,然后将该列表传递给updatePeerEurekaNodes()方法,我们看下updatePeerEurekaNodes()方法

Set<String> toShutdown = new HashSet<>(peerEurekaNodeUrls);
toShutdown.removeAll(newPeerUrls);
Set<String> toAdd = new HashSet<>(newPeerUrls);
toAdd.removeAll(peerEurekaNodeUrls);

if (toShutdown.isEmpty() && toAdd.isEmpty()) { // No change
    return;
}

// Remove peers no long available
List<PeerEurekaNode> newNodeList = new ArrayList<>(peerEurekaNodes);

if (!toShutdown.isEmpty()) {
    ...
    int i = 0;
    while (i < newNodeList.size()) {
        PeerEurekaNode eurekaNode = newNodeList.get(i);
        if (toShutdown.contains(eurekaNode.getServiceUrl())) {
            newNodeList.remove(i);
            eurekaNode.shutDown();
        } else {
            i++;
        }
    }
}
// Add new peers
if (!toAdd.isEmpty()) {
    ...
    for (String peerUrl : toAdd) {
      newNodeList.add(createPeerEurekaNode(peerUrl));
    }
}

this.peerEurekaNodes = newNodeList;
this.peerEurekaNodeUrls = new HashSet<>(newPeerUrls);

 

     在方法中使用了toShutdown和toAdd的2个set变量,toShutdown初始化的数据是已经存在过的节点数据url地址,它把现有的节点数据删除,那么剩下的就是需要删除的节点数据了,而toAdd的初始化数据是现有的节点数据url地址,它把已经存在的节点数据删除,那么剩下的就是新增的节点数据了,接下来初始化newNodeList的节点数据,删除满足在toShutdown的set集合中url地址对应的节点,同时关闭节点相关的操作,对于新增的节点,则先通过去创建一个HttpReplicationClient对象,该对象是用于向其他服务端的注册的jersy对象,然后再创建一个PeerEurekaNode对象,然后保存到newNodeList的节点,最后给全局对象进行赋值操作,该全局对象在前面已经提到过作用。

     通过以上的分析我们就明白了eureka的服务发现和服务高可用的状态的实现,接下来文章我们在分析其他的实现。

  • 大小: 61.2 KB
0
0
分享到:
评论

相关推荐

    Spring Cloud Eureka源码分析

    《Spring Cloud Eureka源码分析》 Spring Cloud Eureka是Netflix公司开源的一个服务发现组件,它是基于REST的服务,用于在分布式系统中定位服务,以实现负载均衡和中间层服务器的故障转移。Eureka的设计目标是提供...

    Spring Cloud Eureka源码分析.pdf

    为什么要看源码: 1、提升技术功底:学习源码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提 升自己的技术功底 2、深度掌握技术框架:源码看多了,对于一个新技术或框架的掌握速度会有...

    基于spring cloud项目源码源码.rar

    1. Eureka源码:研究Eureka的工作机制,包括服务注册、心跳机制、服务发现等,理解如何维护服务实例的健康状态。 2. Ribbon源码:查看Ribbon如何根据服务发现的信息选择合适的服务器,并实现负载均衡策略。 3. ...

    狂神Spring Cloud源码

    3. `springcloud-consumer-hystrix-dashboard`可能是一个使用Hystrix Dashboard的消费者服务,用于监控服务的运行状态和熔断情况。 4. `springcloud-Eurake-7001`可能是Eureka服务器的实例,负责服务注册与发现,...

    spring cloud eureka集群模拟源码实现

    你可以在这个项目的基础上,按照上述步骤和源码分析,扩展到多节点的Eureka集群。 总的来说,构建Spring Cloud Eureka集群是一项关键任务,它涉及到服务注册、发现、健康检查和治理等多个方面。通过源码实现,不仅...

    spring-cloud实战源码

    《Spring Cloud实战源码》是针对Java开发者的一本深度指南,旨在帮助读者全面理解并熟练掌握Spring Cloud框架的使用和核心原理。Spring Cloud是构建分布式系统的服务发现、配置管理、负载均衡、熔断机制等解决方案的...

    springcloud 源码+解读

    SpringCloud的源码分析有助于开发者了解其实现机制,从而更好地定制和优化自己的服务。源码中包含了Eureka服务发现、Zuul边缘服务、Hystrix断路器、 Ribbon客户端负载均衡、Feign声明式客户端、Spring Cloud Config...

    spring cloud eureka 服务搭建

    **源码分析** 对于深入理解 Eureka 的工作原理,可以查看其源码。Eureka Server 的核心类包括 `EurekaServerContext` 和 `EurekaServerConfig`,它们负责处理服务的注册、注销和心跳等功能。Eureka Client 的关键类...

    尚硅谷SpringCloud视频 + 源码 百度网盘

    ### 一、SpringCloud简介与核心组件 #### 1.1 SpringCloud概述 SpringCloud是一套基于Spring Boot实现的微服务云应用开发工具集,它提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线...

    spring cloud实战源码

    9. **源码分析**: 分享的源码是作者手敲并通过编译验证的,意味着你可以深入研究每个服务的实现细节,理解Spring Cloud的原理和最佳实践。通过阅读和运行这些代码,开发者可以提升自己在实际项目中的应用能力。 ...

    SpringCloud+SpringBoot+Eureka源码

    总结来说,"SpringCloud+SpringBoot+Eureka源码"项目旨在通过源码学习,深入了解如何利用SpringBoot快速构建微服务,并借助SpringCloud的Eureka实现服务间的注册与发现。通过对源码的探索,我们可以更好地掌握微服务...

    SpringCloud之Eureka入门篇

    在压缩包文件中,`SpringCloud-Consumer`可能包含了服务消费者项目的源代码,`EureKaserver`则是Eureka Server的源码,而`SpringCloud-Service`则可能是服务提供者的源码。通过分析这些代码,你可以更深入地理解...

    尚硅谷周阳老师SpringCloud学习源码

    综上所述,"尚硅谷周阳老师SpringCloud学习源码"涵盖了SpringCloud的多个关键组件,通过学习这些源码,开发者能够深入理解微服务架构中的服务治理、API网关、断路器、配置中心、消息驱动等核心概念,进一步提升...

    SpringCloud 15个完整例子

    SpringCloud是中国Java开发者广泛使用的微服务框架,它包含了一系列组件,用于构建分布式系统。这个压缩包文件"SpringCloud 15个完整例子"提供了一系列从基础到进阶的示例项目,帮助用户深入理解并实践SpringCloud的...

    Spring和SpringCloud视频

    这些视频课程结合源码分析和课件学习,可以帮助开发者深入理解SpringBoot和SpringCloud的核心原理,并掌握实际应用中的最佳实践。对于想要在微服务领域深入发展的IT专业人士来说,这是一个非常有价值的资源。通过...

    SpringCloud源码-01.zip

    本篇将围绕SpringCloud的核心组件进行源码分析,包括Eureka服务注册与发现、Ribbon客户端负载均衡、Hystrix断路器、Zuul路由网关以及Config分布式配置中心,旨在帮助读者深入理解这些组件的工作原理。 一、Eureka:...

    springcloud demo项目源码

    源码分析** 在"demo1"中,我们可能看到以下关键组件的实现: - 服务启动类:包含`@EnableEurekaClient`注解,表示该服务会注册到Eureka服务器。 - API接口定义:定义了微服务对外提供的业务接口。 - 控制器:实现...

    基于Java的SpringCloud注册中心Eureka设计源码分析

    本项目为基于Java的SpringCloud注册中心Eureka设计源码,包含54个文件,其中Java源文件26个,PNG图片文件11个,Git忽略文件6个,XML和YAML配置文件各5个,Markdown文档1个。该源码旨在构建一个适用于SpringCloud...

    基于springcloud的电商平台源码.zip

    《基于SpringCloud的电商平台源码解析》 在现代互联网应用开发中,微服务架构已经成为主流。Spring Cloud作为一套完整的微服务解决方案,为开发者提供了构建分布式系统所需的工具集合,包括服务发现、配置中心、...

    尚硅谷SpringCloud的源码及思维导图

    尚硅谷提供的SpringCloud源码分析资源,为开发者深入理解这一框架提供了宝贵的资料。本文将围绕SpringCloud的核心组件、设计模式以及源码解析进行详细介绍,并结合思维导图,帮助读者构建清晰的知识体系。 首先,...

Global site tag (gtag.js) - Google Analytics