在我们平时的生产环境中,很难保证单节点的eureka服务能提供百分百不间断的服务,如果eureka无响应了,整个项目应用都会出现问题,因此要保证eureka随时都能提供服务的情况下,最好的方式就是采用eureka的集群模式,也就是搭建eureka的高可用,在eureka的集群模式下,多个eureka server之间可以同步注册服务,因此,在一个eureka宕掉的情况下,仍然可以提供服务注册和服务发现的能力,从而达到注册中心的高可用。
主要讲一下搭建Eureka集群的方法和可能遇到的坑。
环境:spring boot 2.1.3 、eclipse
- 创建项目
创建一个父Maven项目(项目名:springcloud),模板选择快速开始就可以,因为父module不需要放代码就删掉了src目录。然后父项目pom文件:
<?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.roy</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>springcloud</name>
<url>http://maven.apache.org</url>
<!--父级:Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<!--参数 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!--Spring Cloud 版本序列配置 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--Spring Boot 执行器组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Spring Cloud 基础 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<!--Spring Cloud 服务注册组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--此处的依赖是SpringBoot2.0以后专用的,如果您使用的SpringBoot版本低于2.0请使用spring-cloud-starter-eureka-server -->
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--Spring Boot Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring Boot 测试组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<modules>
<module>eureka</module>
<module>eureka-hi</module>
</modules>
</project>
再新建一个子module(模板选择快速开始就ok)作为服务注册中心,命名为eureka,因为依赖都在父module里了,这里的pom文件默认就可以。新建一个yml文件:
---
# 高可用节点1的配置
server:
port: 8761
spring:
# 节点1的标签
profiles: peer1
# 服务名保持一致
application:
name: eureka
eureka:
instance:
hostname: peer1
prefer-ip-address: false
client:
# 进行注册(高可用配置、默认配置)
# registerWithEureka: true
# 获取注册信息(高可用配置、默认配置)
# fetchRegistry: true
service-url:
# 节点1向节点2/3进行服务注册
defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/
---
# 高可用节点2的配置
server:
port: 8762
spring:
# 节点2的标签
profiles: peer2
# 服务名保持一致
application:
name: eureka
eureka:
instance:
prefer-ip-address: false
hostname: peer2
client:
# 进行注册(高可用配置、默认配置)
# registerWithEureka: true
# 获取注册信息(高可用配置、默认配置)
# fetchRegistry: true
service-url:
# 节点2向节点1/3进行服务注册
defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/
---
# 高可用节点3的配置
server:
port: 8763
spring:
# 节点3的标签
profiles: peer3
# 服务名保持一致
application:
name: eureka
eureka:
instance:
hostname: peer3
prefer-ip-address: false
client:
# 进行注册(高可用配置、默认配置)
# registerWithEureka: true
# 获取注册信息(高可用配置、默认配置)
# fetchRegistry: true
service-url:
# 节点3向节点1/2进行服务注册
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
到此高可用的服务注册中心就完成了
2. Eclipse中Run Configuration的配置
在run configuration中新建三个Spring Boot App。配置项目名(相同)、mainclass(相同),还有Arguments=>Program arguments配置--spring.profiles.active=peer1
(peer1、peer2、peer3为yml文件里设置的节点标签)然后分别运行三个Spring Boot App
3.盘点一下遇到的坑
所有服务显示在了unavailable-replicas之下,可能原因有以下几点:
- defaultZone配置项
eureka.client.serviceUrl.defaultZone配置项的地址,不能使用localhost,要使用域名,DNS解析请自行配置。
host文件添加域名映射:
127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3
- spring.application.name要一致(这个个人测试默认不配也可以)
spring:
# 服务名保持一致
application:
name: eureka
- 配置eureka.instance.hostname(好像看到过正常eureka会自动拉取设备host,但各节点在同一机器下时请务必添加,注意各节点配置自己节点的host)
eureka:
instance:
hostname: peer2
- 千折腾万折腾还是不好使的时候,请去掉下面这个参数或者改为false(神坑),未找到官方原因。。
eureka:
instance:
prefer-ip-address: false