前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文搞定 Eureka 集群高可用配置

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

作者头像
猿芯
发布2020-10-27 10:35:47
2.8K0
发布2020-10-27 10:35:47
举报

点击上方蓝色“架构荟萃”关注我们,输入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依赖

代码语言:javascript
复制
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server
  </artifactId>
</dependency>

dcp-eureka-peer1启动文件设置:bootstrap.yml

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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文件配置

代码语言:javascript
复制
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写法类似。

代码语言:javascript
复制
@EnableEurekaServer
@SpringBootApplication
public class EurekaPeer1 {
  public static void main(String[] args) {
    SpringApplication.run(EurekaPeer1.class, args);
  }
}

Eureka客户端配置

新建dcp-helloworld-service工程,添加maven依赖

代码语言:javascript
复制
<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

代码语言:javascript
复制
# 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参数值。

代码语言:javascript
复制
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注册中心节点,日志输出信息:

代码语言:javascript
复制
c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://dcp-eureka-peer3:8763/eureka/, http://dcp-eureka-peer2:8762/eureka/]

启动dcp-eureka-peer2注册中心节点,日志输出信息:

代码语言:javascript
复制
c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://dcp-eureka-peer3:8763/eureka/, http://dcp-eureka-peer1:8761/eureka/]

启动dcp-eureka-peer3注册中心节点,日志输出信息:

代码语言:javascript
复制
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客户端服务注册,日志输出信息:

代码语言:javascript
复制
com.netflix.discovery.DiscoveryClient : DiscoveryClient_DCP-HELLWORLD-SERVICE/dcp-hellworld-service:806af348fd3d07e6543fe2bf8c103b37 - registration status: 204

打开在浏览器Eureka注册中心页面地址:http://localhost:8761/

Eureka 注册中心节点信息

微服务列表信息

物理机信息

如果您觉得本文对你有帮助,欢迎老铁们帮忙点赞、在看、留言、分享你们的支持是我原创最大的动力

往期精选

利用 Sharding-JDBC 解决数据库读写分离后,数据查询延时问题

基于分布式文件系统 FastDFS,利用 Zuul 网关实现滑块验证登录

月薪8K,java初级程序员需要掌握的一些面试经验

jsp的10年是谁让它如此落幕?

福利彩蛋

最近整理一份很全的Java学习资料,感兴趣的老铁可以在微信搜索【猿芯】,后台回复以下关键字,即可免费获取。 回复“sb”,免费获取 SpringBoot 全套视频教程。 回复“sc”,免费获取 SpringCloud 全套视频教程。 回复“面试”,免费获取 Java 面试全套题集。 回复“小程序”,免费获取微信小程序开发 全套视频教程。

【猿芯】

微信扫描二维码,关注我的公众号。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构荟萃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 点对点去中心化的架构:解决单点问题
      • Eureka 客户端负载均衡
        • peer 节点通信机制
        • CAP 原理
        • Eureka Server 集群高可用配置
        • Eureka客户端配置
        • 小试牛刀
          • Eureka 注册中心节点信息
            • 微服务列表信息
              • 物理机信息
              相关产品与服务
              微服务引擎 TSE
              微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档