一文搞定 Eureka 集群高可用配置
點(diǎn)擊上方藍(lán)色“架構(gòu)薈萃”關(guān)注我們,輸入1024,你懂的

前言
點(diǎn)對(duì)點(diǎn)去中心化的架構(gòu):解決單點(diǎn)問(wèn)題
通過(guò)部署多節(jié)點(diǎn) Eureka 實(shí)例,避免單點(diǎn)問(wèn)題,滿足高可用架構(gòu)。同時(shí)節(jié)點(diǎn)之間的地位是平等,節(jié)點(diǎn)通信方式采用點(diǎn)對(duì)點(diǎn)方式(peer to peer),以便滿足數(shù)據(jù)同步問(wèn)題,這是一種去中心化的分布式架構(gòu)。
在這種架構(gòu)中,peer 節(jié)點(diǎn)之間通過(guò)相互注冊(cè)來(lái)提高可用性,每個(gè)peer節(jié)點(diǎn)通過(guò)serviceUrl指定其他peer節(jié)點(diǎn)。

如果某臺(tái)Eureka服務(wù)器宕機(jī),Eureka客戶端的請(qǐng)求會(huì)自動(dòng)切換到新的Eureka服務(wù)器節(jié)點(diǎn),當(dāng)宕機(jī)的服務(wù)器重新恢復(fù)后,Eureka會(huì)再次將其納入到服務(wù)器集群管理中。當(dāng)節(jié)點(diǎn)開(kāi)始接受客戶端請(qǐng)求時(shí),所有的操作也會(huì)進(jìn)行節(jié)點(diǎn)間復(fù)制,將請(qǐng)求復(fù)制到其他Eureka服務(wù)器當(dāng)前所知的節(jié)點(diǎn)中。這點(diǎn)和Zookeeper的master/salve集中化機(jī)構(gòu)有很大的區(qū)別,zookeeper認(rèn)為任何時(shí)候都要一個(gè)master節(jié)點(diǎn),滿足節(jié)點(diǎn)之間任務(wù)調(diào)度和節(jié)點(diǎn)路由問(wèn)題,保證的是CP原理,是一種集中式中心化分布式架構(gòu)。
Eureka 客戶端負(fù)載均衡
用過(guò) Eureka 的同學(xué)知道,當(dāng)一個(gè)微服務(wù)向注冊(cè)中心注冊(cè)成功后,會(huì)返回狀態(tài)碼204,同時(shí)會(huì)獲取注冊(cè)中心的服務(wù)列表緩存在本地,以便滿足Feign以及Ribbon的調(diào)用,這是所謂的客戶端負(fù)載均衡。
peer 節(jié)點(diǎn)通信機(jī)制
為了讓每個(gè)peer節(jié)點(diǎn)都能夠獲取所有注冊(cè)服務(wù)列表,Eureka的做法是peer節(jié)點(diǎn)之間相互復(fù)制注冊(cè)服務(wù)信息列表來(lái)實(shí)現(xiàn)同步,這樣每個(gè)peer節(jié)點(diǎn)都有一份所有注冊(cè)服務(wù)列表的一套副本。
CAP 原理
CAP原理的誕生源于對(duì)分布式架構(gòu)的發(fā)展,特別是微服務(wù)架構(gòu)下對(duì)于分布式數(shù)據(jù)庫(kù)環(huán)境要求。
Eureka屬于AP架構(gòu),Eureka認(rèn)為每個(gè)節(jié)點(diǎn)最先要保證的是對(duì)外提供服務(wù),即使每個(gè)節(jié)點(diǎn)隔離或者失去聯(lián)系也要對(duì)外保證注冊(cè)中心高可用,但這樣會(huì)導(dǎo)致每個(gè)節(jié)點(diǎn)的數(shù)據(jù)可能存在不一致性。
Eureka Server 集群高可用配置
新建 dcp-eureka-peer1、dcp-eureka-peer2、dcp-eureka-peer3工程,添加maven依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server
</artifactId>
</dependency>
dcp-eureka-peer1啟動(dòng)文件設(shè)置:bootstrap.yml
server:
port: 8761
spring:
application:
name: dcp-eureka-peer1
eureka:
client:
# 是否注冊(cè)到eureka
register-with-eureka: false
# 是否從eureka獲取注冊(cè)信息
fetch-registry: false
service-url:
defaultZone: http://dcp-eureka-peer2:8762/eureka/,http://dcp-eureka-peer3:8763/eureka/...
dcp-eureka-peer2啟動(dòng)文件設(shè)置:bootstrap.yml
server:
port: 8762
spring:
application:
name: dcp-eureka-peer2
eureka:
client:
# 是否注冊(cè)到eureka
register-with-eureka: false
# 是否從eureka獲取注冊(cè)信息
fetch-registry: false
service-url:
defaultZone: http://dcp-eureka-peer1:8761/eureka/,http://dcp-eureka-peer3:8763/eureka/...
dcp-eureka-peer3啟動(dòng)文件設(shè)置:bootstrap.yml
server:
port: 8763
spring:
application:
name: dcp-eureka-peer3
eureka:
client:
# 是否注冊(cè)到 eureka
register-with-eureka: false
# 是否從eureka獲取注冊(cè)信息
fetch-registry: false
service-url:
defaultZone: http://dcp-eureka-peer1:8761/eureka/,http://dcp-eureka-peer2:8762/eureka/...
本機(jī)host文件配置
127.0.0.1 dcp-eureka-peer1
127.0.0.1 dcp-eureka-peer2
127.0.0.1 dcp-eureka-peer3
Eureka Peer1啟動(dòng)類配置,Eureka Peer2、Eureka Peer3寫法類似。
@EnableEurekaServer
@SpringBootApplication
public class EurekaPeer1 {
public static void main(String[] args) {
SpringApplication.run(EurekaPeer1.class, args);
}
}
Eureka客戶端配置
新建dcp-helloworld-service工程,添加maven依賴
<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-client</artifactId>
</dependency>
啟動(dòng)文件設(shè)置:bootstrap.yml
# server
server:
port: 8001
# spring
spring:
application:
name: dcp-hellworld-service
# eureka
eureka:
client:
serviceUrl:
defaultZone: http://dcp-eureka-peer1:8761/eureka/,http://dcp-eureka-peer2:8761/eureka/,http://dcp-eureka-peer3:8761/eureka/
instance:
status-page-url-path: /info
instanceId: ${spring.application.name}:${random.value}
prefer-ip-address: true
registry-fetch-interval-seconds: 30
lease-renewal-interval-in-seconds: 15
lease-expiration-duration-in-seconds: 15
在hello服務(wù)如何注冊(cè)到Eureka關(guān)鍵點(diǎn)在于eureka.client.serviceUrl.defaultZone參數(shù)值。
http://dcp-eureka-peer1:8761/eureka/,http://dcp-eureka-peer2:8761/eureka/,http://dcp-eureka-peer3:8761/eureka/
一般情況下,默認(rèn)配置Eureka注冊(cè)地址是:http://localhost:8761/eureka/,但是在實(shí)際的生產(chǎn)環(huán)境是不建議配置單節(jié)點(diǎn)的Eureka,目的是防止Eureka注冊(cè)中心宕機(jī),導(dǎo)致所有微服務(wù)不可用。
所以,在生產(chǎn)環(huán)境一般配置高可用的eureka注冊(cè)中心,標(biāo)配是三個(gè)節(jié)點(diǎn), 可以部署到在K8s平臺(tái)的Docker容器里,便于集群管理。
用k8s部署服務(wù)有很多好處,其中之一就是當(dāng)某個(gè)Eureka注冊(cè)中心節(jié)點(diǎn)掛了,K8s會(huì)智能檢測(cè)Eureka的容器實(shí)例運(yùn)行狀態(tài)并把不可用的Eureka節(jié)點(diǎn)移除掉,然后會(huì)重新啟動(dòng)新的Eureka容器實(shí)例,始終保持三個(gè)活的Eureka注冊(cè)中心節(jié)點(diǎn),這樣就做到了Eureka注冊(cè)中心高可用了。
小試牛刀
啟動(dòng)dcp-eureka-peer1注冊(cè)中心節(jié)點(diǎn),日志輸出信息:
c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://dcp-eureka-peer3:8763/eureka/, http://dcp-eureka-peer2:8762/eureka/]
啟動(dòng)dcp-eureka-peer2注冊(cè)中心節(jié)點(diǎn),日志輸出信息:
c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://dcp-eureka-peer3:8763/eureka/, http://dcp-eureka-peer1:8761/eureka/]
啟動(dòng)dcp-eureka-peer3注冊(cè)中心節(jié)點(diǎn),日志輸出信息:
c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://dcp-eureka-peer2:8762/eureka/, http://dcp-eureka-peer1:8761/eureka/]
啟動(dòng)dcp-hellworld-service eureka客戶端服務(wù)注冊(cè),日志輸出信息:
com.netflix.discovery.DiscoveryClient : DiscoveryClient_DCP-HELLWORLD-SERVICE/dcp-hellworld-service:806af348fd3d07e6543fe2bf8c103b37 - registration status: 204
打開(kāi)在瀏覽器Eureka注冊(cè)中心頁(yè)面地址:http://localhost:8761/
Eureka 注冊(cè)中心節(jié)點(diǎn)信息

微服務(wù)列表信息

物理機(jī)信息


歡迎關(guān)注微信公眾號(hào):互聯(lián)網(wǎng)全棧架構(gòu),收取更多有價(jià)值的信息。
