项目结构:
这里 Eureka 服务注册中心提供了两个,分别是springcloud_eureka6110 和 6011,Eureka Server可以通过多个实例相互注册的方式实现高可用,它们之间会互相同步信息保持所有节点数据一致,下面直接上代码:
1,springcloud_eureka6110 项目代码:
pom.xml 文件代码:
<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.0modelVersion>
<groupId>springcloud_eureka6110groupId>
<artifactId>springcloud_eureka6110artifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>springcloud_eureka6110name>
<description>Demo project for Spring Bootdescription>
<parent>
<artifactId>springcloud_demoartifactId>
<groupId>springcloud_demogroupId>
<version>0.0.1-SNAPSHOTversion>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<spring-cloud.version>Finchley.SR1spring-cloud.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<finalName>6110finalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
EurekaApplication6110 启动类:
package springcloud.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer //启动一个服务注册中心提供给其他应用进行对话
@SpringBootApplication
public class EurekaApplication6110 {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication6110.class, args);
}
}
application.properties 配置文件:
server.port=6110
spring.application=eureka-server-6110
#将 enreka 服务注册到其他enreka服务上面去,实现enreka高可用
eureka.client.serviceUrl.defaultZone=http://192.168.2.131:6111/eureka/
#是否向服务注册中心注册自己
eureka.client.registerWithEureka=false
#是否检索服务
eureka.client.fetchRegistry=false
2,springcloud_eureka6111 项目代码:
pom.xml 文件代码:
<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.0modelVersion>
<groupId>springcloud_eureka6111groupId>
<artifactId>springcloud_eureka6111artifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>springcloud_eureka6111name>
<description>Demo project for Spring Bootdescription>
<parent>
<artifactId>springcloud_demoartifactId>
<groupId>springcloud_demogroupId>
<version>0.0.1-SNAPSHOTversion>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<spring-cloud.version>Finchley.SR1spring-cloud.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<finalName>6111finalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
EurekaApplication6111 启动类代码:
package springcloud.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer //启动一个服务注册中心提供给其他应用进行对话
@SpringBootApplication
public class EurekaApplication6111 {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication6111.class, args);
}
}
application.properties 配置文件:
server.port=6111
spring.application=eureka-server-6111
#将 enreka 服务注册到其他enreka服务上面去,实现enreka高可用
eureka.client.serviceUrl.defaultZone=http://192.168.2.126:6110/eureka/
#是否向服务注册中心注册自己
eureka.client.registerWithEureka=false
#是否检索服务
eureka.client.fetchRegistry=false
3,说明:
以上项目 EurekaApplication6110 和 EurekaApplication6111 代码基本一致,不同之处:
server.port=xxx // 端口号,6010 和 6011
spring.application=xxx // 项目名称
eureka.client.serviceUrl.defaultZone=xxx // 服务注册中心,将两个 eureka 服务进行相互注册
pom.xml // pom 文件里面 的groupId 和 springcloud_eureka6111 有些许不同
以上为几处不同,自己稍微修改就可以了
4,项目演示:
两个项目都配置好之后我们就可以启动项目了,由于我启动了两台虚拟主机,所以注册的 ip 地址会不一样,如果单机版本的话修改相应ip地址即可,如果需要注册到多台 eureka 服务上面的话
eureka.client.serviceUrl.defaultZone=xxx,xxx
后面的 eureka 服务以,分割即可,注意,号之前不要有空格。
此时启动两个 eureka 服务并且访问上面配置中的两个 eureka 服务
http://192.168.2.126:6110
与
http://192.168.2.131:6111
会出现 eureka 界面展示控制台,并且发现 126:6110 与 131:6111 两个 eureka 服务之间实现了相互的注册。
Eureka 自我保护机制:
Eureka 的自我保护模式是有意义的,该模式被激活后,它不会从注册列表中剔除因长时间没收到心跳导致租期过期的服务,而是等待修复,直到心跳恢复正常之后,它自动退出自我保护模式。这种模式旨在避免因网络分区故障导致服务不可用的问题。例如,两个客户端实例 C1 和 C2 的连通性是良好的,但是由于网络故障,C2 未能及时向 Eureka 发送心跳续约,这时候 Eureka 不能简单的将 C2 从注册表中剔除。因为如果剔除了,C1 就无法从 Eureka 服务器中获取 C2 注册的服务,但是这时候 C2 服务是可用的。
所以,Eureka 的自我保护模式最好还是开启它。
到此 Eureka 服务注册中心的高可用就配置完毕了。