一文搞定 Eureka 集群高可用配置
点击上方蓝色“架构荟萃”关注我们,输入1024,你懂的
前言
点对点去中心化的架构:解决单点问题
通过部署多节点 Eureka
实例,避免单点问题,满足高可用架构。同时节点之间的地位是平等,节点通信方式采用点对点方式(peer to peer
),以便满足数据同步问题,这是一种去中心化的分布式架构。
在这种架构中,peer
节点之间通过相互注册来提高可用性,每个peer
节点通过serviceUrl
指定其他peer
节点。
如果某台Eureka
服务器宕机,Eureka
客户端的请求会自动切换到新的Eureka
服务器节点,当宕机的服务器重新恢复后,Eureka
会再次将其纳入到服务器集群管理中。当节点开始接受客户端请求时,所有的操作也会进行节点间复制,将请求复制到其他Eureka
服务器当前所知的节点中。这点和Zookeeper
的master/salve
集中化机构有很大的区别,zookeeper
认为任何时候都要一个master
节点,满足节点之间任务调度和节点路由问题,保证的是CP
原理,是一种集中式中心化分布式架构。
Eureka 客户端负载均衡
用过 Eureka
的同学知道,当一个微服务向注册中心注册成功后,会返回状态码204
,同时会获取注册中心的服务列表缓存在本地,以便满足Feign
以及Ribbon
的调用,这是所谓的客户端负载均衡。
peer 节点通信机制
为了让每个peer
节点都能够获取所有注册服务列表,Eureka
的做法是peer
节点之间相互复制注册服务信息列表来实现同步,这样每个peer
节点都有一份所有注册服务列表的一套副本。
CAP 原理
CAP
原理的诞生源于对分布式架构的发展,特别是微服务架构下对于分布式数据库环境要求。
Eureka
属于AP
架构,Eureka
认为每个节点最先要保证的是对外提供服务,即使每个节点隔离或者失去联系也要对外保证注册中心高可用,但这样会导致每个节点的数据可能存在不一致性。
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
启动文件设置:bootstrap.yml
server:
port: 8761
spring:
application:
name: dcp-eureka-peer1
eureka:
client:
# 是否注册到eureka
register-with-eureka: false
# 是否从eureka获取注册信息
fetch-registry: false
service-url:
defaultZone: http://dcp-eureka-peer2:8762/eureka/,http://dcp-eureka-peer3:8763/eureka/...
dcp-eureka-peer2
启动文件设置:bootstrap.yml
server:
port: 8762
spring:
application:
name: dcp-eureka-peer2
eureka:
client:
# 是否注册到eureka
register-with-eureka: false
# 是否从eureka获取注册信息
fetch-registry: false
service-url:
defaultZone: http://dcp-eureka-peer1:8761/eureka/,http://dcp-eureka-peer3:8763/eureka/...
dcp-eureka-peer3
启动文件设置:bootstrap.yml
server:
port: 8763
spring:
application:
name: dcp-eureka-peer3
eureka:
client:
# 是否注册到 eureka
register-with-eureka: false
# 是否从eureka获取注册信息
fetch-registry: false
service-url:
defaultZone: http://dcp-eureka-peer1:8761/eureka/,http://dcp-eureka-peer2:8762/eureka/...
本机host
文件配置
127.0.0.1 dcp-eureka-peer1
127.0.0.1 dcp-eureka-peer2
127.0.0.1 dcp-eureka-peer3
Eureka Peer1
启动类配置,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>
启动文件设置: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
服务如何注册到Eureka
关键点在于eureka.client.serviceUrl.defaultZone
参数值。
http://dcp-eureka-peer1:8761/eureka/,http://dcp-eureka-peer2:8761/eureka/,http://dcp-eureka-peer3:8761/eureka/
一般情况下,默认配置Eureka
注册地址是:http://localhost:8761/eureka/
,但是在实际的生产环境是不建议配置单节点的Eureka
,目的是防止Eureka
注册中心宕机,导致所有微服务不可用。
所以,在生产环境一般配置高可用的eureka注册中心,标配是三个节点, 可以部署到在K8s
平台的Docker
容器里,便于集群管理。
用k8s部署服务有很多好处,其中之一就是当某个Eureka
注册中心节点挂了,K8s
会智能检测Eureka
的容器实例运行状态并把不可用的Eureka
节点移除掉,然后会重新启动新的Eureka
容器实例,始终保持三个活的Eureka
注册中心节点,这样就做到了Eureka
注册中心高可用了。
小试牛刀
启动dcp-eureka-peer1
注册中心节点,日志输出信息:
c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://dcp-eureka-peer3:8763/eureka/, http://dcp-eureka-peer2:8762/eureka/]
启动dcp-eureka-peer2
注册中心节点,日志输出信息:
c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://dcp-eureka-peer3:8763/eureka/, http://dcp-eureka-peer1:8761/eureka/]
启动dcp-eureka-peer3
注册中心节点,日志输出信息:
c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://dcp-eureka-peer2:8762/eureka/, http://dcp-eureka-peer1:8761/eureka/]
启动dcp-hellworld-service eureka
客户端服务注册,日志输出信息:
com.netflix.discovery.DiscoveryClient : DiscoveryClient_DCP-HELLWORLD-SERVICE/dcp-hellworld-service:806af348fd3d07e6543fe2bf8c103b37 - registration status: 204
打开在浏览器Eureka
注册中心页面地址:http://localhost:8761/
Eureka 注册中心节点信息
微服务列表信息
物理机信息
欢迎关注微信公众号:互联网全栈架构,收取更多有价值的信息。