场景说明
项目中使用springboot有一段时间了,在做eureka高可用集群的时候发现网上的资料各种不全,折腾了好久,翻了N篇博文,才算真正完成一个高可用的eureka注册中心的搭建,在此记录下来.开发环境:JDK8+IDEA+Maven+…
搭建过程
上面文章:springCloud踩坑系列-Eureka-单节点服务端,我们已经初步搭成了一个单节点的服务注册中心,我们在此基础上继续进行高可用版的注册中心搭建.
- 创建工程
复制项目:eureka-server1到它同级目录,重命名为:eureka-server2,修改eureka-server2的pom文件,项目名改为eureka-server2,代码为:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.vj.study</groupId>
<artifactId>eureka-server2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server2</name>
<description>Eureka project for Spring Boot</description>
<parent>
<artifactId>spring-cloud</artifactId>
<groupId>com.vj.study</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
同样操作,复制eureka-server1到它同级目录,重命名为:eureka-server3,并且修改eureka-server3的pom文件中的项目名称.
然后将eureka-server2,eureka-server3加到父项目中:
此时项目结构为:
eureka-server1,eureka-server2,eureka-server3为我们接下来部署的三个eureka服务.
- 修改配置文件
eureka-server1的yml文件修改为:
server:
port: 6021 # 指定该Eureka实例的端口
spring:
application:
name: vjEurekaServer
# cloud:
# inetutils:
# ignoredInterfaces:
# - VMware Network Adapter VMnet1
# - VMware Network Adapter VMnet8
# default-ip-address: 192.168.3.115
# preferredNetworks: 192.168.3
eureka:
environment: dev
instance:
appname: ${spring.application.name}
# hostname: ${spring.cloud.client.ipAddress} # 指定该Eureka实例的主机名
hostname: server1 # 指定该Eureka实例的主机名
# ip-address: 192.168.3.115 # 指定该Eureka实例的IP
prefer-ip-address: false # 使用IP注册
# prefer-ip-address: true # 使用IP注册
instanceId: ${eureka.instance.hostname}:${server.port}
# instanceId: ${spring.cloud.client.ipAddress}:${server.port}
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://server2:6022/eureka/,http://server3:6023/eureka/
# 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode
将eureka.client. register-with-eureka和eureka.client.fetch-registry改为true,并且修改defaultZone,将server2和server3加入进默认注册中心(server2和server3分别对应eureka-server2,eureka-server3,在eureka.instance.hostname中进行配置即可.).
eureka-server2的yml配置(修改了启动端口以及hostname和defaultZone):
server:
port: 6022 # 指定该Eureka实例的端口
spring:
application:
name: vjEurekaServer
# cloud:
# inetutils:
# ignoredInterfaces:
# - VMware Network Adapter VMnet1
# - VMware Network Adapter VMnet8
# default-ip-address: 192.168.3.115
# preferredNetworks: 192.168.3
eureka:
environment: dev
instance:
appname: ${spring.application.name}
# hostname: ${spring.cloud.client.ipAddress} # 指定该Eureka实例的主机名
hostname: server2 # 指定该Eureka实例的主机名
# ip-address: 192.168.3.115 # 指定该Eureka实例的IP
prefer-ip-address: false # 使用IP注册
# prefer-ip-address: true # 使用IP注册
instanceId: ${eureka.instance.hostname}:${server.port}
# instanceId: ${spring.cloud.client.ipAddress}:${server.port}
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://server1:6021/eureka/,http://server3:6023/eureka/
# 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode
eureka-server3的yml配置(修改了启动端口以及hostname和defaultZone):
server:
port: 6023 # 指定该Eureka实例的端口
spring:
application:
name: vjEurekaServer
# cloud:
# inetutils:
# ignoredInterfaces:
# - VMware Network Adapter VMnet1
# - VMware Network Adapter VMnet8
# default-ip-address: 192.168.3.115
# preferredNetworks: 192.168.3
eureka:
environment: dev
instance:
appname: ${spring.application.name}
# hostname: ${spring.cloud.client.ipAddress} # 指定该Eureka实例的主机名
hostname: server3 # 指定该Eureka实例的主机名
# ip-address: 192.168.3.115 # 指定该Eureka实例的IP
prefer-ip-address: false # 使用IP注册
# prefer-ip-address: true # 使用IP注册
instanceId: ${eureka.instance.hostname}:${server.port}
# instanceId: ${spring.cloud.client.ipAddress}:${server.port}
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://server1:6021/eureka/,http://server2:6022/eureka/
# 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode
注意: eureka.instance.appname必须保持一致,网上很多说和spring.application.name保持一致,其实背后隐藏的是所有的服务的appname都必须一致,个人理解这里的application指的是你的项目名而不是某个服务名.如果三个eureka.instance.appname不一致将导致服务不可用.
然后分别运行三个模块中的EurekaServerApplication,访问http://server1:6021/,页面如下:
可以看到三个服务正常启动.
- 以IP形式部署
上面我们已经成功通过改hosts的方式搭建了eureka服务中心,但实际部署中我们可能没有那么多域名,只能通过IP的方式去进行搭建,现在我们对application.yml配置文件进行修改,以适用于IP部署方式:
此处我们需要改三个地方:
prefer-ip-address:false -->true
hostname: server1 --> ${spring.cloud.client.ipAddress}
defaultZone: 将server1,server2,server3改为对应的IP.
注意,必须保持每个hostname唯一,这里使用了当前服务主机IP作为hostname,也可修改为其它,但必须保证唯一.
eureka-server1的yml配置文件为:
server:
port: 6021 # 指定该Eureka实例的端口
spring:
application:
name: vjEurekaServer
# cloud:
# inetutils:
# ignoredInterfaces:
# - VMware Network Adapter VMnet1
# - VMware Network Adapter VMnet8
# default-ip-address: 192.168.3.115
# preferredNetworks: 192.168.3
eureka:
environment: dev
instance:
appname: ${spring.application.name}
hostname: 192.168.1.3 # 指定该Eureka实例的主机名
# hostname: server1 # 指定该Eureka实例的主机名
# ip-address: 192.168.3.115 # 指定该Eureka实例的IP
# prefer-ip-address: false # 使用IP注册
prefer-ip-address: true # 使用IP注册
instanceId: ${eureka.instance.hostname}:${server.port}
# instanceId: ${spring.cloud.client.ipAddress}:${server.port}
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://192.168.1.5:6022/eureka/,http://192.168.1.3:6023/eureka/
# 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode
server2和server3的配置文件做对应修改.这里我们将server1和server3的appname设为一样的,server2与他们不一样.将server2打包后放到对应的服务器,分别运行server1,2,3,访问http://192.168.1.5:6022/,界面如下:
访问http://192.168.1.3:6021:
访问http://192.168.1.3:6023/:
可以看到,appname相同eureka-server1和eureka-server3相互注册是不成功的,因此配置的时候,如果是在同一台服务器上部署多个eureka服务,需要改hosts,并且关闭ip注册方式,如果部署在多台服务器并且以ip形式注册的时候就需要开启prefer-ip-address.但都需要保持hostname唯一.
要点总结
1.三个服务的appname必须保持一致
2.需要保持hostname唯一
3.and more…