Eureka
作为一个成熟的服务注册中心
当然也有合理的内部维护服务节点
的机制,比如我们本章将要讲解到的服务下线
、失效剔除
、自我保护
,也正是因为内部有这种维护机制才让Eureka
更健壮、更稳定。
本章目标
了解Eureka
是怎么保证服务相对较短时长内
的有效性。
服务下线
迭代更新
、终止访问
某一个或者多个服务节点
时,我们在正常关闭服务节点
的情况下,Eureka Client
会通过PUT
请求方式调用Eureka Server
的REST
访问节点/eureka/apps/{appID}/{instanceID}/status?value=DOWN
请求地址,告知Eureka Server
我要下线了,Eureka Server
收到请求后会将该服务实例
的运行状态
由UP
修改为DOWN
,这样我们在管理平台
服务列表内看到的就是DOWN
状态的服务实例。
有关
Eureka Server
内部的REST
节点地址,请访问SpringCloud组件:Eureka服务注册中心内置的REST节点列表来了解详情。
失效剔除
Eureka Server
在启动完成后会创建一个定时器每隔60秒
检查一次服务健康状况
,如果其中一个服务节点超过90秒
未检查到心跳,那么Eureka Server
会自动从服务实例列表
内将该服务剔除
。
由于非正常关闭不会执行
主动下线
动作,所以才会出现失效剔除
机制,该机制主要是应对非正常关闭服务的情况,如:内存溢出
、杀死进程
、服务器宕机
等非正常流程
关闭服务节点时。
自我保护
Eureka Server
的自我保护机制
会检查最近15分钟
内所有Eureka Client
正常心跳的占比,如果低于85%
就会被触发。
我们如果在Eureka Server
的管理界面发现如下的红色内容,就说明已经触发了自我保护机制
。
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
当触发自我保护机制
后Eureka Server
就会锁定服务列表
,不让服务列表内的服务过期
,不过这样我们在访问服务时,得到的服务很有可能是已经失效的实例
,如果是这样我们就会无法访问到期望的资源,会导致服务调用失败,所以这时我们就需要有对应的容错机制
、熔断机制
,我们在接下来的文章内会详细讲解这块知识点。
我们的服务如果是采用的公网IP地址
,出现自我保护机制
的几率就会大大增加
,所以这时更要我们部署多个相同InstanId
的服务或者建立一套完整的熔断机制
解决方案。
自我保护开关
如果在本地测试环境,建议关掉自我保护机制
,这样方便我们进行测试,也更准备的保证了服务实例
的有效性
!!!
关闭自我保护
只需要修改application.yml
配置文件内参数eureka.server.enable-self-preservation
将值设置为false
即可。
总结
我们通过本章的讲解,了解到了Eureka Server
对服务的治理,其中包含服务下线
、失效剔除
、自我保护
等,对自我保护机制
一定要谨慎的处理,防止出现服务失效问题。
源码位置
- SpringBoot配套源码地址:访问码云查看源码、访问GitHub查看源码
- SpringCloud配套源码地址(
本章源码在这
):访问码云查看源码,访问GitHub查看源码
有问题要问?
如果你有技术相关的问题想要咨询
恒宇少年
,请去博客首页左侧导航栏,点击知识星球
微信扫码加入我的星球。
与恒宇少年面对面
如果你喜欢
恒宇少年
的相关文章,那么就去微信公众号(恒宇少年
)关注我吧!!!
当然你也可以去 SpringCloud码云源码 项目底部扫描微信公众号二维码关注我,感谢阅读!!!
学习目录推荐
- SpringCloud相关系列文章访问:https://www.jianshu.com/p/64e4aaada96b
- SpringBoot相关系列文章请访问:http://www.jianshu.com/p/9a08417e4e84
- QueryDSL相关系列文章请访问:http://www.jianshu.com/p/99a5ec5c3bd5
- SpringDataJPA相关系列文章请访问:http://www.jianshu.com/p/615ed9c1fe84
开源信息
这段时间一直在编写开源的相关框架,致力于公司使用的框架升级以及开源计划,将公司使用到的工具
以及插件
进行升级重构并且开源。
- 代码生成器(Code-Builder)
code-builder
代码生成器根据你提供的模板文件(目前支持freemarker
)自动生成实体类,可以很大很有效的提高开发效率。Gitee地址
:https://gitee.com/hengboy/code-builderGithub地址
:https://github.com/hengyuboy/code-builder - 持久化框架(MyBatis-Enhance)
mybatis-enhance
是一个对mybatis
框架的增强封装,提供一系列的内部方法来完成单表数据的操作,多表数据提供DSL
方式进行操作。Gitee地址
:https://gitee.com/hengboy/mybatis-enhanceGithub地址
:https://github.com/hengyuboy/mybatis-enhance - 自动分页插件
MyBatis-Pageable
是一款自动化分页的插件,基于MyBatis
内部的插件Interceptor
拦截器编写完成,拦截Executor.query
的两个重载方法计算出分页的信息以及根据配置的数据库Dialect
自动执行不同的查询语句完成总数量的统计。Gitee地址
:https://gitee.com/hengboy/mybatis-pageable