Eureka高可用注册中心

在于在我们平时的生产环境中,很难保证单节点的eureka服务能提供百分百不间断的服务,如果eureka无响应了,整个项目应用都会出现问题,因此要保证eureka随时都能提供服务的情况下,最好的方式就是采用eureka的集群模式,也就是搭建eureka的高可用,在eureka的集群模式下,多个eureka server之间可以同步注册服务,因此在一个eureka宕掉的情况下仍然可以提供服务注册和服务发现的能力,从而达到注册中心的高可用.

Eureka注册集群配置

Maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
eureka-registry
├── pom.xml
└── src
└── main
├── java
│   └── com
│   └── cloud
│   └── eureka
│   └── registy
│   └── Application.java
└── resources
├── application-node1.properties
├── application-node2.properties
├── application-node3.properties
└── application.properties

Maven配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

主类代码

@EnableEurekaServer注解即开启注册中心服务器的功能.

1
2
3
4
5
6
7
8
@EnableEurekaServer
@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).bannerMode(Banner.Mode.LOG).run(args);
}
}

配置Host

伪示例机器结点

1
127.0.0.1 node1.test.com node2.test.com node3.test.com

配置示例

通用配置

application.properties 配置文件内容(共用)

1
2
3
4
5
6
spring.application.name=registry-center

### 注册中心授权配置
security.basic.enabled=true
security.user.name=admin
security.user.password=pwd123
节点配置

application-node1.properties 配置文件内容

1
2
3
4
5
6
7
8
spring.application.name=registry-node1
server.port=8001
eureka.instance.hostname=node1.test.com
eureka.server.enable-self-preservation=true
eureka.server.eviction-interval-timer-in-ms=5000
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://admin:pwd123@node2.test.com:8002/eureka/,http://admin:pwd123@node3.test.com:8003/eureka/

application-node2.properties 配置文件内容

1
2
3
4
5
6
7
8
spring.application.name=registry-node2
server.port=8002
eureka.instance.hostname=node2.test.com
eureka.server.enable-self-preservation=true
eureka.server.eviction-interval-timer-in-ms=3000
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://admin:pwd123@node1.test.com:8001/eureka/,http://admin:pwd123@node3.test.com:8003/eureka/

application-node3.properties 配置文件内容

1
2
3
4
5
6
7
8
spring.application.name=registry-node3
server.port=8003
eureka.instance.hostname=node3.test.com
eureka.server.enable-self-preservation=true
eureka.server.eviction-interval-timer-in-ms=3000
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://admin:pwd123@node1.test.com:8001/eureka/,http://admin:pwd123@node2.test.com:8002/eureka/

参数说明:

  • spring.application.name:应用名称
  • server.port=8003: 应用服务端口
  • eureka.server.enable-self-preservation: 配置Eureka自我保护机制(默认为true)
  • eureka.server.eviction-interval-timer-in-ms: 配置向Eureka server发送心跳间隔
  • eureka.client.register-with-eureka: 配置是否将当前实例注册到Eureka server(默认为true)
  • eureka.client.fetch-registry: 是否从Eureka server获取注册信息
  • eureka.client.service-url.defaultZone: 配置eureka server列表,多个节点可以分隔, 默认值为(http://localhost:8761/eureka/)

启动节点

1
2
3
[root@localhost target ]$ java -jar eureka-registry-1.0-SNAPSHOT.jar --spring.profiles.active=node1 &
[root@localhost target ]$ java -jar eureka-registry-1.0-SNAPSHOT.jar --spring.profiles.active=node2 &
[root@localhost target ]$ java -jar eureka-registry-1.0-SNAPSHOT.jar --spring.profiles.active=node3 &

说明: 第一个服务会抛出一些错误,请不用担心那是因为其余服务还没有启动.启动之后就会没有问题了.

查看示例

访问node1.test.com:8081效果如下(同理可以访问node2.test.com:8082, node3.test.com:8083),因为加了授权,访问使用admin/pwd123即可

服务注册配置

在设置了多节点的服务注册中心之后,我们需要简单服务配置,就能将服务注册到Eureka Server集群中; 对应的注册中心地址如下:

1
eureka.client.service-url.defaultZone=http://admin:pwd123@node1.test.com:8001/eureka/,http://admin:pwd123@node1.test.com:8002/eureka/,http://admin:pwd123@node3.test.com:8003/eureka/