1. 搭建 Eureka Server
? ? 1. Eureka介紹
????????Eureka 是由 Java 語(yǔ)言開(kāi)發(fā)的,在Spring Cloud中使用 spring Boot 技術(shù)對(duì) Eureka 進(jìn)行了封裝。所以項(xiàng)目引入Eureka 對(duì)應(yīng)的 starter 包(spring-cloud-starter-netflix-eureka-server),就使得項(xiàng)目具有了注冊(cè)中心的功能。
? ? 2. 添加依賴(lài)
? ? ? ? 1. 添加項(xiàng)目的 parent 依賴(lài)
? ?????<parent>
????????????<groupId>org.springframework.boot</groupId>
????????????<artifactId>spring-boot-starter-parent</artifactId>
????????????<version>2.1.3.RELEASE</version>
????????????<relativePath/>
????????</parent>
? ? ? ?2. 添加 Spring Cloud 的依賴(lài)信息:
? ???????????properties中定義了常用的變量,例如默認(rèn)的JDK版本1.8,springCloud的版本Greenwich.SR1。
? ? ? ??<properties>
????????????<java.version>1.8</java.version>
????????????<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
????????</properties>
? ? ?????dependencyManagement 設(shè)置項(xiàng)目使用的 spring Cloud 版本,此處使用Greenwich.SR1。
? ??????<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>
? ? 3. 添加 Eureka 依賴(lài)包
? ? ? ? 添加 Eureka server 依賴(lài)包,在pom中添加 jar包依賴(lài):
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
????????????<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
????????</dependency>
? ? ?注意
? ? ? ? ?如果 JDK 使用的是版本 9 以上,運(yùn)行項(xiàng)目就會(huì)出現(xiàn) java.lang.TypeNotPresentException: Type javax.xml.bind/JAXBContext not present 異常,這是因?yàn)?JAXB-API是 Java EE 的一部分,在 JDK 9版本以上,沒(méi)有在默認(rèn)的類(lèi)路徑中,需要手動(dòng)引入 JAXB 依賴(lài)包。
????<dependency>
????????<groupId>javax.xml.bind</groupId>
????????<artifactId>jaxb-api</artifactId>
????????<version>2.3.0</version>
????</dependency>
????<dependency>
????????<groupId>com.sun.xml.bin</groupId>
????????<artifactId>jaxb-impl</artifactId>
????????<version>2.3.0</version>
????</dependency>
????<dependency>
????????<groupId>org.glassfish.jaxb</groupId>
????????<artifactId>jaxb-runtime</artifactId>
????????<version>2.3.0</version>
????</dependency>
????<dependency>
????????<groupId>javax.activation</groupId>
????????<artifactId>activation</artifactId>
????????<version>1.1.1</version>
????</dependency>
3. 啟動(dòng)類(lèi)????
在啟動(dòng)類(lèi)中添加注解,開(kāi)啟 Eureka Server 功能:添加 @EnableEurekaServer 注解,開(kāi)啟注冊(cè)中心服務(wù)發(fā)現(xiàn)功能。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //開(kāi)啟注冊(cè)中心服務(wù)發(fā)現(xiàn)的功能
public class EurekaCenterApplication {
????public static void main(String[] args) {
????????SpringApplication.run(EurekaCenterApplication.class, args);
????????System.out.println("----- Eureka server register center start success! -----http://localhost:8081/");
????}
}
4. 配置文件
? ? 添加 Eureka 的基礎(chǔ)配置文件,如下:
? ??????#注冊(cè)中心服務(wù)端口號(hào)(項(xiàng)目啟動(dòng)的端口)
????????server.port=8091
????????#項(xiàng)目名稱(chēng)
????????spring.application.name=eureka-server
????????#配置注冊(cè)中心
????????eureka.instance.hostname=eureka-a
? ??????#表示是否將自己注冊(cè)到 Eureka server,默認(rèn)為true,注冊(cè)中心項(xiàng)目改為false
????????eureka.client.register-with-eureka=false
????????#表示是否從 Eureka server 獲取注冊(cè)信息,默認(rèn)為true,注冊(cè)中心項(xiàng)目改為false
? ? ????eureka.client.fetch-registry=false #標(biāo)志此服務(wù)是否要去注冊(cè)中心,獲取服務(wù)列表信息,false(注冊(cè)中心是提供服務(wù)列表的)
? ? ????eureka.client.service-url.defaultZone= http://localhost:8091/eureka
5. 測(cè)試
? ? 此時(shí) Eureka 服務(wù)已經(jīng)搭建好了,在啟動(dòng)類(lèi)上 run 啟動(dòng)項(xiàng)目。等待啟動(dòng)完成后,在瀏覽器上訪問(wèn):http://localhost:8091/,就可以看到Eureka注冊(cè)中心的可視化界面。
? ? 此時(shí),可以發(fā)現(xiàn)后臺(tái)頁(yè)面被分為了五塊:
? ? 1. System Status:主要展示系統(tǒng)狀態(tài),比如啟動(dòng)時(shí)間等。
? ? 2. DS Replicas:該服務(wù)從哪里同步數(shù)據(jù)。
? ? 3. Instance currently registered with Eureka:注冊(cè)在Eureka的實(shí)例里列表。
? ? 4. General Info:系統(tǒng)運(yùn)行環(huán)境,比如內(nèi)存、CPU等。
? ? 5. Instance Info:本服務(wù)的基礎(chǔ)信息,比如IP地址、狀態(tài)等。

6. 搭建 Eureka 集群
? ? 開(kāi)啟 Eureka 集群配置后,服務(wù)啟動(dòng)時(shí) Eureka Server 會(huì)將注冊(cè)信息 向其他 Eureka Server 進(jìn)行同步,因此搭建高可用架構(gòu)只需要將 Eureka Server 配置指向其他可用的 serviceUrl 即可。
? ? 在上面的 Eureka 單個(gè)實(shí)例的基礎(chǔ)上,復(fù)制三份來(lái)分別命名為:eureka-a、eureka-b、eureka-c三個(gè)示例項(xiàng)目,可以使用這三個(gè)示例項(xiàng)目,使用這三個(gè)示例項(xiàng)目搭建 Eureka Server 集群。
? ? 接下來(lái)分別修改?eureka-a、eureka-b、eureka-c 的配置信息。
? ? 1. eureka-a 的配置信息如下:
? ??????server.port:8091
? ??????spring.application.name=eureka-server
? ? ? ? # 配置信息,相當(dāng)于給服務(wù)起個(gè)別名注冊(cè)到注冊(cè)中心
? ??????eureka.instance.hostname=eureka-a
? ? ? ? # 指向其他兩個(gè)注冊(cè)中心
? ??????eureka.client.serviceUrl.defaultZone=http://eureka-b:8092/eureka/,http://eureka-c:8093/eureka/
? ? ? ? # 配置為true,表示將自己注冊(cè)到注冊(cè)中心,并且從注冊(cè)中心獲取注冊(cè)信息。
? ??????eureka.client.register-with-eureka=true
????????eureka.client.fetch-registry=true
????2.?eureka-b 的配置信息如下:
? ??????server.port:8092
? ??????spring.application.name=eureka-server
? ??????eureka.instance.hostname=eureka-b
? ??????eureka.client.serviceUrl.defaultZone=http://eureka-a:8091/eureka/,http://eureka-c:8093/eureka/
? ??????eureka.client.register-with-eureka=true
????????eureka.client.fetch-registry=true
? ? 3.?eureka-c 的配置信息如下:
? ? ? ? server.port:8093
? ??????spring.application.name=eureka-server
????????eureka.instance.hostname=eureka-c
????????eureka.client.serviceUrl.defaultZone=http://eureka-a:8091/eureka/,http://eureka-b:8092/eureka/
????????eureka.client.register-with-eureka=true
????????eureka.client.fetch-registry=true
? ? ?4. 測(cè)試
????????本機(jī)直接訪問(wèn) eureka-a/b/c 網(wǎng)絡(luò)是不通的,需要配置 host 信息。在 Windows 的 C:\Windows\System32\drivers\hosts 或者 Linux 的 /etc/hoosts 文件末添加以下信息:
? ? ????127.0.0.1 eureka-a eureka-b eureka-c
? ? ????添加完之后,依次啟動(dòng) eureka-a、?eureka-b、?eureka-c服務(wù),等全部啟動(dòng)完成之后,瀏覽器訪問(wèn)地址:http://localhost:8091/,就可以看到頁(yè)面的集群相關(guān)信息。
? ? ? ? 此時(shí)在 DS Replicas 模塊中可以看到另外兩臺(tái)注冊(cè)中心的別名(eureka-b 和 eureka-c);在 Instance currently registered with Eureka 模塊中可以看到三個(gè)注冊(cè)中心都以實(shí)例的形式注冊(cè)到了注冊(cè)中心。

? ? ? ? ?在 General Info 模塊中,可以看到 registered-replicas(已經(jīng)注冊(cè)到的副本)和 available-replicas(有效副本)都可以看到其他兩個(gè)注冊(cè)中心的信息。

此時(shí) 證明 Eureka Server 高可用集群搭建成功。
7. 常見(jiàn)問(wèn)題
? ? 1. Eureka 的 UNKNOWN 問(wèn)題
? ? ? ? ? ? 注冊(cè)中心(Eureka Server)中的服務(wù)狀態(tài),常見(jiàn)的有 UP、DOWN,但有時(shí)會(huì)出現(xiàn)另外一種 UNKNOWN 狀態(tài),或者 UNKNOWN 服務(wù)名。
? ? ? ? 1.?UNKNOWN 服務(wù)名
? ??????????UNKNOWN 服務(wù)名是因?yàn)樵陧?xiàng)目中沒(méi)有配置應(yīng)用實(shí)例名稱(chēng)導(dǎo)致的,其配置參數(shù)為 spring.application.name 或者 eureka.instance.application,如果這兩個(gè)參數(shù)都不配置,就會(huì)出現(xiàn)UNKNOWN 服務(wù)名。
? ????? 2.?UNKNOWN 狀態(tài)
? ??????????UNKNOWN 狀態(tài)出現(xiàn)的幾率很小,這是 eureka server沒(méi)有獲取到客戶端的心跳導(dǎo)致的,如果將 eureka.client.healthcheck.enabled = true 配置到 bootstrap.yml也會(huì)導(dǎo)致此問(wèn)題,此參數(shù)應(yīng)該配置到 application.yml 文件中。
? ? 2. 注冊(cè)中心的副本不可用(unavailable-replicas)
? ? ? ? 在搭建 eureka 集群時(shí)可能會(huì)出現(xiàn),注冊(cè)中心服務(wù)不可用的情況,其他eureka server 的地址進(jìn)入了 unavailable-replicas中,導(dǎo)致這種情況的原因有很多:

????1. eureka.client.serverUrl.defaultZone 配置地址錯(cuò)誤。
? ? 2. 沒(méi)有開(kāi)啟互相注冊(cè):
? ??????eureka.client.register-with-eureka=true
????????eureka.client.fetch-registry=true
? ? 3. 沒(méi)有配置host信息