第一个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
版权声明:本文为博主原创文章,转载请附上博文链接!
第一个Eureka程序,Eureka Client的自启动原理和简要过程的更多相关文章
- Eureka 的 Application Client client的执行演示样例
上篇以一个 demo 演示样例介绍了 Eureka 的 Application Service 客户端角色.今天我们继续了解 Eureka 的 Application Client 客 ...
- (转)微服务_创建一个简单的Eureka注册中心
原文地址:https://www.cnblogs.com/lplshermie/p/9105329.html 微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习Spring ...
- 创建一个简单的Eureka注册中心
微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习SpringCloud,就从Eureka开始.他们俩就不做介绍了,网上的说明一堆,随便打开一个搜索引擎输入关键字都足够了解 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- Eureka参数配置->Client端参数
1.基本参数配置列表: 参数 默认值 说明 eureka.client.availability-zones 告知client有哪些region及availability-zones,支持配置 ...
- 跟我一起学WCF(4)——第一个WCF程序
一.引言 前面几篇文章分享了.NET 平台下其他几种分布式技术,然而前面几种分布式技术专注于某一特定的领域,并且具有不同编程接口,这使得开发人员需要掌握多个API的使用.基于这样的原因,微软在.NET ...
- Photon开发实战(2)——开发框架、第一个Photon程序
Photon基础开发框架 Photon (v4)的基本框架.开发框架主要Photon和游戏逻辑(C#)两个部分,如下图最新的Photon v4支持的4种底层协议,游戏开发逻辑Photon目前主要划分为 ...
- 网络编程应用:基于TCP协议【实现一个聊天程序】
要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...
- 《Java编程思想》读书笔记-第一个Java程序
积少成多,欢迎大家关注我的微信公众号,共同探讨Java相关技术 今天的重点是:编写源代码.编译.运行.查看成果.除此之外,还需要搭建起与前面学习的知识的联系. 写本文时依据的系统环境是Windows1 ...
随机推荐
- [poj P1141] Brackets Sequence
[poj P1141] Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Special Judge Description ...
- 【转】 SQL - 生成指定范围内的随机数
DECLARE @Result INT DECLARE @Upper INT DECLARE @Lower INT SET @Lower = 1 SET @Upper = 10 SELECT @Res ...
- vmware 安装 centos7 记录笔记
1, 安装centos 7, 到阿里云镜像下载centos 7 1.虚拟机的创建: 打开安装好的VMware (如果大家安装的VMware是英文版的也没关系,对号入座即可),选择“文件--->新 ...
- 简单函数template max
#include <iostream> #include <vector> #include <algorithm> #include <string> ...
- css颜色的五种表示方法
一.最简单.最古老的颜色类型在CSS颜色的关键词,如red blue等. 二.十六进制值,如#0000. 三.RGB: rgb(255,0,0),这是给定的三个参数表示的红色,绿色和蓝色通道的颜色值每 ...
- slick插件一些配置
- Python列表的一点用法
#python的基本语法网上已经有很多详细的解释了,写在这里方便自己记忆一些 列表相当于python中的数组,但相对于数组,列表的操作显得更为灵活 常用的操作列表的方式: List = [1,'bl ...
- 开发方式-----C语言
上期我们已经把C语言的开发平台搭建好了,还有不清楚地可以查看我上一篇的笔记,这次我们就要进行编辑C语言,那么它到底是怎么实现开发的呢?这一期我就来演示一次开发方式,至于说明为什么会这样或者这个是什么意 ...
- “必须执行Init_Clk函数,才能采集到二氧化碳接口485数据的问题”的解决
这个问题困扰了我很长一段时间,而且如果这个问题不解决,就有一个无法调和的矛盾:执行Init_Clk函数,能采集到二氧化碳接口485数据,但是功耗大:不执行Init_Clk函数,不能采集到二氧化碳接口4 ...
- 深入理解Java中的同步静态方法和synchronized(class)代码块的类锁
一.回顾学习内容 在前面几篇博客中我我们已经理解了synchronized对象锁.对象锁的重入.synchronized方法块.synchronized非本对象的代码块, 链接:https://www ...