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

在之前的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如何自动启动的,太多容易消化不良。

展开阅读全文

没有更多推荐了,返回首页