Eureka集羣高可用配置

在我們平時的生產環境中,很難保證單節點的eureka服務能提供百分百不間斷的服務,如果eureka無響應了,整個項目應用都會出現問題,因此要保證eureka隨時都能提供服務的情況下,最好的方式就是採用eureka的集羣模式,也就是搭建eureka的高可用,在eureka的集羣模式下,多個eureka server之間可以同步註冊服務,因此,在一個eureka宕掉的情況下,仍然可以提供服務註冊和服務發現的能力,從而達到註冊中心的高可用。

主要講一下搭建Eureka集羣的方法和可能遇到的坑。
環境:spring boot 2.1.3 、eclipse

  1. 創建項目
    創建一個父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之下,可能原因有以下幾點:

  1. defaultZone配置項
    eureka.client.serviceUrl.defaultZone配置項的地址,不能使用localhost,要使用域名,DNS解析請自行配置。
    host文件添加域名映射:
127.0.0.1   peer1
127.0.0.1   peer2
127.0.0.1   peer3
  1. spring.application.name要一致(這個個人測試默認不配也可以)
spring:
  # 服務名保持一致
  application:
    name: eureka
  1. 配置eureka.instance.hostname(好像看到過正常eureka會自動拉取設備host,但各節點在同一機器下時請務必添加,注意各節點配置自己節點的host)
eureka:
  instance:
    hostname: peer2
  1. 千折騰萬折騰還是不好使的時候,請去掉下面這個參數或者改爲false(神坑),未找到官方原因。。
eureka:
  instance:
    prefer-ip-address: false
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章