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

系统管理员 2023-07-05 13:07 62阅读 0赞

一、前言

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. 搭建父工程

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.thinkingcao</groupId>
  5. <artifactId>springcloud-eureka-jq</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <name>springcloud-eureka-jq</name>
  8. <packaging>pom</packaging>
  9. <description>基于SpringCloud搭建Eureka集群环境(高可用)</description>
  10. </project>

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

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

  1. <groupId>com.thinkingcao</groupId>
  2. <artifactId>springcloud-eureka-server1</artifactId>
  3. <version>0.0.1-SNAPSHOT</version>
  4. <name>springcloud-eureka-server1</name>
  5. <description>Demo project for Spring Boot</description>
  6. <packaging>jar</packaging>
  7. <!--SpringBoot依赖版本-->
  8. <parent>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-parent</artifactId>
  11. <version>2.0.3.RELEASE</version>
  12. <relativePath/>
  13. </parent>
  14. <!--项目编码、jdk版本、SpringCloud版本定义-->
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  17. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  18. <java.version>1.8</java.version>
  19. <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
  20. </properties>
  21. <!--声明管理SpringCloud版本依赖信息-->
  22. <dependencyManagement>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.cloud</groupId>
  26. <artifactId>spring-cloud-dependencies</artifactId>
  27. <version>${ spring-cloud.version}</version>
  28. <type>pom</type>
  29. <scope>import</scope>
  30. </dependency>
  31. </dependencies>
  32. </dependencyManagement>
  33. <!--依赖信息-->
  34. <dependencies>
  35. <!--springcloud整合eureka服务端组件-->
  36. <dependency>
  37. <groupId>org.springframework.cloud</groupId>
  38. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  39. </dependency>
  40. </dependencies>
  41. <!--maven插件-->
  42. <build>
  43. <plugins>
  44. <plugin>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-maven-plugin</artifactId>
  47. </plugin>
  48. </plugins>
  49. </build>

2 、配置application.yml

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

  • application.yml

    服务端口号

    server:
    port: 8000

    定义服务名称(服务注册到eureka名称)

    spring:
    application:

    1. name: app-thinkingcao-eureka

    eureka:
    instance:

    1. #Eureka注册中心ip地址
    2. hostname: 127.0.0.1

    client:

    1. serviceUrl:
    2. #注册地址
    3. defaultZone: http://${ eureka.instance.hostname}:9000/eureka/
    4. #表示是否需要将自己注册给自己的注册中心,因为自己是注册中心,单机版本时不需要,设置为false(集群的时候需要是为true)
    5. register-with-eureka: true
    6. #因为自己是注册中心,不需要去检索服务信息,单机版本时不需要,设置为false(集群的时候需要是为true)
    7. 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 {

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

    }

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

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

  1. <!--SpringBoot依赖版本-->
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.0.3.RELEASE</version>
  6. <relativePath/>
  7. </parent>
  8. <!--项目编码、jdk版本、SpringCloud版本定义-->
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  12. <java.version>1.8</java.version>
  13. <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
  14. </properties>
  15. <!--声明管理SpringCloud版本依赖信息-->
  16. <dependencyManagement>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-dependencies</artifactId>
  21. <version>${ spring-cloud.version}</version>
  22. <type>pom</type>
  23. <scope>import</scope>
  24. </dependency>
  25. </dependencies>
  26. </dependencyManagement>
  27. <!--依赖信息-->
  28. <dependencies>
  29. <!--springcloud整合eureka服务端组件-->
  30. <dependency>
  31. <groupId>org.springframework.cloud</groupId>
  32. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  33. </dependency>
  34. </dependencies>
  35. <!--maven插件-->
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-maven-plugin</artifactId>
  41. </plugin>
  42. </plugins>
  43. </build>

2 、配置application.yml

  • application.yml

    服务端口号

    server:
    port: 9000

    定义服务名称(服务注册到eureka名称)

    spring:
    application:

    1. name: app-thinkingcao-eureka

    eureka:
    instance:

    1. #Eureka注册中心ip地址
    2. hostname: 127.0.0.1

    client:

    1. serviceUrl:
    2. #注册地址
    3. defaultZone: http://${ eureka.instance.hostname}:8000/eureka/
    4. #表示是否需要将自己注册给自己的注册中心,因为自己是注册中心,单机版本时不需要,设置为false(集群的时候需要是为true)
    5. register-with-eureka: true
    6. #因为自己是注册中心,不需要去检索服务信息,单机版本时不需要,设置为false(集群的时候需要是为true)
    7. 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 {

    1. public static void main(String[] args) {
    2. SpringApplication.run(SpringcloudEurekaServer2Application.class, args);
    3. }

    }

五、启动测试

注意: 当启动第一台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. 注册订单服务到集群地址配置如下:

  1. ###订单服务的端口号
  2. server:
  3. port: 8761
  4. ###服务别名----服务注册到注册中心名称
  5. spring:
  6. application:
  7. name: app-itmayiedu-order
  8. eureka:
  9. client:
  10. service-url:
  11. ##### 当前会员服务注册到eureka服务地址
  12. defaultZone: http://localhost:8000/eureka,http://localhost:9000/eureka
  13. ### 需要将我的服务注册到eureka上
  14. register-with-eureka: true
  15. ####需要检索服务
  16. fetch-registry: true

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

  1. ###会员项目的端口号
  2. server:
  3. port: 8765
  4. ###服务别名----服务注册到注册中心名称
  5. spring:
  6. application:
  7. name: app-itmayiedu-member
  8. eureka:
  9. client:
  10. service-url:
  11. ##### 当前会员服务注册到eureka服务地址
  12. defaultZone: http://localhost:8000/eureka,http://localhost:9000/eureka
  13. ### 需要将我的服务注册到eureka上
  14. register-with-eureka: true
  15. ####需要检索服务
  16. 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 条评论,62人围观)

还没有评论,来说两句吧...

相关阅读