eureka server配置_Spring Boot(十):注册中心Eureka-客户端视角
大家好,今天呢,正式进入注册中心-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-客户端视角相关推荐
- SpringCloud | 第二章: 注册中心 Eureka
前言 前一章节 初识SpringCloud 简单介绍了什么是SpringCloud,以及微服务的架构,这一章节则来说说SpringCloud的基石,注册中心Eureka. 背景介绍 Eureka是Ne ...
- spring cloud 2.3.x 注册中心eureka 配置
添加Eureka依赖配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...
- 配置高可用Eureka Server遇到的神坑:无法注册服务
今天在进行高可用的Eureka Server注册中心的配置时,遇到一个神坑. 拓扑图 废话不多说,直接上拓扑图: Eureka Server配置 pom.xml: <dependency> ...
- SpringCloud 微服务注册中心 Eureka - Server
前言 上一篇文章介绍了 Eureka Client 端的相关源码.这篇文章我们学习 Eureka Server 是如何存储 Client 注册过来的实例信息,以及 Server 端如何与 Client ...
- eureka管理界面是多少_Eureka注册中心
一 服务注册中心 1 什么是服务注册中心 服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来 存储服 务信息,譬如提供者 url 串.路由信息等.服务注册中心是 SOA 架构中 ...
- SpringCloud系列(一)、服务注册中心Eureka基础
启动Eureka服务注册中心 1.微服务的注册中心 1.1.注册中心的主要作用 1.2.常见的注册中心 1.3.常见注册中心的异同点 2.Eureka概述 2.1.Eureka的基础知识 2.2.Eu ...
- SpringCloud简介及注册中心Eureka
一.SpringCloud简介 1.简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基 础设施的开发,如服务发现注册.配置中心.消息 ...
- SpringCloud系列之服务注册中心(Eureka)
文章目录 0.前言 1.搭建第一个Eureka服务 ①.简介 ②.组成 ③.创建Eureka Server模块 ④.编写POM ⑤.YML ⑥.主启动 ⑦.测试 2.注册服务 ①服务提供者 Ⅰ.添加依 ...
- eureka java_SpringCloud注册中心Eureka
本篇概论 在上一篇中我们介绍了微服务相关的内容.微服务的本质就是让服务与服务之间进行互相调用.那么在调用之前需要有一个前提.就是不同的服务与服务之间怎么知道彼此的存在的呢?因为服务都是独立部署的,根本 ...
最新文章
- js使用正则实现表单验证
- 学生管理系统代码赏析
- 百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
- python中MySQLdb模块用法实例
- linux学习笔记:vim编辑器基本操作(附vim 键盘图)
- CRT、Windows API、C/C++标准库、 ATL
- EasyCHM chm文件制作过程及软件附软件下载地址
- matlab分析excel数据,基于MATLAB的EXCEL数据计算与分析
- yuki翻译器钩子_YUKI游戏翻译工具下载
- 使用python和requests爬取世界卫生组织vigiaccess不良反应数据库
- Progressive GAN
- html全屏显示两个显示器,google-chrome – 跨多个显示器的Windows / Chrome / ATI /浏览器全屏...
- 002输出一个正方形
- Base64 在线编码解码
- 5.2为每种类型的模块内聚举一个例子
- 盯盯拍CEO 罗勇现身云栖大会 畅谈车联网生态并发布全新产品mini3
- mysql 竖线_为什么MySQL拒绝在INSERT INTO字符串中使用竖线('|')字符?
- c语言|程序设计|指针~字母出现次数(1)
- 单片机检测信号通断通用电路(3.3V/5V直流信号,24V+直流信号,220V交流信号)
- java 实现word转pdf