最近在學習微服務,自己也實踐了一下Eureka服務端集羣搭建方法,其中也踩了很多的坑,記錄下來.才發現學習過程中以爲很簡單的問題在實踐的時候遇到了很多的問題,在一步步解決的過程中也學到了很多.
我以搭建三個server集羣爲例,一步步來實現一下,
1.pom.xml
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>server01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>server01</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
2.配置文件:
服務端1: 10001端口,將其註冊到10002,10003端口的eureka下
server:
port: 10001
spring:
application:
name: eureka-server
eureka:
instance:
hostname: eureka01
instance-id: eureka-server-01
# prefer-ip-address: true
client:
service-url:
defaultZone: http://eureka02:10002/eureka/,http://eureka03:10003/eureka/
服務端2:10002端口,註冊到10001和10003端口的eureka下
spring:
application:
name: eureka-server
server:
port: 10002
eureka:
instance:
hostname: eureka02
instance-id: eureka-server-02
# prefer-ip-address: true
client:
service-url:
defaultZone: http://eureka03:10003/eureka/,http://eureka01:10001/eureka/
服務端3:10003端口, 註冊到10001及10002下
spring:
application:
name: eureka-server
server:
port: 10003
eureka:
instance:
# prefer-ip-address: true
instance-id: eureka-server-03
hostname: eureka03
client:
service-url:
defaultZone: http://eureka01:10001/eureka/,http://eureka02:10002/eureka/
域名配置:
我們測試分別用eureka01,eureka02,eureka03來訪問
啓動類配置
測試
話不多說,開始啓動
結果:
10001Server:
10002Server:
可以看到 在DS replicas中有了可用的集羣eureka01和eureka03,並且它們都出現在了avaiable-replicas中 .
注意事項:
配置文件中:
三個服務器的application.name要相同,表示三個服務器提供的都是eureka服務,形成集羣,並且必須配置defaultZone項,並且地址中一定不要出現空格,多個地址用逗號分割,否則都無法啓動
出現的問題:
①我在測試時出現了server01每次啓動都是在默認的http:localhost:8761/eureka啓動,導致server02和server03一直報錯,無法啓動.
檢查以下問題:
1.端口是否被佔用
2.defaultZone配置是否出錯,末尾是否包含多餘的空格
②三個服務都可以啓動,但是無法形成集羣,即DS Replica中沒有形成集羣的服務,沒有互相發現對方
檢查:
1.三個服務的application.name是否相同
③服務都可以啓動,但是都出現在unavaiable-replicas中,
請檢查:
1.eureka.client.serviceUrl.defaultZone配置項的地址,不能使用localhost,要使用域名,hosts請自行配置。
2.spring.application.name要一致(測試默認不配也可以)
3.如下兩個參數需配爲true(默認不配也可行)
4.配置eureka.instance.hostname(好像看到過正常eureka會自動拉取設備host,但各節點在同一機器下時請務必添加,注意各節點配置自己節點的host)
5.千折騰萬折騰還是不好使的時候,請去掉下面這個參數或者改爲false(神坑),暫時未找到原因 .prefer-ip-address
客戶端測試:
我們啓動一個客戶端,將其只註冊到server01上,看server02和server03能否發現到這個client服務.
默認將在8080端口啓動 :
分別訪問eureka01:10001,eureka02:10002,eureka03:10003
可以看到 ,集羣成功搭建,我們將服務註冊到eureka01中,eureka02和eureka03也從eureka01中複製到了其中的服務.
至此,三個節點的Eureka註冊中心集羣搭建完成, 過程對於我這樣的新手來說也是很坎坷,遇到了很多奇怪的問題,但不重要,重要的是整個學習過程.