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的自启动原理和简要过程的更多相关文章

  1. Eureka 的 Application Client client的执行演示样例

            上篇以一个 demo 演示样例介绍了 Eureka 的 Application Service 客户端角色.今天我们继续了解 Eureka 的 Application Client 客 ...

  2. (转)微服务_创建一个简单的Eureka注册中心

    原文地址:https://www.cnblogs.com/lplshermie/p/9105329.html 微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习Spring ...

  3. 创建一个简单的Eureka注册中心

    微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习SpringCloud,就从Eureka开始.他们俩就不做介绍了,网上的说明一堆,随便打开一个搜索引擎输入关键字都足够了解 ...

  4. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  5. Eureka参数配置->Client端参数

     1.基本参数配置列表: 参数 默认值 说明 eureka.client.availability-zones    告知client有哪些region及availability-zones,支持配置 ...

  6. 跟我一起学WCF(4)——第一个WCF程序

    一.引言 前面几篇文章分享了.NET 平台下其他几种分布式技术,然而前面几种分布式技术专注于某一特定的领域,并且具有不同编程接口,这使得开发人员需要掌握多个API的使用.基于这样的原因,微软在.NET ...

  7. Photon开发实战(2)——开发框架、第一个Photon程序

    Photon基础开发框架 Photon (v4)的基本框架.开发框架主要Photon和游戏逻辑(C#)两个部分,如下图最新的Photon v4支持的4种底层协议,游戏开发逻辑Photon目前主要划分为 ...

  8. 网络编程应用:基于TCP协议【实现一个聊天程序】

    要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...

  9. 《Java编程思想》读书笔记-第一个Java程序

    积少成多,欢迎大家关注我的微信公众号,共同探讨Java相关技术 今天的重点是:编写源代码.编译.运行.查看成果.除此之外,还需要搭建起与前面学习的知识的联系. 写本文时依据的系统环境是Windows1 ...

随机推荐

  1. Linux中利用extundelete恢复误删除的数据

    利用extundelete工具恢复磁盘误删除的数据 原理: 简单介绍下关于inode的知识.在Linux下可以通过"ls -id"命令来查看某个文件或者目录的inode值,例如查看 ...

  2. 线程基础:多任务处理——MESI协议以及带来的问题:伪共享

    1.概述 本文和后续文章将着眼CPU的工作原理阐述伪共享的解决方法和volatile关键字的应用. 2.复习CPU工作原理2.1.CPU工作原理要清楚理解本文后续内容,就需要首先重新概述一下JVM的内 ...

  3. RAID的详细配置

    一.RAID 1.RAID机制通过使用多硬盘并行工作的方式来提高硬盘的IO性能 2.RAID分为多种,称之为RAID level,RAID共有7级:RAID0~RAID6 3.常用的RAID级别有:R ...

  4. <airsim文档学习> Street View Image, Pose, and 3D Cities Dataset

    原文地址:  https://github.com/amir32002/3D_Street_View 说明:个人学习笔记,翻译整理自github/airsim. 简介 该存储库共享包含6DOF相机姿态 ...

  5. php intval 两位小数乘以100后结果少1

    价格处理的时候往往是两位小数需要换算成分,如:16.33元换算为1633分,直接乘以100也就行了的,但是又使用了一个转换为整数类型的函数intval() 这下子结果就不对了,如图:  结果:  可以 ...

  6. Core Json 序列化相关问题

    //返回json  大小写 配置            services.AddMvc()                    .AddJsonOptions( op => op.Serial ...

  7. admin 后台

    https://segmentfault.com/a/1190000015835976#articleHeader3https://github.com/PanJiaChen/vue-element- ...

  8. 初始Java

  9. 基于vue移动音乐webapp跨域请求失败的问题解决

    在学习一位vue大牛的课程<VUE2.0移动端音乐App开发>时,由于vue的版本原因遇到了一些问题 这是其中之一,花费了很多的时间去解决 虽然搞定了这个问题,但是很多东西理解也不是很到位 ...

  10. leetcode题解 200. Number of Islands(其实就是一个深搜)

    题目: Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is s ...