大家好,今天呢,正式进入注册中心-Eureka篇章第二节内容的学习

上一节我们从Eureka-Server的视角,分别了解了如何实现单机和集群的Euerka注册中心,了解了Eureka-Server对于服务实例的获取、更新、以及定时剔除等处理流程

那么这一节我们将站在Eureka-client的角度,分别通过跟踪注册、续约以及下线分别在Eureka-Client、Eureka-Server的处理流程以及交互处理流程,让大家对于Eureka的整体架构有更深入的了解

首先,我们先通过一个例子,看看客户端要如何使用注册中心~

一 实战 客户端注册

1)引入依赖

只需要在pom中添加eureka-client依赖即可,当然也要同时引入Spring-cloud的依赖,注意版本需要对应

<properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<!-- 使用eureka作为注册中心--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
<!-- 引入Spring-cloud依赖,以保证可以找到eureka的依赖-->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2)添加配置

bootstrap.properties中添加如下配置:

spring.application.name=waiter-service
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/

这里我们演示的是注册中心为集群模式的配置方式,配置方式为各个节点之间以逗号隔开即可

eureka.client.serviceUrl.defaultZone默认值为http://localhost:8761/eureka/

因此,若只需要配置本地的单机模式(端口也为默认端口8761时),那么只需要引入依赖,Spring Boot就帮你配置好注册中心的地址啦

3)添加注解

在启动类中添加@EnableDiscoveryClient,来声明该微服务为注册中心

@SpringBootApplication@EnableDiscoveryClient
public class EurekaClientApplication {public static void main(String[] args) {SpringApplication.run(EurekaClientApplication.class, args);}
}

4)启动服务

直接启动启动类,通过查看日志,我们发现服务已经成功注册

5)访问页面

访问地址http://localhost:8761/,可以看到服务注册中心的管理端页面已有一个实例waiter-service已经成功注册,并且状态是UP

好了,了解了如何使用Spring Boot实现客户端使用注册中心,接下来让我们一起通过跟踪源码,站在客户端的角度,探究注册中心的实现机制吧~

二 初始化 启动时初始化

Eureka-Client启动时,进入DiscoveryClient,进行相关Bean以及定时任务的初始化,包括健康检查处理bean、监控检查回调bean、事件监听bean以及注册前处理bean等

调用initScheduledTasks()方法进行定时任务的初始化

分别初始化心跳检测定时任务实例信息复制定时任务

其中,实例信息复制定时任务用于实例信息注册;而心跳检测定时任务,则用于客户端向服务端发送续租请求

三 注册 注册实例信息

总的来说,客户端启动时,会进行服务的注册。在运行过程中,会定期检查客户端的实例信息与服务端的实例信息是否一致,若不一致,则需要进行服务更新

01. 注册实例信息(Eureka-Client)

1)创建实例信息变更监听器

2)注册状态变更监听器,并通过调用InstanceInfoReplicator.start()开启实例复制调度器

3)InstanceInfoReplicator.start()处理流程

进入InstanceInfoReplicator.start()方法,我们可以看到该方法调用了instanceINfo.setIsDirty()修改实例信息的状态为true,表示当前的实例信息与实际值不一致,需要更新(目的是实例InstanceInfo在刚被创建时,它的eureka-server信息为空,因此需要加载一次实例信息)

那么,实例信息第一次开始就会进行刷新实例信息操作。具体如何实现注册与检查更新操作呢?我们直接看下一步

02. 刷新应用实例信息(Eureka-Client)

1)InstanceInfoReplicator.run()处理流程

客户端实例启动时、在服务运行过程中出现实例信息有更新时,均会进行服务状态信息的注册

注册完成以后,更新实例为已同步状态,并创建下一个实例复制的定时任务,进行相同的实例变更监听更新操作

一直这样,循环进行下去,实现实例信息的周期性检查更新动作

那么,实例信息的检查更新具体逻辑是怎样的呢?

2)实例信息检查更新

进入DiscoveryClient.refreshInstanceInfo() 方法,进行实例信息的检查与更新

包含以下3步:

1)更新hostname

调用以下代码,进行数据中心相关信息的更新

ApplicationInfoManager.refreshDataCenterInfoIfRequired()

将当前实例信息的地址与注册中心中的地址进行比较。若不一致,说明hostname有变化,则需要调用updataInstanceInfo(...)方法进行更新

2)更新租约信息

调用以下代码,进行租约信息检查更新

ApplicationInfoManager

分别判断续租时间的续租时间、续租间隔时间,与配置中的租约信息是否一致,若某个值不一致,说明信息有过变化,那么需要更新这两个值为当前值;更新以后。将实例变成待同步状态,在下次续约时,进行更新同步

3)获取并更新实例状态

最后,通过调用健康检查处理类方法,获取并更新实例状态即可

03. 发起注册请求(Eureka-Client)

调用DiscoveryClient.register() 方法,Eureka-Client 向 Eureka-Server 注册应用实例

04. 接收注册请求(Eureka-Server)

Eureka-Server通过映射ApplicationResource.addInstance()方法来接收应用实例信息的请求

05. 注册应用信息(Eureka-Server)

接收到实例信息的注册请求,调用AbstractInstanceRegistry.register(...)方法,进行具体注册流程处理

具体实现流程,可参考上一篇文章-Spring Boot(九):注册中心Eureka-服务端视角

四 续约 renew 篇

在初始化信息步骤中,我们看到了客户端会创建心跳检测的定时任务。那么,它就会在固定周期内进行续约

01. 发起续约请求(Eureka-Client)

1)心跳线程

使用心跳线程DiscoveryClient.HeartbeatThread,执行 客户端向Eureka-Server 发起续租( renew )请求的动作

该线程会通过调用renew()方法,判断是否续约成功。若续约成功,则直接更新最后一次成功心跳时间戳为当前系统时间

2)renew()方法

进入renew()方法

调用sendHeartBeat(),向Eureka-server发起续约请求。若请求结果为404(Eureka-server在处理续约请求失败时,会返回404),那么就需要调用register()方法,重新发起注册

若注册成功,则更新实例为已同步状态

3)进入sendHeartBeat()方法

进入AbstractJerseyEurekaHttpClient.sendHeartBeat()方法

通过put请求,调用Eureka-server端的url:apps/appName/id,发起续约请求

02. 接收续约请求(Eureka-Server)

Eureka-Server通过映射InstanceResource.renewLease()方法来接收应用实例信息的请求,用于处理客户端实例信息的续约请求操作

03. 处理续约请求(Eureka-Server)

依旧是通过renewLease()进行续约请求的处理

该方法调用renew()方法,进行具体续约操作

若续约失败,则返回404-NOT FOUND给客户端,客户端就会重新发起注册

五 下线 shutdown篇

01. 发起下线通知请求(Eureka-Client)

当客户端服务通过需要下线时,调用DiscoveryClient().shutdown()方法,设置实例状态为下线,并通过unregistr()方法,向Eureka-server发起下线请求

以下是unregister()方法,它会向Eureka-server发起下线的http请求

02. 接收下线请求(Eureka-Server)

Eureka-Server通过映射InstanceResource.cancelLease()方法来接收处理客户端实例信息的下线请求操作

03. 处理下线请求(Eureka-Server)

调用cancel()方法,对该实例信息进行下线处理

该方法通过调用父级cancel()方法,对该Eureka-server节点进行下线操作,若下线成功,则向其他节点同步下线操作,保持服务信息的一致性

六 总结 总而言之

今天通过一个客户端Eureka-Client注册Eureka-server的实例,并站在客户端的角度,聊了服务注册、续约以及下线三个主要操作的执行流程与逻辑

Spring Boot(九):注册中心Eureka-服务端视角以及本篇文章联合,我们分别站在服务端和客户端的视角,联通了Eureka的整个生命周期内的整体机制

总得来说呢,Eureka可以分为三个角色:服务器端服务提供者服务调用者

Eureka具有高可用性。服务器端Eureka-server是以平级关系存在(并没有leader与follower机制,大家都是平起平坐的关系),每次服务实例信息有变更,它会通过监听将其变化情况注册在其中一个节点上,并都会复制给其他节点

如有某个节点挂了,其他节点依旧能够进行服务的协调工作,只是信息不一定是最新的(不保证信息的一致性)

需要注意的是,我们平常说的Eureka只能保证可用性,不保证一致性,都是针对服务出现故障的情况说的~

如图,服务端Eureka-server会存储服务实例信息,通过复制实现服务实例信息在各个节点同步,并定期去检查服务实例信息状态;

各个客户端也会通过健康检查等机制进行自我状态检查,要是信息有了变化,均会向服务Eureka-server发起请求;

Eureka-server则会分别处理这些状态变化,来保持实例信息的更新。

其中需要注意的是,当Eureka Server节点在短时间内丢失过多客户端(可能发生了网络分区故障),默认是15分钟内收到的续约低于原来的85%时,这个节点就会进入自我保护模式

那么现在大家肯定了解了,为什么在服务启动时,会初始化那么多处理包含健康检查在内的Bean,以及定时任务,对吧?这些处理Bean以及定时任务对于Eureka的整体机制起了很重要的作用,如果你还不太清楚,那么建议再回过头再好好看看两篇文章哈~若是跟着源码走一遍 就更能理解透彻了~

嗯,就这样。每天学习一点,时间会见证你的强大~

下期预告:

Spring Boot(十一):注册中心Zookeeper

往期精彩回顾

Spring Boot(九):注册中心Eureka-服务端视角

Spring Boot(八):Spring Boot的监控法宝:Actuator

Spring Boot(七):你不能不知道的Mybatis缓存机制!

Spring Boot(六):那些好用的数据库连接池们

Spring Boot(五):春眠不觉晓,Mybatis知多少

Spring Boot(四):让人又爱又恨的JPA

Spring Boot(三):操作数据库-Spring JDBC

SpringBoot(二):第一个Spring Boot项目

SpringBoot(一):特性概览

http://weixin.qq.com/r/qEVpcQ-EVFIrrUsS9xC6 (二维码自动识别)

eureka server配置_Spring Boot(十):注册中心Eureka-客户端视角相关推荐

  1. SpringCloud | 第二章: 注册中心 Eureka

    前言 前一章节 初识SpringCloud 简单介绍了什么是SpringCloud,以及微服务的架构,这一章节则来说说SpringCloud的基石,注册中心Eureka. 背景介绍 Eureka是Ne ...

  2. spring cloud 2.3.x 注册中心eureka 配置

    添加Eureka依赖配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  3. 配置高可用Eureka Server遇到的神坑:无法注册服务

    今天在进行高可用的Eureka Server注册中心的配置时,遇到一个神坑. 拓扑图 废话不多说,直接上拓扑图: Eureka Server配置 pom.xml: <dependency> ...

  4. SpringCloud 微服务注册中心 Eureka - Server

    前言 上一篇文章介绍了 Eureka Client 端的相关源码.这篇文章我们学习 Eureka Server 是如何存储 Client 注册过来的实例信息,以及 Server 端如何与 Client ...

  5. eureka管理界面是多少_Eureka注册中心

    一 服务注册中心 1 什么是服务注册中心 服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来 存储服 务信息,譬如提供者 url 串.路由信息等.服务注册中心是 SOA 架构中 ...

  6. SpringCloud系列(一)、服务注册中心Eureka基础

    启动Eureka服务注册中心 1.微服务的注册中心 1.1.注册中心的主要作用 1.2.常见的注册中心 1.3.常见注册中心的异同点 2.Eureka概述 2.1.Eureka的基础知识 2.2.Eu ...

  7. SpringCloud简介及注册中心Eureka

    一.SpringCloud简介 1.简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基 础设施的开发,如服务发现注册.配置中心.消息 ...

  8. SpringCloud系列之服务注册中心(Eureka)

    文章目录 0.前言 1.搭建第一个Eureka服务 ①.简介 ②.组成 ③.创建Eureka Server模块 ④.编写POM ⑤.YML ⑥.主启动 ⑦.测试 2.注册服务 ①服务提供者 Ⅰ.添加依 ...

  9. eureka java_SpringCloud注册中心Eureka

    本篇概论 在上一篇中我们介绍了微服务相关的内容.微服务的本质就是让服务与服务之间进行互相调用.那么在调用之前需要有一个前提.就是不同的服务与服务之间怎么知道彼此的存在的呢?因为服务都是独立部署的,根本 ...

最新文章

  1. js使用正则实现表单验证
  2. 学生管理系统代码赏析
  3. 百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
  4. python中MySQLdb模块用法实例
  5. linux学习笔记:vim编辑器基本操作(附vim 键盘图)
  6. CRT、Windows API、C/C++标准库、 ATL
  7. EasyCHM chm文件制作过程及软件附软件下载地址
  8. matlab分析excel数据,基于MATLAB的EXCEL数据计算与分析
  9. yuki翻译器钩子_YUKI游戏翻译工具下载
  10. 使用python和requests爬取世界卫生组织vigiaccess不良反应数据库
  11. Progressive GAN
  12. html全屏显示两个显示器,google-chrome – 跨多个显示器的Windows / Chrome / ATI /浏览器全屏...
  13. 002输出一个正方形
  14. Base64 在线编码解码
  15. 5.2为每种类型的模块内聚举一个例子
  16. 盯盯拍CEO 罗勇现身云栖大会 畅谈车联网生态并发布全新产品mini3
  17. mysql 竖线_为什么MySQL拒绝在INSERT INTO字符串中使用竖线('|')字符?
  18. c语言|程序设计|指针~字母出现次数(1)
  19. 单片机检测信号通断通用电路(3.3V/5V直流信号,24V+直流信号,220V交流信号)
  20. java 实现word转pdf

热门文章

  1. Bailian1017 装箱问题【贪心】
  2. POJ1061 青蛙的约会【扩展欧几里得算法】
  3. HDU2050 折线分割平面【组合】
  4. Bailian3195 最大公约数【数论】
  5. Vijos P1975 扫雷游戏【谜题】
  6. HDU2041 超级楼梯【递推+水题】
  7. sublime —— 强大的插件
  8. 离散型概率分布的抽样
  9. Tricks(二十五)—— decorator(在函数调用前后打印日志)
  10. C++ 标准库——ctime