Eureka集群高可用配置

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

主要讲一下搭建Eureka集群的方法和可能遇到的坑。
环境:spring boot 2.1.3 、eclipse

  1. 创建项目
    创建一个父Maven项目(项目名:springcloud),模板选择快速开始就可以,因为父module不需要放代码就删掉了src目录。然后父项目pom文件:
<?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>

	<groupId>com.roy</groupId>
	<artifactId>springcloud</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>

	<name>springcloud</name>
	<url>http://maven.apache.org</url>

	<!--父级:Spring Boot -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
	</parent>

	<!--参数 -->
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<!--Spring Cloud 版本序列配置 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<!--Spring Boot 执行器组件 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<!--Spring Cloud 基础 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter</artifactId>
		</dependency>
		<!--Spring Cloud 服务注册组件 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<!--此处的依赖是SpringBoot2.0以后专用的,如果您使用的SpringBoot版本低于2.0请使用spring-cloud-starter-eureka-server -->
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>
		<!--Spring Boot Web组件 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--Spring Boot 测试组件 -->
		<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>

	<modules>
	<module>eureka</module>
    <module>eureka-hi</module>
  	</modules>
</project>

再新建一个子module(模板选择快速开始就ok)作为服务注册中心,命名为eureka,因为依赖都在父module里了,这里的pom文件默认就可以。新建一个yml文件:

---
# 高可用节点1的配置
server:
  port: 8761
spring:
  # 节点1的标签
  profiles: peer1
  # 服务名保持一致
  application:
    name: eureka
eureka:
  instance:
    hostname: peer1
    prefer-ip-address: false
  client:
    # 进行注册(高可用配置、默认配置)
    # registerWithEureka: true
    # 获取注册信息(高可用配置、默认配置)
    # fetchRegistry: true
    service-url:
      # 节点1向节点2/3进行服务注册
      defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/

---
# 高可用节点2的配置
server:
  port: 8762
spring:
  # 节点2的标签
  profiles: peer2
  # 服务名保持一致
  application:
    name: eureka
eureka:
  instance:
    prefer-ip-address: false
    hostname: peer2
    
  client:
    # 进行注册(高可用配置、默认配置)
    # registerWithEureka: true
    # 获取注册信息(高可用配置、默认配置)
    # fetchRegistry: true
    service-url:
      # 节点2向节点1/3进行服务注册
      defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/

---
# 高可用节点3的配置
server:
  port: 8763
spring:
  # 节点3的标签
  profiles: peer3
  # 服务名保持一致
  application:
    name: eureka
eureka:
  instance:
    hostname: peer3
    prefer-ip-address: false
  client:
    # 进行注册(高可用配置、默认配置)
    # registerWithEureka: true
    # 获取注册信息(高可用配置、默认配置)
    # fetchRegistry: true
    service-url:
      # 节点3向节点1/2进行服务注册
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

到此高可用的服务注册中心就完成了
2. Eclipse中Run Configuration的配置
在run configuration中新建三个Spring Boot App。配置项目名(相同)、mainclass(相同),还有Arguments=>Program arguments配置--spring.profiles.active=peer1(peer1、peer2、peer3为yml文件里设置的节点标签)然后分别运行三个Spring Boot App

3.盘点一下遇到的坑
所有服务显示在了unavailable-replicas之下,可能原因有以下几点:

  1. defaultZone配置项
    eureka.client.serviceUrl.defaultZone配置项的地址,不能使用localhost,要使用域名,DNS解析请自行配置。
    host文件添加域名映射:
127.0.0.1   peer1
127.0.0.1   peer2
127.0.0.1   peer3
  1. spring.application.name要一致(这个个人测试默认不配也可以)
spring:
  # 服务名保持一致
  application:
    name: eureka
  1. 配置eureka.instance.hostname(好像看到过正常eureka会自动拉取设备host,但各节点在同一机器下时请务必添加,注意各节点配置自己节点的host)
eureka:
  instance:
    hostname: peer2
  1. 千折腾万折腾还是不好使的时候,请去掉下面这个参数或者改为false(神坑),未找到官方原因。。
eureka:
  instance:
    prefer-ip-address: false
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章