基于DNS搭建高可用Eureka注冊(cè)中心

單節(jié)點(diǎn)注冊(cè)中心搭建

1、打開(kāi)網(wǎng)頁(yè):https://start.spring.io

start.spring.io

按Alt + 回車鍵,將會(huì)生成eureka-server.zip,解壓縮后得到一個(gè)maven 項(xiàng)目,將該項(xiàng)目錄入IDE。

2、在IDE導(dǎo)入Maven項(xiàng)目

導(dǎo)入maven項(xiàng)目

我們首先來(lái)看一下pom文件,可以看出項(xiàng)目中引用了spring-cloud-starter-netflix-eureka-server, 并且springboot 的版本號(hào)為:2.1.2.RELEASE, Spring Cloud的版本號(hào)為:Greenwich.RC2RC2 表示還沒(méi)有正式發(fā)布,只是第二個(gè)Release Candidate。
接下來(lái)我們只需要兩個(gè)步驟,
a、修改EurekaServerApplication, 在@SpringBootApplication的注解上面,加入一個(gè)新的注解:@EnableEurekaServer
b、在resources 目錄中加入application.yml 文件, 并配置以下信息:

spring:
? application:
? ? name: Eureka-Server
server:
? port: 8761

第一臺(tái)Eureka中心

一個(gè)簡(jiǎn)單的Eureka 注冊(cè)中心就已經(jīng)可以使用了,我們運(yùn)行一下這個(gè)spring boot 應(yīng)用,找開(kāi)瀏覽器:localhost:8761,即可看到我們的注冊(cè)中心就已經(jīng)運(yùn)行啟來(lái)了。并且EUREKA-SERVER也注冊(cè)到自己的注冊(cè)中心了。


Eureka注冊(cè)中心的高可用集群配置

單節(jié)點(diǎn)的注冊(cè)中心已經(jīng)搭建完畢,但單節(jié)點(diǎn)的注冊(cè)中心存在單點(diǎn)故障的可能,不能用于生產(chǎn)環(huán)境。生產(chǎn)環(huán)境的Eureka一般采用集群方式進(jìn)行部署。

一、典型的集群配置

spring:
? application:
? ? name: Eureka-Server
server:
? port: 8761
eureka:
? instance:
? ? hostname: host1
? ? healthCheckUrlPath: /health
? ? preferIpAddress: false
? ? instance-id: ${spring.cloud.client.ip-address}:${server.port}
? client:
? ? region: default
? ? serviceUrl:
? ? ? defaultZone: http://host2:8762/eureka/,http://host3:8763/eureka/,http://host4:8764/eureka/
? ? eurekaServerURLContext: eureka
? ? registerWithEureka: true
? ? fetchRegistry: true

通過(guò)client.serviceUrl.defaultZone配置多個(gè)peer節(jié)點(diǎn),因?yàn)槭窃趩螜C(jī)上測(cè)試,所以修改了host文件,并且使用不同的端口號(hào)來(lái)啟動(dòng)注冊(cè)中心。正式的生產(chǎn)環(huán)境請(qǐng)根據(jù)自己的實(shí)際情況進(jìn)行配置,比如:第一臺(tái)Eureka的IP地址為:192.168.0.100,則defaultZone配置其他三臺(tái)注冊(cè)中心http://192.168.0.101:8761/eureka/,http://192.168.0.102:8761/eureka/,http://192.168.0.103:8761/eureka/
依次啟動(dòng)4臺(tái)注冊(cè)中心,打開(kāi)網(wǎng)頁(yè):http://localhost:8764

高可用注冊(cè)中心

可以看到其它三臺(tái)注冊(cè)中心已經(jīng)出現(xiàn)在已注冊(cè)的replicas和可用的replicas列表里邊。

典型集群方案的幾個(gè)缺點(diǎn)

1.?無(wú)法快速擴(kuò)容

典型注冊(cè)中心集群方案

如上圖所示,4臺(tái)注冊(cè)中心,每臺(tái)注冊(cè)中心需要配置其他三臺(tái)服務(wù)器,以Eureka 1為例,其配置如下:

defaultZone: http://172.18.10.2:8761/eureka/,http://172.18.10.3:8761/eureka/,http://172.18.10.4:8761/eureka/?

注冊(cè)中心是本應(yīng)該是無(wú)狀態(tài)的,可以橫向擴(kuò)展。但由于每臺(tái)注冊(cè)中心的配置都不一樣,所以擴(kuò)展起來(lái)比較麻煩,需要修改配置文件,這樣就無(wú)法做到快速的擴(kuò)容。

2.違反開(kāi)閉原則(Open Close Principle)

微服務(wù)客戶端需要配置注冊(cè)中心的地址,使用的是如下的配置:

defaultZone:http://172.18.10.1:8761/eureka/,http://172.18.10.2:8761/eureka/,http://172.18.10.3:8761/eureka/,http://172.18.10.4:8761/eureka/

由于配置的是固定的IP地址,如果我們要擴(kuò)容注冊(cè)中心,增加新的注冊(cè)中心節(jié)點(diǎn),那我們就需要修改微服務(wù)客戶端的配置文件,將新的注冊(cè)中心節(jié)點(diǎn)進(jìn)入的服務(wù)器列表中。試想一下,如果有幾十個(gè)微服務(wù),每個(gè)微服務(wù)有4個(gè)節(jié)點(diǎn),那將會(huì)要修改上百個(gè)配置文件。很顯然這種方式不太可取,從軟件設(shè)計(jì)角度來(lái)說(shuō),違反了開(kāi)閉原則。



Eureka天生就是云原生應(yīng)用

其實(shí)Eureka?注冊(cè)中心還有另一種高可用配置方式,基于DNS。Eureka天生就可以部署在像AWS這樣的公有云上,并且可以跨Region,跨Available Zone部署。雖然我們不用部署在云端,依然可以利用這一特性,我們可以把Region看作我們數(shù)據(jù)中心的機(jī)房,Avaiable Zone?看作是機(jī)房中的網(wǎng)絡(luò)區(qū)域,結(jié)合內(nèi)部DNS服務(wù)來(lái)實(shí)現(xiàn)高可用的注冊(cè)中心。

如何實(shí)現(xiàn)基于DNS的高可用注冊(cè)中心

第一步、修改配置文件

spring:
????application:
????name: Eureka-Server
server:
????port: 8761
eureka:
????instance:
????????healthCheckUrlPath: /health
????????preferIpAddress: true
????????instance-id: ${spring.cloud.client.ipAddress}:${server.port}
????client:?
? ? ? ? region: default
????????eurekaServerPort: 8761
????????useDnsForFetchingServiceUrls: true
????????eurekaServerDNSName: eureka.txzq.com.cn?
????????eurekaServerURLContext: eureka
????????registerWithEureka: true
????????fetchRegistry: true

畫重點(diǎn):
a.?region: default,配置地區(qū)
b. useDnsForFetchingServiceUrls,表示基于DNS獲取服務(wù)信息
c. eurekaServerDNSName: eureka.txzq.com.cn,配置域名服務(wù)器名稱

第二步、在域名服務(wù)器上增加 txt?記錄

鍵:txt.default.eureka.txzq.com.cn 值:shenzhen.eureka.txzq.com.cn
鍵:txt.shenzhen.eureka.txzq.com.cn 值:172.18.10.1?172.18.10.2?172.18.10.3?172.18.10.4

第一條記錄表示,default?區(qū)域,包含了哪些可用區(qū),我們用shenzhen表示是深圳機(jī)房,txt記錄的值就設(shè)置為:shenzhen.eureka.txzq.com.cn
第二第記錄表示 , shenzhen機(jī)房有哪些服務(wù)器,多臺(tái)服務(wù)器使用空格格開(kāi)。
如果在本地測(cè)試,需要搭建一臺(tái)自己的DNS服務(wù)器,可以參考我的另一篇文章:基于Docker快速搭建DNS Server

BIND DNS Server?主界面
添加Client View

Client View是指DNS服務(wù)應(yīng)用到哪一個(gè)網(wǎng)段,比如:172.18.10.0/24網(wǎng)段的IP連接到BIND服務(wù)器,才會(huì)解析指定的域名。

添加頂級(jí)域名

在添加域名的時(shí)候,需要指定Client View,這里我們選擇我們剛剛創(chuàng)建的View_172.18.10.0,指的是只有在這個(gè)網(wǎng)段的IP訪問(wèn)這臺(tái)DNS服務(wù)器,才能解析。

添加www一級(jí)域名

添加完一級(jí)域名后我們刷一下這個(gè)ZONE,然后設(shè)置一下本地DNS服務(wù)器

設(shè)置本地DNS服務(wù)器
驗(yàn)證域名解析

DNS域名服務(wù)器驗(yàn)證通過(guò)后,我們接下來(lái)就可以在為這個(gè)域名添加我們所需要的txt?記錄了。

添加TXT記錄

到這里我們的準(zhǔn)備工作就已經(jīng)基本完成了。使用Maven將注冊(cè)中心編譯成,輸出jar包。新建一個(gè)Eureka的docker鏡像,并啟動(dòng)4個(gè)容器?;贒NS的注冊(cè)中心就搭建完畢了。

你只需要對(duì)DNS記錄進(jìn)行變更,就可以實(shí)現(xiàn)動(dòng)態(tài)的、快速擴(kuò)容/縮容了。

關(guān)于如何將Eureka部署到Docker,請(qǐng)參考另一篇文章:

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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