一文搞定 Eureka 集群高可用配置

互联网全栈架构

共 6401字,需浏览 13分钟

 ·

2021-06-03 09:12

点击上方蓝色架构荟萃关注我们,输入1024,你懂的


前言

点对点去中心化的架构:解决单点问题

通过部署多节点 Eureka 实例,避免单点问题,满足高可用架构。同时节点之间的地位是平等,节点通信方式采用点对点方式(peer to peer),以便满足数据同步问题,这是一种去中心化的分布式架构。

在这种架构中,peer 节点之间通过相互注册来提高可用性,每个peer节点通过serviceUrl指定其他peer节点。

如果某台Eureka服务器宕机,Eureka客户端的请求会自动切换到新的Eureka服务器节点,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理中。当节点开始接受客户端请求时,所有的操作也会进行节点间复制,将请求复制到其他Eureka服务器当前所知的节点中。这点和Zookeepermaster/salve集中化机构有很大的区别,zookeeper认为任何时候都要一个master节点,满足节点之间任务调度和节点路由问题,保证的是CP原理,是一种集中式中心化分布式架构。

Eureka 客户端负载均衡

用过 Eureka 的同学知道,当一个微服务向注册中心注册成功后,会返回状态码204,同时会获取注册中心的服务列表缓存在本地,以便满足Feign以及Ribbon的调用,这是所谓的客户端负载均衡。

peer 节点通信机制

为了让每个peer节点都能够获取所有注册服务列表,Eureka的做法是peer节点之间相互复制注册服务信息列表来实现同步,这样每个peer节点都有一份所有注册服务列表的一套副本。

CAP 原理

CAP原理的诞生源于对分布式架构的发展,特别是微服务架构下对于分布式数据库环境要求。

Eureka属于AP架构,Eureka认为每个节点最先要保证的是对外提供服务,即使每个节点隔离或者失去联系也要对外保证注册中心高可用,但这样会导致每个节点的数据可能存在不一致性。

Eureka Server 集群高可用配置

新建 dcp-eureka-peer1dcp-eureka-peer2dcp-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 Peer2Eureka 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 注册中心节点信息

微服务列表信息

物理机信息



推荐阅读:
MySQL索引原理
由浅入深逐步讲解Java并发的半壁江山AQS
ThreadLocal内存溢出代码演示和原因分析!

互联网全栈架构

浏览 46
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报