• 第一个Eureka程序,Eureka Client的自启动原理和简要过程


    https://blog.csdn.net/u011531425/article/details/81675289

    在之前的Spring Cloud Config的基础上,搭建简单的Eureka Server

    没有代码,很多试验做不起来,我们先创建个Eureka Server再说。

    本篇主要讲如何创建Eureka Server和Eureka Client,还有个重点是通过源码分析Eureka Client是如何自动启动的。

    创建Eureka Server
    1、通过idea创建Eureka Server
    通过Spring Initializr创建,选择Web和Cloud Discovery里面的Eureka Server

    使用intellij创建spring boot项目的时候,选择Cloud Discovery下面Eureka有两个选项,Eureka Server和Eureka Discovery。一个是Eureka Server,一个是Eureka Client。

    查看生成的pom,区别就在引入的jar包不同,一个是spring-cloud-starter-netflix-eureka-client,一个是spring-cloud-starter-netflix-eureka-server。netflix的starter几经修改,变成了现在的样子,大家在网上看一些老的帖子,有可能那时候的pom.xml中的dependency和现在是不一样的。

    2、配置eureka server
    server application.yml配置文件

    spring:
    application:
    name: eureka-server
    server:
    #指定服务端口
    port: 8761
    eureka:
    #指定主机名称
    instance:
    hostname: localhost
    #server一定程度上也是client,互为client,
    client:
    #由于自己就是服务器,不需要注册到自己
    register-with-eureka: false
    #由于自己就是服务器,不需要从服务器获取注册信息
    fetch-registry: false
    #服务地址
    service-url:
    defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    3、在启动类上添加@EnableEurekaServer

    4、启动项目,输入localhost:8761 看一下效果先

    5、我们先创建完客户端,配置完客户端,再来看配置项的意义

    创建Eureka Client
    1、添加依赖项,使项目成为Eureka Client
    从idea创建时,Eureka client使用Eureka Discovery创建,会自动添加依赖项。我们不新建,把之前的Config Client项目增加Eureka Client依赖,到maven repository那些网站搜spring eureka client,就能找到依赖的xml,注意不要弄成spring boot的starter,是spring cloud的,贴到之前的配置客户端中。

    <!-- Eureka Client -->

    <dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

    </dependency>

    2、Eureka Client会在项目启动时自动启动,不像Server需要添加什么@EnableEurekaClient之类的
    我一开始只添加了这个依赖,其它什么也没做,没配置指向eureka server,eureka server都没启动。启动Eureka Client时报错了,报错无法连接eureka server。但是项目照样起了起来,我访问localhost:8080/hello能成功打印出内容。

    说明了几个问题:

    1、eureka client获取和注册中心交互是异步线程,不干扰主线程的启动。这是很合理的设计。

    2、然后我把报错信息清空,发现每30s又会报一次错。也就是有什么东西30s触发一次

    3、看起来是假设引入了jar包,就会有个线程自动启动,尝试用某个默认的连接去与“注册中心”通信。假设通信失败,30s会再次心跳一次。我们去看源码到底特么哪里“自动”启动了。

    4、根据报错信息的最开始的堆栈信息查看源码,注意要从一开始启动的报错信息开始找。后面30s一次的报错信息,是已经开启了心跳之后的。看这个之前又得补习spring容器的知识(庞大的知识),可以先搜一下LifecycleProcessor这个接口的作用。

    从这里看,后面的再底层的我们不管,上层会触发DefaultLifecycleProcessor这个类的onRefresh方法,DefaultLifecycleProcessor(默认生命周期处理器)继承自接口LifecycleProcessor。Spring容器加载完一个bea后,如果bean实现了LifecycleProcessor接口,会判断bean实现的isAutoStartUp方法的返回值是true返回false,这个方法默认为false。如果我们修改为return true,会执行start()方法,我们可以在start()方法中做一些额外的工作,我后面打算总结一篇关于LifecycleProcessor的文章。

    而EurekaAutoServiceRegistration就继承了这么个接口,并且也将isAutoStartUp方法实现为return true,所以会执行它的start()方法

    然后一直往上找,最终会找到new DiscoveryClient的地方

    调用DiscoveryClient的构造函数,这个构造函数,里面有句this.initScheduledTasks(); 。这名字,你懂的。追代码会发现initScheduledTasks()这个方法会根据shouldFecthRegistry和shouldRegisterWithEureka这两个配置决定是否开启两个TimedSupervisorTask。这个方法先不继续追下去,总之,会开启调度方法,根据配置的刷新时间,如果没有默认值30S,去配置的配置中心拿数据。如果配置中心连接不上,报错连接不上unknown server

    5、因为获取注册信息的task会一直重复,假设注册中心某个时间挂掉,或者没有事先启动,客户端会在服务中心重新活跃之后和注册中心进行交互。

    至此明白了为什么只要加了Eureka Client的依赖项,引入了jar包,就会默认启动,以及稍微了解了启动的一些机制。下面我们来点正常操作,先把Eureka Server启动起来,然后配置一下客户端。

    3、配置Eureka Client
    application.yml 配置

    在原来的配置里添加eureka的配置

    spring:
    application:
    name: springcloudweb
    cloud:
    config:
    #指定配置服务中心地址
    uri: http://localhost:8888/
    profile: dev
    server:
    port: 8080
    eureka:
    instance:
    hostname: localhost
    client:
    service-url:
    defaultZone: http://localhost:8761/eureka/
    上面也说过Eureka的启动是通过类集成LifeCycle来自启动的,所以不需要像Config Server一样,需要加注解。

    添加完刷新Eureka界面。会发现已经注册上去了

    然后页面上会有DS Replicas,由于我们是standalone的server,所以这里是空的,还有各种信息,这些我们先不管,慢慢都会涉及到。

    后来我再看spring文档中的eureka部分,里面其实讲到了在Eureka Client中引入jar包就会在启动时自动尝试往Eureka Server注册的事情,但是只一笔带过,太容易被忽略,并且也没讲原理,我喜欢先读一遍文档了解大概,再实践踩坑,再去研读理论。。。

    好了,主要就先将Eureka Client如何自动启动的,太多容易消化不良。
    ---------------------
    作者:今夕何夕_1988
    来源:CSDN
    原文:https://blog.csdn.net/u011531425/article/details/81675289
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    HAProxy的基础配置详解
    Nginx七层负载均衡的几种调度算法
    基于PXE网络启动的Linux系统自动化安装
    centos源码编译安装新版本内核
    Linux计划任务管理
    Linux多网卡绑定(bond)及网络组(team)
    Linux逻辑卷管理(LVM)
    pandas基础操作
    subprocess
    python常用库(转)
  • 原文地址:https://www.cnblogs.com/mkl34367803/p/10701688.html
Copyright © 2020-2023  润新知