Eureka 服務(wù)注冊(cè)中心的搭建

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信息

注:摘抄自 純潔的微笑、江南一點(diǎn)雨的springCloud微服務(wù)開(kāi)發(fā)實(shí)踐一書(shū)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容