高可用Eureka Server
构建一个双节点Eureka Server集群
Eureka Server
- pom.xml文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lanh</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</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>
</project>
- 启动类
package com.lanh.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
方法一
- 配置系统的hosts,Windows系统的hosts文件路径是C:\Windows\System32\drivers\etc\hosts;Linux及MacOS等系统的文件路径是/etc/hosts。
127.0.0.1 peer1 peer2
- 将application.yml修改如下,让两个节点的Eureka Server相互注册。
server:
# 设置 Eureka Server WEB 控制台端口、服务注册发现端口。Eureka Server 服务注册 发现端口默认为 8761。
port: 8761
spring:
application:
# 设置 spring 应用命名,默认为 null。同命名的应用会注册到同一个服务集群中。
name: eureka1
# 指定profile=peer1
profiles: peer1
eureka:
client:
service-url:
# 将自己注册到peer2这个Eureka上面去
defaultZone: http://peer2:8762/eureka/
instance:
hostname: peer1
---
server:
# 设置 Eureka Server WEB 控制台端口、服务注册发现端口。Eureka Server 服务注册 发现端口默认为 8761。
port: 8762
spring:
application:
# 设置 spring 应用命名,默认为 null。同命名的应用会注册到同一个服务集群中。
name: eureka2
# 指定profile=peer2
profiles: peer2
eureka:
client:
service-url:
# 将自己注册到peer2这个Eureka上面去
defaultZone: http://peer1:8761/eureka/
instance:
hostname: peer2
如上,使用连字符(—)将该application.yml文件分为三段。第二段和第三段分别为spring.properties指定了一个值,该值表示它所在的那段内容应用在哪个Profile里。第一段由于并未指定spring.profiles,因此这段内容会对所有Profile生效。
经过以上分析,不难理解,我们定义了peer1和peer2这两个Profile。当应用以peer1这个Profile启动时,配置该EurekaServer的主机名为peer1,并将其注册到http://peer2:8762/eureka/ ;反之,当应用以profile=peer2时,EurekaServer会注册到peer1节点的Eureka Server。
测试
- 打包项目,并使用以下命令启动两个Eureka Server节点
jar名称根据自己的项目名进行修改
通过spring.profiles.active指定使用哪个profile启动。
- 启动后:
访问http://peer1:8761 ,会发现“registered-replicas”中已有peer2节点;同理,访问http://peer2:8762 ,也能发现其中的“registered-replicas”有peer1节点
方法二
不知道你们觉得打包成jar包麻不麻烦,我觉得挺麻烦的,虽然在正常开发的时候确实是这样,但是我们现在是在学习,有一个这么好的Idea摆在我们面前,为什么要用命令窗口去启动测试它呢?所以我的做法是,在idea中并行执行程序:
接下来,填入下面给出的application.yml第一个代码块,启动程序,然后再把application.yml全部替换成第二个代码块,启动,即可出现上面的结果。
注意:两次启动间隔要尽量小,不然就会导致连接不成功,建议:提前复制好第二个代码块,启动完第一次,马上修改yml文件,迅速启动第二次
- 配置系统的hosts,Windows系统的hosts文件路径是C:\Windows\System32\drivers\etc\hosts;Linux及MacOS等系统的文件路径是/etc/hosts。
127.0.0.1 peer1 peer2
- 下面有两个application.yml
- application.yml
server:
# 设置 Eureka Server WEB 控制台端口、服务注册发现端口。Eureka Server 服务注册 发现端口默认为 8761。
port: 8761
spring:
application:
# 设置 spring 应用命名,默认为 null。同命名的应用会注册到同一个服务集群中。
name: cloud-eureka
eureka:
client:
# 是否将自己注册到 Eureka-Server 中,默认的为 true
register-with-eureka: false
# 是否从 Eureka-Server 中获取服务注册信息,默认为 true
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka/
server:
# 设置 Eureka Server WEB 控制台端口、服务注册发现端口。Eureka Server 服务注册 发现端口默认为 8761。
port: 8762
spring:
application:
# 设置 spring 应用命名,默认为 null。同命名的应用会注册到同一个服务集群中。
name: eureka2
eureka:
client:
service-url:
# 将自己注册到peer2这个Eureka上面去
defaultZone: http://peer1:8761/eureka/
instance:
hostname: peer2