Eureka 中各个节点数据是保存在内存之中,当Eureka所有节点都同时重启时,那么所有数据都会丢失,所以使用高可用架构更是必不可少的。
虽然使用高可用架构能降低风险,但在误操作或极端情况下,还是会有可能造成数据丢失的风险,为此随行付架构部为了更彻底解决这个问题,针对Eureka进行以下优化处理:
在应用实例注册到注册中心时,注册中心将应用实例信息持久化到数据库中(将数据持久化到数据库中,非常方便使用sql进行一系列的检索,很好的提高使用的便利性);
注册中心在接收到应用实例(RENEW)心跳请求时,先检查内存中数据是否还存在,如果不存在,则先从数据库中加载数据,并自动注册,然后再继续完成心跳请求。
高可用架构
注册中心单点肯定是不牢靠的,我们通常建议使用3节点组成的集群:
3个节点的集群,每个节点向其它节点注册,这样只要集群中有一个节点正常工作即可。为了方便在本机实现这种效果,我们先修改下hosts文件:
这相当于给本机ip绑了3个hostname。然后在项目中,创建3个profile:
应用配置
application-peer1.yml,将peer1的信息同步到peer2和peer3:
application-peer2.yml,将peer2的信息同步到peer1和peer3:
application-peer3.yml,将peer3的信息同步到peer1和peer2:
同时为了保证系统的安全性,需要设置用户名和密码进行安全验证,比如:
application-dev.yml,开发环境:
通过bootstrap.yml设置默认值:
服务器部署
首先根据实际情况在hosts文件中,加入peer1、peer2、peer3的配置;
然后在3台服务器上分别执行下列命令进启动服务:
在peer1服务器上执行:
在peer2服务器上执行:
在peer3服务器上执行:
效果图
Eureka Server间无法同步数据问题
请注意,Eureka Server相互注册后可能出现无法同步数据的情况。具体表现是每个Eureka Server上的续约数都不一样,同时在General Info标签下别的Eureka Server显示为”unavailable-replicas”。
因为Eureka通过serviceUrl.defaultZone解析到副本的hostname,与实例互相注册时的hostname对比,来判断副本是不是available。所以我们可以通过两种方式来配置:
如何验证同步数据正常
如下图所示:
如果当前节点与某一节点不能同步数据话,会将其节点信息显示在 unavailable-replicas 这行。
客户端配置
首先要在gradle中引入依赖:
在application.yml文件中增加如下配置:
注意:以上配置必须放到application.yml文件中,不能放到bootstrap.yml文件中。
写在最后:
关于随行付的开源Porter项目,你有什么问题或看法,欢迎留言告诉我们,大家一起讨论交流!