Spring Cloud(2)--服务发现和注册Eureka

概念

  • 服务注册

    Eureka Client向Eureka Server注册

  • 服务续约

    Eureka Client默认情况下每30秒发送一次心跳来进行服务续约

  • 获取服务注册列表信息

    客户端向服务端获取服务注册信息,并将其缓存在本地,每30秒更新一次。如果由于某些原因导致注册信息不能及时匹配,客户端会重新获取整个注册表信息。可使用xml和json通信,默认以json通信。

  • 服务下线

    客户端关闭时可向服务端发送下线请求,该请求不会自动完成,需要手动调用如下代码:

    注:DiscoveryManager在使用Spring Cloud Greenwich.RELEASE版本时发现为已过时的,具体替代类由于个人实力有限,暂时还不清楚

    1
    DiscoveryManager.getInstance().shutdownComponent();
  • 服务剔除

    在默认情况下,当客户端90秒没有向服务端发送心跳,服务端会将该客户端从注册表中移除

创建Maven主工程

由于本案例有多个Spring Boot工程,为了方便管理,采用Maven多Module结构

更改Type

首先我们通过idea创建一个Spring Boot工程,将其中的Type由Maven Project更改为Maven POM

创建主工程

修改pom文件

创建好spring boot工程后将pom文件做如下修改:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modules>
<module>eureka-server</module>
<module>eureka-client</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yhzl.cloud</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>test</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

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

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>

</project>

创建Eureka Server

创建Module

在主工程下新增一个Module,名称叫做eureka-server

修改pom文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yhzl.cloud</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>



<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>

</project>

修改yml文件

1
2
3
4
5
6
7
8
9
10
11
server:
port: 8081
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone:
http://${eureka.instance.hostname}:${server.port}/eureka/

修改EurekaServerApplication文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.yhzl.cloud.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

}

创建Eureka Client

创建步骤与Eureka Server一致

修改yml文件

1
2
3
4
5
6
7
8
9
10
eureka:
client:
service-url:
defaultZone:
http://localhost:8081/eureka/
server:
port: 8082
spring:
application:
name: eureka-client

修改EurekaClientApplication文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.yhzl.cloud.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {

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

}

启动项目

启动截图

构建高可用Eureka Server集群

修改Eureka Server的yml文件

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
spring:
profiles: peer1
application:
name: peer1
server:
port: 8081
eureka:
instance:
hostname: peer1
client:
service-url:
defaultZone: http://peer2:8082/eureka/

---
spring:
profiles: peer2
application:
name: peer2
server:
port: 8082
eureka:
instance:
hostname: peer2
client:
service-url:
defaultZone: http://peer1:8081/eureka/

配置Windows的hosts

首先以管理员权限打开记事本,然后找到hosts文件,默认是在该路径下

C:\Windows\System32\drivers\etc

然后添加两行代码

127.0.0.1 peer1
127.0.0.1 peer2

配置idea参数启动

找到Run Dashboard

run dashboard

配置启动项

peer1配置参考

peer1

peer2配置类似,只需将图中的peer1修改为peer2即可

修改eureka client的yml文件

1
2
3
4
5
6
7
8
9
10
eureka:
client:
service-url:
defaultZone:
http://peer1:8081/eureka/
server:
port: 8083
spring:
application:
name: eureka-client

该配置文件的意思是,仅向peer1注册服务。

最后运行三个服务,会发现,虽然eureka client仅向peer1注册了服务,但是会自动同步到peer2上

Eureka自我保护机制

默认情况下,如果eureka server在15分钟之内接收到的服务续约率低于85%,那么eureka将会开启自我保护模式,这是为了防止当eureka注册中心自己网络出现故障时,导致了可用的eureka client被意外删除。默认情况下eureka的自我保护机制是开启的,如需关闭,可以在配置文件中添加如下代码

1
2
3
eureka: 
server:
enable-self-preservation: false

自我保护模式推荐开启,这样可以防止当注册中心网络故障时导致的有效服务不可用。

当然自我保护模式也有坏处,默认情况下服务续约总数=服务总数*2。当服务总数过低时(低于7个),会导致真正的服务宕机eureka也会开启自我保护模式,因为服务续约率会低于百分之85.