为了使 Eureka Server 实现高可用,我们需要为它配置集群。这样当有一台 Eureka Server 有故障时,集群中的其他 Eureka server 可以进行代替。Eureka server 集群之中的节点通过 P2P 通信的方式共享注册表,以使得每个 Eureka Server 的注册表保持一致。
本章节将在本地运行三台 Eureka Server、以及一台 Eureka client 以测试集群的搭建。项目结构如下图:
上图中:
eureka_demo4_server1 服务端模块运行在 8077 端口上
eureka_demo4_server2 服务端模块运行在 8078 端口上
eureka_demo4_server3 服务端模块运行在 8079 端口上
eureka_demo4_client 客户端模块运行在 7001 端口上
下面将分别给出每个模块的代码和配置信息。
配置 host,配置如下:
127.0.0.1 peer1 127.0.0.1 peer2 127.0.0.1 peer3
(1)application.properties 配置文件内容如下:
# 服务端口 server.port=8077 # 服务名称 spring.application.name=server # 服务地址 eureka.instance.hostname=peer1 # 向注册中心注册自己 eureka.client.register-with-eureka=true # 取消检索服务 eureka.client.fetch-registry=true # 开启注册中心的保护机制,默认是开启 eureka.server.enable-self-preservation=true # 设置保护机制的阈值,默认是0.85。 eureka.server.renewal-percent-threshold=0.5 # 注册中心路径,如果有多个eureka server # 在这里需要配置其他 eureka server 的地址,用","进行区分 # 如 "http://address:8888/eureka,http://address:8887/eureka" # defaultZone 改为 default-zone eureka.client.service-url.defaultZone=http://peer2:8078/eureka/,http://peer3:8079/eureka/
(2)启动类代码如下:
package com.hxstrive.springcloud.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServer1Application { public static void main(String[] args) { SpringApplication.run(EurekaServer1Application.class, args); } }
(1)application.properties 配置文件内容如下:
# 服务端口 server.port=8078 # 服务名称 spring.application.name=server # 服务地址 eureka.instance.hostname=peer2 # 向注册中心注册自己 eureka.client.register-with-eureka=true # 取消检索服务 eureka.client.fetch-registry=true # 开启注册中心的保护机制,默认是开启 eureka.server.enable-self-preservation=true # 设置保护机制的阈值,默认是0.85。 eureka.server.renewal-percent-threshold=0.5 # 注册中心路径,如果有多个eureka server # 在这里需要配置其他 eureka server 的地址,用","进行区分 # 如 "http://address:8888/eureka,http://address:8887/eureka" eureka.client.service-url.defaultZone=http://peer1:8077/eureka/,http://peer3:8079/eureka/
(2)启动类代码如下:
package com.hxstrive.springcloud.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServer2Application { public static void main(String[] args) { SpringApplication.run(EurekaServer2Application.class, args); } }
(1)application.properties 配置文件内容如下:
# 服务端口 server.port=8079 # 服务名称 spring.application.name=server # 服务地址 eureka.instance.hostname=peer3 # 向注册中心注册自己 eureka.client.register-with-eureka=true # 取消检索服务 eureka.client.fetch-registry=true # 开启注册中心的保护机制,默认是开启 eureka.server.enable-self-preservation=true # 设置保护机制的阈值,默认是0.85。 eureka.server.renewal-percent-threshold=0.5 # 注册中心路径,如果有多个eureka server # 在这里需要配置其他 eureka server 的地址,用","进行区分 # 如 "http://address:8888/eureka,http://address:8887/eureka" eureka.client.service-url.defaultZone=http://peer1:8077/eureka/,http://peer2:8078/eureka/
(2)启动类代码如下:
package com.hxstrive.springcloud.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServer3Application { public static void main(String[] args) { SpringApplication.run(EurekaServer3Application.class, args); } }
(1)application.properties 配置文件内容如下:
# 服务端口 server.port=7001 # 服务名称 spring.application.name=client1 # 服务地址 eureka.instance.hostname=localhost # 注册中心路径,表示我们向这个注册中心注册服务,如果向多个注册中心注册,用“,”进行分隔 eureka.client.serviceUrl.defaultZone=http://localhost:8077/eureka # 心跳间隔5s,默认30s。每一个服务配置后,心跳间隔和心跳超时时间会被保存在server端,不同服务的心跳频率可能不同,server端会根据保存的配置来分别探活 eureka.instance.lease-renewal-interval-in-seconds=5 # 心跳超时时间10s,默认90s。从client端最后一次发出心跳后,达到这个时间没有再次发出心跳,表示服务不可用,将它的实例从注册中心移除 eureka.instance.lease-expiration-duration-in-seconds=10
(2)启动类代码如下:
package com.hxstrive.springcloud.eureka.client; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.text.SimpleDateFormat; import java.util.Date; @RestController @SpringBootApplication @EnableEurekaClient public class EurekaClient1Application { public static void main(String[] args) { SpringApplication.run(EurekaClient1Application.class, args); } @GetMapping({"/", "/index.html"}) public String index() { return "Current Timestamp " + new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS").format(new Date()); } }
到这里我们就完成了 Eureka server 集群的配置,接下来分别运行 EurekaServer1Application、EurekaServer2Application、EurekaServer3Application 和 EurekaClient1Application 类。上面4个类都运行成功后,可以浏览器查看每个 Eureka server 服务器的状态,分别如下:
(1)EurekaServer1Application 类监听 8077 端口,状态如下图:
(2)EurekaServer2Application 类监听 8078 端口,状态如下图:
(3)EurekaServer3Application 类监听 8079 端口,状态如下图:
上图中,“System Status” 显示 Eureka server 系统当前状态信息;“DS Replicas” 可以理解为 Eureka server 的副本节点列表,当前 Eureka server 将从这些节点同步注册数据。而且,“DS Replicas” 列表数据对应 eureka.client.service-url.defaultZone 配置项。例如:在 eureka_demo4_server1 模块中存在如下配置:
eureka.client.service-url.defaultZone=http://peer2:8078/eureka/,http://peer3:8079/eureka/
查看它的 “DS Replicas” 你会发现存在 peer2、peer3 两个节点,如果你配置的 eureka.client.service-url.defaultZone 有问题,则 “DS Replicas” 是不会看见那些节点信息。如下图:
(4)EurekaClient1Application 类监听 7001 端口。它在配置文件中,将服务注册到 eureka_demo4_server1 服务中心,配置如下:
eureka.client.serviceUrl.defaultZone=http://localhost:8077/eureka
在成功启动了 Eureka client 后(等待几十秒或几分钟),该服务被注册到了其他几个 Eureka server 注册中,这是因为 Eureka server 之间数据同步导致的。到这里,我们的 Eureka server 集群配置完成了,并且客户端也能正常注册。