概述:为了保证EurekaServer的高可用,可以采用服务集群方式。当有一台挂掉时,其他节点仍可以继续提供服务。在EurekaServer的集群配置中,他们为分别配置对方为自己的注册中心,并将自己节点数据同步到集群中其他节点上。并且保持从其他节点获取注册服务信息。Eureka注册中心在CAP原理中保持 AP原则,允许短暂的数据不一致性(丢弃了数据的强一致性),来保持服务的高可用性。

一、EurekaServer集群搭建

步骤1,创建两个不同的EurekaServer工程,分别命名为cloud-eureka-server7001、cloud-eureka-server7002

步骤2,给两个工程中pom文件添加EurekaServer依赖,由于文件内容相同这里只贴一个的代码

<?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">
    <parent>
        <groupId>com.xiaohui.springCloud</groupId>
        <artifactId>SpringCloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-eureka-server7001</artifactId>

    <dependencies>
        <!-- Eureka服务端依赖 -->
        <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-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

步骤3,添加SpringBoot配置文件application.yml(重点

在集群的过程中由于EurekaServer节点需要相互同步数据,所以他们的默认注册的地址为对方的服务地址(defaultZone),并且将自己是否注册到注册中心以及从注册中心拉取服务都应为true。为了方便后面登录Eureka控制台页面查看副本情况,我们在本地hosts文件上做了一个假域名映射,用来配置区分不同的EurekaServer地址。

127.0.0.1 eureka1.com
127.0.0.1 eureka2.com
127.0.0.1 eureka3.com

7001节点的配置文件application.yml如下:

server:
  port: 7001

spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: eureka1.com
  client:
    register-with-eureka: true #是否将自己注册到注册中心上
    fetch-registry: true #是否从Eureka上获取注册信息
    service-url:
      defaultZone: http://eureka2.com:7002/eureka/

7002节点的配置文件application.yml如下:

server:
  port: 7002

spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: eureka2.com
  client:
    register-with-eureka: true #是否将自己注册到注册中心上
    fetch-registry: true #是否从Eureka上获取注册信息
    service-url:
      defaultZone: http://eureka1.com:7001/eureka/

步骤4,创建SpringBoot项目的启动类,并类上配置@EnableEurekaServer注解来激活Eureka功能。

package com.xiaohui.springcloud;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain.class,args);
    }
}

下来我们可以分别启动两台EurekaServer服务。当都启动成功后,我们分别访问各自的控制台页面 eureka1.com:7001、eureka2.com:7002,可以看到他们彼此成为对方的副本,以及Eureka-Server的服务id下都有两个节点在运行中。并且之前只注册到一个节点上的服务信息,也同步到了另一台EurekaServer节点上。

二、将服务注册到多个EurekaServer中

在上面搭建过程中我们之前生产者和消费者工程中的配置文件中所配置的EurekaServer地址都是单个节点的地址,假如只配置一个节点地址的话,当该节点挂掉之后,改服务将无法注册拉取服务到EurekaServer上。这时系统就会出现问题。所以当EurekaServer采用了集群部署后,我们客户端应用也应该调整配置,保持和多个EurekaServer都进行连接。保证服务的高可用。配置多条EurekaServer的方式为在eureka.client.service-url.defaultZone配置项上将多个EurekaServer地址使用逗号隔开。如下分别为生产者工程和消费者工程的application.yml文件配置信息:

生产者配置文件:

server:
  port: 8001 #服务端口

spring:
  application:
    name: cloud-payment-service #服务名称
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://192.168.17.128:3306/springcloud?characterEncoding=UTF-8
    username: root
    password: root

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka1.com:7001/eureka/,http://eureka2.com:7002/eureka/
  instance:
    prefer-ip-address: true #使用ip进行注册

mybatis:
  mapperLocations: classpath:mapper/*.xml
  type-aliases-package: com.xiaohui.springcloud.entities

消费者工程配置文件:

server:
  port: 80 #服务端口

spring:
  application:
    name: cloud-order-service #服务名称

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka1.com:7001/eureka/,http://eureka2.com:7002/eureka/

当我们测试在正常的服务环境中突然挂掉一台EurekaServer时,看服务是否能正常的提供,服务之间能否正常调用返回:

通过访问服务之间仍可正常调用。接下来我们测试一下,当存在挂掉节点的EurekaServer时,服务能否正常启动注册获取。经测试在只有一台正常运行的EurekaServer集群环境中,重新启动的生产者和消费者都可以正常的使用restTemplate进行调用。

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐