4:SpringCloud Eureka高可用集群配置

本文详细介绍如何搭建Eureka服务集群,并确保其高可用性。通过实际案例演示了如何配置多个Eureka服务实例,实现互相通信及服务注册列表同步。

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

概念

生产环境中注册中心服务一定要集群,不能是单点,不然注册中心服务出现故障后,整个微服务系统都将不可用。
微服务系统中从原则上要杜绝一切单点服务,包括注册中心,配置中心,网关服务和业务服务,要使整个系统是一个高可用的状态。
其它中间件系统比如Redis,Mq,Mongodb,ElasticSearch以及DB等系统,原则上也要杜绝单点,除了分片集群外,还需要有主从集群来保证系统的高可用。
eureka server服务是对等节点,不是主从节点,集群不必非要是奇数

在这里插入图片描述

注册中心服务eureka server

先创建一个注册中心服务:
1,创建一个maven项目scd-eureka-server-cluster
项目名称可以按需自定义
2,引入pom依赖

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-parent -->
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-parent</artifactId>
		<version>Greenwich.RELEASE</version>
	</parent>
	
	<groupId>com.scd</groupId>
	<artifactId>scd-eureka-server-cluster</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	
	<name>scd-eureka-server-cluster</name>
	<url>http://maven.apache.org</url>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>
	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
	
</project>

  • parent指定为spring-cloud-starter-parent,可以自动管理springBoot和其它依赖的version
  • 注册中心服务需要引入spring-cloud-starter-netflix-eureka-server
  • spring-boot-maven-plugin为springboot项目的打包plugin

3,启动类上加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

4,yml配置
集群中不同的注册中心服务实例(服务实例是指服务启动后的实例,一个服务可以起N个实例),要互相知道对方的存在,以便启动后互相通信,互相同步注册列表。
spring boot项目启动的时候可以通过java命令指定–spring.profiles.active=xxx来使用不同的profile,启动后会加载application.yml和application-xxx.yml两个配置文件的属性。所以集群中不同服务实例共同的配置写在application.yml中,不同的配置分别写在各自的application-xxx.yml中即可。
我们用两个实例来演示如何配置注册中心的集群,这两个实例启动在同一个主机上,使用不同的端口

共同的配置写在application.yml中

spring:
  application:
    name: scd-eureka-server-cluster

第一个实例的配置文件:application-server1.yml,使用50000端口

#---------------------------------------------------------------------    
server:
  port: 50000
#---------------------------------------------------------------------
eureka:
  instance:
    prefer-ip-address: false
    status-page-url-path: /actuator/info
    health-check-url-path: /actuator/health
    hostname: scd-eureka-server-cluster1
  client:
    register-with-eureka: true #把本服务也注册到注册中心,从注册中心的服务列表中可以看到本服务
    fetch-registry: false #从注册中心拉取服务列表,由于是本服务是注册中心,所以不需要,其它业务服务都需要是true
    service-url:
      defaultZone: http://scd-eureka-server-cluster2:50001/eureka/
  • prefer-ip-address:注册中心集群服务要设置为false,否则无法集群,会成为一个unavailable-replicas
  • hostname: 写的是本实例的hostname,eureka要求不同实例的hostname一定要不同,否则无法集群
  • service-url.defaultZone: 写的是另外实例的eureka服务地址,如果有多个中间用,分割,例http://cluster1:50001/eureka/,http://cluster2:50002/eureka/

第二个实例的配置文件:application-server2.yml,使用50001端口

server:
  port: 50001
#---------------------------------------------------------------------
eureka:
  instance:
    prefer-ip-address: false
    status-page-url-path: /actuator/info
    health-check-url-path: /actuator/health
    hostname: scd-eureka-server-cluster2
  client:
    register-with-eureka: true #把本服务也注册到注册中心,从注册中心的服务列表中可以看到本服务
    fetch-registry: false #从注册中心拉取服务列表,由于是本服务是注册中心,所以不需要,其它业务服务都需要是true
    service-url:
      defaultZone: http://scd-eureka-server-cluster1:50000/eureka/
  • 和server1类似

完整示例代码可以参照:https://gitee.com/ifrozen/spring-cloud-demo/tree/master/demo-4

5,配置hosts文件
上面的配置中设置了scd-eureka-server-cluster1和scd-eureka-server-cluster2两个hostname,需要在C:\Windows\System32\drivers\etc\hosts文件中增加配置:

127.0.0.1 scd-eureka-server-cluster1
127.0.0.1 scd-eureka-server-cluster2

6,启动注册中心集群

1,通过maven命令【mvn package】打包注册中心服务:

C:\workspace\spring-cloud-demo\demo-4\scd-eureka-server-cluster>mvn  package
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.scd:scd-eureka-server-cluster:jar:0.0.1-SNAPSHOT
[WARNING] 'parent.relativePath' of POM com.scd:scd-eureka-server-cluster:0.0.1-SNAPSHOT (C:\workspace\spring-cloud-demo\demo-4\scd-eureka-server-clust
er\pom.xml) points at com.scd:demo-4 instead of org.springframework.cloud:spring-cloud-starter-parent, please verify your project structure @ line 5,
column 10
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] -----------------< com.scd:scd-eureka-server-cluster >------------------
[INFO] Building scd-eureka-server-cluster 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ scd-eureka-server-cluster ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ scd-eureka-server-cluster ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\workspace\spring-cloud-demo\demo-4\scd-eureka-server-cluster\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ scd-eureka-server-cluster ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\workspace\spring-cloud-demo\demo-4\scd-eureka-server-cluster\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ scd-eureka-server-cluster ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\workspace\spring-cloud-demo\demo-4\scd-eureka-server-cluster\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ scd-eureka-server-cluster ---
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.scd.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s - in com.scd.AppTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:3.1.1:jar (default-jar) @ scd-eureka-server-cluster ---
[INFO] Building jar: C:\workspace\spring-cloud-demo\demo-4\scd-eureka-server-cluster\target\scd-eureka-server-cluster-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.2.RELEASE:repackage (repackage) @ scd-eureka-server-cluster ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.288 s
[INFO] Finished at: 2019-04-02T11:02:27+08:00
[INFO] ------------------------------------------------------------------------

2,通过java命令【java -jar scd-eureka-server-cluster-0.0.1-SNAPSHOT.jar --spring.profiles.active=server1】启动实例1
在这里插入图片描述
启动后,会有报错信息输出,这是因为另一个实例2还没启动,可以暂时忽略这个报错信息
访问 http://localhost:50000/ ,查看注册中心
在这里插入图片描述
可以看到有一个Replicas副本scd-eureka-server-cluster2,但是还处于不可用(unavailable-replicas)状态

3,通过java命令【java -jar scd-eureka-server-cluster-0.0.1-SNAPSHOT.jar --spring.profiles.active=server2】启动实例2
启动时无报错信息,启动后再访问 http://localhost:50000/ ,查看注册中心
在这里插入图片描述
可以看到Replicas副本scd-eureka-server-cluster2,已经处于可用(available-replicas)状态了

访问实例2 http://localhost:50001/ ,查看注册中心
在这里插入图片描述
可以看到一个Replicas副本scd-eureka-server-cluster1,也处于可用(available-replicas)状态

如果在实验的时候,Replicas副本处于unavailable-replicas状态了,可以查看下是不是一下原因导致的:

  • hostname指定为了localhost
  • prefer-ip-address指定为了true
  • 不同实例的hostname指定为了同一个值

7,eureka 客户端
注册中心集群后,其它服务只需要把多个注册中心url配置上即可:

eureka:
  instance:
    prefer-ip-address: true
    status-page-url-path: /actuator/info
    health-check-url-path: /actuator/health
    hostname: localhost
  client:
    register-with-eureka: true #把本服务也注册到注册中心,从注册中心的服务列表中可以看到本服务
    fetch-registry: true #从注册中心拉取服务列表
    service-url:
      defaultZone: http://scd-eureka-server-cluster1:50000/eureka/,http://scd-eureka-server-cluster2:50001/eureka/
  • eureka.client.service-url.defaultZone中把多个注册中心url配置上即可,中间用,分割
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值