使用Spring搭建Eureka两节点集群
Eureka2的开源开发已经终止了,但现有版本还是能正常使用。由于是基础设施,搭建后如果没有问题就不怎么理会,加上开源终止导致没再怎么看,结果前些天面试问到集群,发现都忘得差不多了。这里再搭一下做些记录。
框架生成
这里我们依然使用Spring Initializer来创建项目,使用最新的Spring Boot版本和Jdk1.8,依赖项查找Eureka Server,添加它即可。
生成后导入IDE方便编辑。
相关配置
首先启动类添加@EnableEurekaServer
注解,然后在src\main\resource目录下面添加application.yaml文件,具体配置信息如下:
eureka:
client:
serviceUrl:
defaultZone: http://192.168.43.80:8762/eureka/,http://192.168.43.104:8762/eureka/
---
spring:
application:
name: eurekaserver
profiles: p104
server:
port: 8762
eureka:
datacenter: dc1
instance:
hostname: 192.168.43.104
preferIpAddress: true
server:
peer-node-read-timeout-ms: 500
waitTimeInMsWhenSyncEmpty: 1
enableSelfPreservation: true
client:
registerWithEureka: true
fetchRegistry: true
---
spring:
application:
name: eurekaserver
profiles: p80
server:
port: 8762
eureka:
datacenter: dc1
instance:
hostname: 192.168.43.80
preferIpAddress: true
server:
peer-node-read-timeout-ms: 500
waitTimeInMsWhenSyncEmpty: 1
enableSelfPreservation: true
client:
registerWithEureka: true
fetchRegistry: true
配置说明:
- 由于要以集群方式来运行EurekaServer,这里使用两个节点,上面创建了两个profile,分别是p80和p104,对应在两部主机上面的部署。
- 两部主机分别是192.168.43.80和192.168.43.104,由于使用主机名称时,有部主机部署时提示检测不到主机名称,就改成了IP,正常在serviceUrl这部分还是应该使用域名的,这样就不会依赖于固定的IP。
- peer-node-read-timeout-ms这个默认是200,视具体环境配置,这里改为500毫秒。
检测不到主机提示的错误是:Temporary failure in name resolution,该机器是ubuntu机器,后来发现在host里面添加对应主机信息可解决问题,例如: 192.68.43.104 主机名称,这样上面配置的ip就可以使用主机名称代替了。
打包和部署
执行mvn clean compile package
进行打包,打完后可以进行测试了。
将打好的jar包复制到80和104主机上面(假设打的jar包名称为eurekaserver-1.0.jar)然后分别执行:
java -jar eurekaserver-1.0.jar --spring.profiles.active=p80
java -jar eurekaserver-1.0.jar --spring.profiles.active=p104
由于两个节点不是同时启动,在启动过程中可能会抛出异常,可以不用理会,等两个节点都完成启动后,
应该会有类似这样的提示,并且两边都不再出现异常。
Registered instance EUREKASERVER/localhost:eurekaserver:8762 with status UP (replication=true)
...
Running the evict task with compensationTime 0ms
**在浏览器打开网址(本机地址+端口),上面自定义使用8762端口而不是默认的8761端口:http://192.168.43.104:8762/
,正常会进入Eureka的界面,如果正常会有下方图片中指示位置的相关信息,例如

一些知识点:
- 当你将Eureka客户端分别部署在不同的区间(zone)时,你可能会希望这些客户端优先调用注册在所在区间的服务用例,那么你可以为服务添加以下配置:
eureka.client.preferSameZoneEureka = true
eureka.instance.metadataMap.zone = zone1
第一个参数设置同区优先调用
第二个参数设置服务实例所在区(即服务部署在哪个zone)
如果你将服务的另外个实例部署到其他主机,同时也希望其他主机上面的客户端优先调用那个实例,那么那个实例也需要做上面的配置,将zone1换成对应的zone即可。
- 每个EurekaServer端即是服务器端又是客户端,并且需要至少一个serviceUrl配置来定位端点。单机版时配置自身,双节的时互相注册,多节点时可以将这部分单独出来作为通用部分,此次双节点就是单独将这部分拿出来,换成互相注册也是可以的。
...
官方文档
Eureka at a glance
Self Preservation Mode
Eureka REST operations
FAQ
Spring Cloud Netflix