概念
生产环境中注册中心服务一定要集群,不能是单点,不然注册中心服务出现故障后,整个微服务系统都将不可用。
微服务系统中从原则上要杜绝一切单点服务,包括注册中心,配置中心,网关服务和业务服务,要使整个系统是一个高可用的状态。
其它中间件系统比如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配置上即可,中间用,分割