Eureka--4、使用Peer实现Eureka Server高可用

本文详细介绍如何通过配置多个Zone和Eureka Server实现Eureka集群的高可用性,包括服务注册、服务发现以及跨区域访问的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单独的Eureka Server仍然可以保持很高的弹性

因为客户端本地也会存有一份服务的map,所以即使所有的注册中心全部挂掉,也不影响client的相互访问。并且会在注册中心可用的情况下第一时间进行通信,同步数据。即使只有一个Eureka Server,也可以让系统又比较高的弹性。

但是对于大型项目,天生就要求有多个Zone的存在。每个Zone中又会有至少一个Eureka Server。这些Eureka Server应该互为peer。peer会从所有的兄弟peer那里同步服务列表。从其它节点那里同步到的服务列表和本机的服务列表一样,也可以同步给客户端。

 

实现高可用的Eureka集群

我们前面已经把eureka-server和拆成了两个,但是用来演示高可用,两个是不够的。

我们假定有两个zone,nj1,nj2,假设用来演示一个zone下有多个eureka server,需要四个server,我们把server继续拆成nj1a、nj1b,nj2a,nj2b。同时把client拆成两个。

然后把Server改成不用defaultZone的配置。具体注释放在yml中,所有配置如下。

需要继续去hosts里面添加hostName

127.0.0.1 eureka-server3

127.0.0.1 eureka-server4

配置Eureka Client

加载配置的顺序为先加载bootstrap.yml,再加载application.yml,如果有后缀,也就是profile,则会先加载原始的,再加载带后缀的,后面的配置会覆盖前面的配置。因为我们使用了config,所以bootstrap.yml必不可少,我们在bootstrap.yml中配置config需要的信息。在application.yml中配置公共信息。在application-xxx.xml中配置各自的信息。

bootstrap.yml省略

application.yml

eureka:

  instance:

    hostname: localhost

  client:

    假设指定region为江苏

    region: js

    availability-zones:

      #假设江苏下面有南京的两个region

      js: nj1,nj2

    service-url:

      客户端应该根据所在zone,兄弟zone的顺序,列出所有的可连接service-url

      nj1: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka

      nj2: http://eureka-server3:8763/eureka,http://eureka-server4:8764/eureka

application-web1.yml

server:

  port: 8080

eureka:

  instance:

    metadata-map:

      zone: nj1

application-web2.yml

server:

  port: 8081

eureka:

  instance:

    metadata-map:

      zone: nj2

配置Eureka Server

注意前俩metadateMap.zone是nj1,后俩是nj2,虽然不知道啥用,我们先按照“假设这俩是用来指定server真正属于哪个zone”的逻辑来设置

 

前俩是availabilityZones是js: nj1,nj2 后俩是js: nj2,nj1

hostname是eureka-server1,eurea-server2,eurea-server3,eurea-server4顺着排下去

前俩service-url,nj1在前面,后俩nj2在前面

application-nj1a.yml

spring:

  application:

    name: eureka

server:

  port: 8761

eureka:

  instance:

    hostname: eureka-server1

    指定当前属于njzone

    metadata-map:

      zone: nj1

  client:

    使用默认的registerWithEurekafetchRegistry

    #register-with-eureka: false

    #fetch-registry: false

    region: js

    availability-zones:

      为达到优先访问自己zone的效果,这里需要调整顺序

      原则为自己的在前,按照跨region访问顺序排布其它的

      js: nj1,sz1

    service-url:

      按照属于自身region的放在前面,其它region的按顺序罗列

      nj1: http://eureka-server2:8762/eureka

      相同region,多个服务使用逗号隔开

      nj2: http://eureka-server3:8763/eureka, http://eureka-server4:8764/eureka

application-nj1b.yml

spring:

  application:

    name: eureka

server:

  port: 8762

eureka:

  instance:

    hostname: eureka-server2

    指定当前属于njzone

    metadata-map:

      zone: nj1

  client:

    使用默认的registerWithEurekafetchRegistry

    #register-with-eureka: false

    #fetch-registry: false

    region: js

    availability-zones:

      为达到优先访问自己zone的效果,这里需要调整顺序

      原则为自己的在前,按照跨region访问顺序排布其它的

      js: nj1,nj2

    service-url:

      按照属于自身region的放在前面,其它region的按顺序罗列

      nj1: http://eureka-server1:8761/eureka

      相同region,多个服务使用逗号隔开

      nj2: http://eureka-server3:8763/eureka, http://eureka-server4:8764/eureka

application-nj2a.yml

spring:

  application:

    name: eureka

server:

  port: 8763

eureka:

  instance:

    hostname: eureka-server3

    指定当前属于njzone

    metadata-map:

      zone: nj2

  client:

    使用默认的registerWithEurekafetchRegistry

    #register-with-eureka: false

    #fetch-registry: false

    region: js

    availability-zones:

      为达到优先访问自己zone的效果,这里需要调整顺序

      原则为自己的在前,按照跨region访问顺序排布其它的

      js: nj2,nj1

    service-url:

      按照属于自身region的放在前面,其它region的按顺序罗列

      nj2: http://eureka-server4:8764/eureka

      相同region,多个服务使用逗号隔开

      nj1: http://eureka-server1:8761/eureka, http://eureka-server2:8762/eureka

application-nj2b.yml

spring:

  application:

    name: eureka

server:

  port: 8764

eureka:

  instance:

    hostname: eureka-server4

    指定当前属于njzone

    metadata-map:

      zone: nj2

  client:

    使用默认的registerWithEurekafetchRegistry

    #register-with-eureka: false

    #fetch-registry: false

    region: js

    availability-zones:

      为达到优先访问自己zone的效果,这里需要调整顺序

      原则为自己的在前,按照跨region访问顺序排布其它的

      js: nj2,nj1

    service-url:

      按照属于自身region的放在前面,其它region的按顺序罗列

      nj2: http://eureka-server3:8763/eureka

      相同region,多个服务使用逗号隔开

      nj1: http://eureka-server1:8761/eureka, http://eureka-server1:8762/eureka

我们启动web1和web2,server的nj1a,nj1b,nj2a,nj2b

效果应该是localhost:8761的DS Replicas是eureka-server2,eureka-server3,eureka-server4,localhost:8762的DS Replicas应该是其它三个,依次类推。然后四个Eureka Server都会显示六台服务,包括两个注册上来的服务,和4个Eureka Server自身。为节省篇幅,截前两个的图。

serviceUrl的设置规则

无论是client还是serviceUrl应该把所有的Eureka Server全部列到后面。

按照优先本Region的其它serviceUrl,然后其它Region内的serviceUrl。

虽然配置了很多,但是Eureka会逐个探测serviceUrl是否能连接,能够连接则停止。所以同一时间只会和一个发生关系。假设最优先的serviceUrl连接不上,会“暂时”连接次优先的server,一旦前面的可以连接,将会连接到前面的serviceUrl。

所以必须要全部列出来,按照优先级排列,才是高可用的最佳实践。

DS Replicas

replicas 复制品,DS不知道啥意思,这里表示的就是peer的hostname列表。

为什么每次都需要重启来测试效果

这个问题太大,留着下一篇说

### 配置和启动本地Eureka Server #### 使用不同配置文件启动多个Eureka实例 为了在同一台机器上运行多个Eureka服务器实例,需要确保每个实例具有唯一的端口号和服务ID。这可以通过创建不同的配置文件来实现[^4]。 对于`application.yml`或`application.properties`中的默认配置,可以定义基本属性: ```yaml server: port: 8761 eureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ ``` 当希望增加第二个Eureka实例时,在资源目录下新建名为`application-server2.yml`的文件,并修改相应的端口和其他唯一标识符: ```yaml server: port: 8762 eureka: instance: hostname: localhost client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka/ ``` 接着可以在IDEA中通过编辑Run/Debug Configurations添加新的Spring Boot应用并指定对应的激活profile(`-Dspring.profiles.active=server2`)来启动另一个Eureka实例[^1]。 #### 修改主机名映射以支持多节点部署 由于同一IP地址上的服务无法重复注册至Eureka Server,因此需调整系统的hosts文件使得各微服务能够识别为独立实体。具体做法是在操作系统的/etc/hosts(UNIX/Linux/MacOS) 或 C:\Windows\System32\drivers\etc\hosts (Windows) 文件内加入如下条目[^3]: ``` 127.0.0.1 peer1.example.com 127.0.0.1 peer2.example.com ``` 之后更新各个Eureka客户端的应用程序配置文件,使其连接到上述自定义域名而非简单的localhost。 #### 启动与验证 完成以上步骤后即可依次启动所有的Eureka Server以及依赖的服务提供者。访问任意一台Eureka管理界面下的“Instances currently registered with Eureka”,确认所有预期的服务都已正常上线[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值