Spring Cloud系列教程(三):Eureka实现高可用集群环境搭建

一、前言

SpringCloud微服务项目中,注册中心是其中的一部分,注册中心充当了服务的注册和发现角色,更为核心的是解决了微服务项目中的一系列服务治理问题,如果一旦服务注册出现故障的时候,可能会导致整个微服务无法访问,在这时候就需要对注册中心实现高可用集群模式,Eureka集群的原理:其实就是两台或者多台Eureka server服务相互注册,将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组相互注册的服务注册中心,从而实现服务清单的互相同步,达到高可用效果。

Eureka集群原理用爱情的语言描述就是: 你中有我,我中有你!!!

二、环境搭建

注意: 所有eureka server的服务别名要相同,全部一致; spring.application.name

1. 实现效果

基于前面搭建eureka服务的方式: SpringCloud系列教程(一):服务的注册与发现(Eureka) ,搭建两台eureka-server服务,除了yml的配置不一样之外,其他都是一样的,集群采用相互注册方式;
因此一共建3个项目: springcloud-eureka-jq(父工程)springcloud-eureka-server1(eureka服务1,端口为9000)springcloud-eureka-server2(eureka服务2,端口为8000),具体建项目过程这里不再累赘,前面章节说过,这里只贴核心配置;

2. 搭建父工程

<?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>

    <groupId>com.thinkingcao</groupId>
    <artifactId>springcloud-eureka-jq</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-eureka-jq</name>
    <packaging>pom</packaging>
    <description>基于SpringCloud搭建Eureka集群环境(高可用)</description>

</project>

三、搭建第一台注册中心springcloud-eureka-server1

1、在父工程的基础上新建module,依赖信息如下:

  <groupId>com.thinkingcao</groupId>
    <artifactId>springcloud-eureka-server1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-eureka-server1</name>
    <description>Demo project for Spring Boot</description>
    <packaging>jar</packaging>

    <!--SpringBoot依赖版本-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>

    <!--项目编码、jdk版本、SpringCloud版本定义-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <!--声明管理SpringCloud版本依赖信息-->
    <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>

    <!--依赖信息-->
    <dependencies>
        <!--springcloud整合eureka服务端组件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

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

2 、配置application.yml

注意: 集群环境的时候,服务名称需要统一一致,defaultZone为另外一台eureka server的地址,如果有3台或者多台注册中心,集群注册地址用逗号隔开

  • application.yml
#服务端口号
server:
  port: 8000
#定义服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-thinkingcao-eureka
eureka:
  instance:
    #Eureka注册中心ip地址
    hostname: 127.0.0.1
  client:
    serviceUrl:
      #注册地址
      defaultZone: http://${eureka.instance.hostname}:9000/eureka/
    #表示是否需要将自己注册给自己的注册中心,因为自己是注册中心,单机版本时不需要,设置为false(集群的时候需要是为true)
    register-with-eureka: true
    #因为自己是注册中心,不需要去检索服务信息,单机版本时不需要,设置为false(集群的时候需要是为true)
    fetch-registry: true

3 、启动类开启注册eureka服务
开启Eureka服务端只需要在启动类上使用注解 @EnableEurekaServer即可;

  • SpringcloudEurekaServer1Application.java
package com.thinkingcao.api;

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

@SpringBootApplication
@EnableEurekaServer
public class SpringcloudEurekaServer1Application {

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

}

四、搭建第二台注册中心springcloud-eureka-server2

1、在父工程的基础上新建module,依赖信息如下:

<!--SpringBoot依赖版本-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>

    <!--项目编码、jdk版本、SpringCloud版本定义-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <!--声明管理SpringCloud版本依赖信息-->
    <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>

    <!--依赖信息-->
    <dependencies>
        <!--springcloud整合eureka服务端组件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

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

2 、配置application.yml

  • application.yml
#服务端口号
server:
  port: 9000
#定义服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-thinkingcao-eureka
eureka:
  instance:
    #Eureka注册中心ip地址
    hostname: 127.0.0.1
  client:
    serviceUrl:
      #注册地址
      defaultZone: http://${eureka.instance.hostname}:8000/eureka/
    #表示是否需要将自己注册给自己的注册中心,因为自己是注册中心,单机版本时不需要,设置为false(集群的时候需要是为true)
    register-with-eureka: true
    #因为自己是注册中心,不需要去检索服务信息,单机版本时不需要,设置为false(集群的时候需要是为true)
    fetch-registry: true

3、启动类

  • SpringcloudEurekaServer2Application.java
package com.thinkingcao.api;

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

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

五、启动测试

注意: 当启动第一台eureka服务的时候报错,这是正常的! 因为集群是多台eureka服务端相互注册,在启动第一台的时候就会开始互相注册,但是启动有先后顺序 不会同时启动成功的;一般第一台启动报错了,继续将其他都启动完毕后,第一台会自动注册链接。恢复正常;

1、启动Eureka服务

先启动SpringcloudEurekaServer1Application

报错: Cannot execute request on any known server
在这里插入图片描述

继续启动SpringcloudEurekaServer2Application,稍等片刻查看SpringcloudEurekaServer1Application的控制台会发现服务已经恢复成功了;

2、访问Eureka服务

第一步: 先访问URL:http://127.0.0.1:9000/9000这台Eureka服务的效果如下:

在这里插入图片描述

第二步: 再访问URL: http://127.0.0.1:8000/8000这台Eureka服务效果如下:
在这里插入图片描述
观察80009000这两台Eureka访问的结果,9000Eureka注册中心服务列表上有90008000,这时候会发现8000注册中心上只有9000这一个服务,而上面访问 http://127.0.0.1:9000/ 时,注册中心服务列表显示了90008000,出现这个原因是因为在启动两台Eureka注册中心时不会立刻相互注册,两台Eureka服务相互注册同步需要时间,一般先启动的会后同步过来,稍等片刻之后再查看发现已经实现了集群模式,以对方为注册中心相互注册了;
在这里插入图片描述

六、集群环境如何注册和发现服务

以前一个章节的订单服务调用会员服务为例,在Eureka集群环境下时,如果将会员服务注册到Eureka,此时Eureka服务为多台的,会员服务配置Eureka注册地址时,多个地址之间需要使用逗号隔开,并且服务提供者和服务消费者都要进行多个地址注册;

1. 注册订单服务到集群地址配置如下:

###订单服务的端口号
server:
  port: 8761
###服务别名----服务注册到注册中心名称 
spring:
  application:
    name: app-itmayiedu-order
eureka:
  client:
    service-url:
    ##### 当前会员服务注册到eureka服务地址
      defaultZone: http://localhost:8000/eureka,http://localhost:9000/eureka
    ### 需要将我的服务注册到eureka上
    register-with-eureka: true
    ####需要检索服务
    fetch-registry: true

2. 注册会员服务到集群地址配置如下:

###会员项目的端口号
server:
  port: 8765
###服务别名----服务注册到注册中心名称 
spring:
  application:
    name: app-itmayiedu-member
eureka:
  client:
    service-url:
    ##### 当前会员服务注册到eureka服务地址
      defaultZone: http://localhost:8000/eureka,http://localhost:9000/eureka
    ### 需要将我的服务注册到eureka上
    register-with-eureka: true
    ####需要检索服务
    fetch-registry: true

到这里,配置方式就像上面一样,多个注册中心地址用逗号隔开,具体可以自己去测试;

3. eureka-server1效果如下
在这里插入图片描述

4. eureka-server2效果如下
在这里插入图片描述

七、源码

源码: https://github.com/Thinkingcao/SpringCloudLearning/tree/master/springcloud-eureka-jq

八、SpringCloud系列教程

SpringCloud系列教程(四) : Spring Cloud系列教程(四) - Eureka自我保护机制(Finchley版本)

SpringCloud教程汇总: Spring Cloud系列教程(汇总篇):专栏汇总篇(持续更新中)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,根据您的实验目的,以下是一些关于SpringCloudEureka注册中心以及Eureka高可用性的具体实验内容: 1. SpringCloud概述 首先,您需要了解SpringCloud的基本概念和原理。您可以通过阅读SpringCloud的官方文档或其他相关书籍来学习SpringCloud的相关知识。 2. 搭建Eureka注册中心 接下来,您需要独立搭建一个Eureka注册中心。您可以使用SpringBoot和SpringCloud的相关组件来创建一个Eureka服务器,并将其作为服务注册和发现的中心。您需要了解如何配置Eureka服务器,并将其与您的应用程序集成。 3. 注册服务实例 一旦您搭建好了Eureka注册中心,您需要编写代码来注册您的服务实例。您可以使用SpringCloud的相关组件来实现服务实例的注册、注销和查询。您需要了解如何编写代码来将服务实例注册到Eureka服务器,并获取其他服务实例的信息。 4. 实现Eureka高可用性 在实现Eureka高可用性方面,您需要了解如何使用Eureka服务器的集群来提高系统的可用性。您可以使用Netflix的开源项目Eureka Server”来创建Eureka服务器的集群。您需要编写代码来将多个Eureka服务器连接在一起,并确保它们之间的同步和数据共享。 5. 测试和部署 最后,您需要测试您的系统,并将其部署到生产环境中。您可以使用JMeter等工具来测试您的系统的性能和可靠性。您需要了解如何将您的应用程序部署到云端或其他环境中,并确保您的系统能够稳定运行。 希望这些信息对您有所帮助,如果您有任何其他问题或需要更详细的解释,请随时告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinkingcao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值