我是靠谱客的博主 拉长百褶裙,最近开发中收集的这篇文章主要介绍Eureka--2、第一个Eureka程序,Eureka Client的自启动原理和简要过程创建Eureka Server创建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如何自动启动的,太多容易消化不良。

最后

以上就是拉长百褶裙为你收集整理的Eureka--2、第一个Eureka程序,Eureka Client的自启动原理和简要过程创建Eureka Server创建Eureka Client的全部内容,希望文章能够帮你解决Eureka--2、第一个Eureka程序,Eureka Client的自启动原理和简要过程创建Eureka Server创建Eureka Client所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部