在我們平時的生產環境中,很難保證單節點的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