Spring Cloud | 服务 “注册与发现“ 框架 : Eureka框架

发布于:2024-06-03 ⋅ 阅读:(121) ⋅ 点赞:(0)

目录:

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Cloud微服务架构开发》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


  • 服务的注册 发现对于 微服务架构来说是一个非常重要的环节。在 单一架构应用中,业务逻辑层 ( Business Logic Layer,BLL )中的 接口之间互相调用,是通过一个固定HostPort发起REST 或者 “RPC调用”。但是在微服务架构中,每个服务是 “动态变化” 的,难以通过 静态配置方式维护服务,以至于后来产生了大量服务发现框架完成 服务自动化管理

Eureka 的 “工作机制” :

一、Eureka 的 “工作原理” ( 两大组件 ) :

  • 服务注册与发现框架 : Eureka框架 ,该框架"包含" 两个组件,分别是 : (1) Eureka Server (2) Eureka Client
1.1 Eureka Server ( 服务注册中心 )
  • Eureka Server : 服务注册服务器 / 服务注册中心各个服务启动后,会在 Eureka Server (服务注册中心) 中进行 注册,这样Eureka Server服务注册表中将会存储 所有 可用服务节点信息服务节点的信息可以界面中直观地看到
    -----( 简而言之 : 各个服务启动后,会在"服务注册中心"中进行注册注册的信息存储在 "服务注册表"中,这些服务节点信息可在"界面"中直观地看到 )
1.2 Eureka Client ( 服务/服务实例,其存在 “两种角色” : ①服务提供者 ②服务消费者 ) :
Eureka Client 的 含义
  • Eureka Client : 也称为 服务 ( 服务实例 ),作为一个 Java客户端,用于 简化与 Eureka Server交互
    Eureka Client内置一个 使用轮询负载算法负载均衡器服务启动后Eureka Client ( 服务实例 ) 将 会向 Eureka Server 发送 心跳更新服务,如果 Eureka Server多个心跳周期内( 默认90s )没有接收某个服务的心跳Eureka Server ( 服务注册中心 )就将会从 服务注册表中把这个服务节点移除。为了更好地讲解 Eureka 组件工作原理,具体描述为下图所示 :

    在这里插入图片描述

    在上图中,Eureka Client ( 服务 / 服务实例) 注册Eureka Server ( 服务注册中心 )Eureka Client 中的 服务是通过 REST 调用的除此之外Eureka Client还具有缓存功能Eureka Client ( 服务 / 服务实例 ) 能够从 Eureka Server ( 服务注册中心 ) 查询当前注册服务信息缓存到本地,这样即使Eureka Server宕机Eureka Client 也依然可以 利用缓存 中的 信息调用服务


  • EurekaClient ( 服务 / 服务实例 )存在 两种角色,分别是 服务提供者 服务消费者
服务提供者
  • EurekaClient ( 服务 / 服务实例 ) 启动后服务提供者会通过REST请求自己注册Eureka Server ( 服务注册服务器 ) 中, 并维护一个心跳 (默认30 秒发送一次心跳 ) 进行服务续约,告诉 EurekaServer我还活着防止 Eureka Server该服务 从服 务列表剔除
服务消费者
  • 用于获取 Eureka Server ( 服务注册中心 ) 注册“服务清单”,并且 “服务清单” 默认 每隔 30 秒更新一次服务消费者 获取到 服务清单能够根据自己的需求决定调用哪个服务默认采用轮询方式调用,从而实现Eurekaclient负载均衡
Eureka Server 与 服务提供者、服务消费者之间的关系
  • Eureka Server服务提供者服务消费者之间的关系 如下图所示 :

    在这里插入图片描述

    在上图中,服务提供者服务消费者 都属于 Eureka Client,它们都会自己的信息通过REST API 的形式 提交给EurekaServer

    服务消费者 “注册后”,还会获取一份 服务注册列表,该列表包含了所有向 Eureka Server ( 服务注册中心 ) 注册服务信息获取到服务注册信息后服务消费者就会根据服务提供者IP 地址,通过 HTTP 远程调用服务提供者服务

  • 需要注意的是,服务提供者服务消费者可以相互转换的,因为一个服务可能是服务消费者,同时又可能是服务提供者。例如在传统企业应用三层架构中,服务层会调用数据访问层的接口进行数据操作它本身也会提供服务给控制层使用

二、 第一个 Eureka应用 :

  • 介绍了 Eureka工作机制 后,下面我们通过开发第一个Eureka应用加深对 服务注册发现框架 : Eureka框架 的理解。
  • 建议是 先建一个空工程,在这个工程中创建下面的项目
2.1 搭建 “Eureka Server”
  • 通过上面的学习,大家应该知道了 Eureka Server 是一个 服务注册与发现中心 / 服务注册中心有了它我们才可以
    注册Eureka Client ( 服务 / 服务实例 )。接下来我们 先搭建 Eureka Server具体步骤如下
① 创建 Eureka Server 项目
  • 使用 Spring Initializr方式创建一个名称eureka-serverSpring Boot项目,这里将Group命名com.myh,将 Artifact 命名eureka-server添加Eureka Server 依赖

    在这里插入图片描述

  • 项目创建好后pom.xml文件代码 如下所示 :

    pom.xml :

    <?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>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<!--	SpringBoot的版本为:2.1.7.RELEASE 	-->
    		<version>2.1.7.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.myh</groupId>
    	<artifactId>eureka-server</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>eureka-server</name>
    	<description>eureka-server</description>
    	<properties>
    		<java.version>1.8</java.version>
    		<!--	Springcloud的版本为:Greenwich.SR2 	-->
    		<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    	</properties>
    	<dependencies>
    
    		<!--	引入了 eureka-server的jar包	-->
    		<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>
    	<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>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    
② 全局配置文件( .yml文件 )中添加 “Eureka” ( 服务注册中心 ) 的相关配置信息
  • 全局配置文件application.yml中添加Eureka的相关配置信息 ( 项目自动生成配置文件application.properties,我们可直接将后缀名改掉就行,这两个文件格式都可以只是内部的内容格式不同。)

    application.yml :

    server:
      port: 7000  #服务端口号为: 7000 / 指定 "服务注册中心"的"端口号"为:7000
    
    spring:
      application:
        name: eureka-server #端口号名称配置 / 指定"服务注册中心"的名称
    
    eureka:
      client:   
        register-with-eureka: false  #表示不将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true)
        fetch-registry: false  #表示 "不从" EurekaSever 中获取 "注册信息" (默认值为true)
        #(因为这里搭建的是Eureka Server,无须注册服务,也无须获取注册信息,所以 register-with-eureka 和 fetch-registry 的值都设置为false,其默认值为true )
        service-url:
          defaultZone: #设置"服务注册中心地址"
            http://${eureka.instance.hostname}:${server.port}/eureka/
      instance:
        hostname: localhost #主机名
    

    上面的配置信息中,server.port 指定了服务器端口号 :7000Spring.application.name 指定了当前 服务名称eureka-serverEureka.client.register-with-eureka用于设置是否向 Eureka Server “注册”默认值true
    Eureka.client.fetch-registry表示是否从Eureka Server “获取注册信息”,由于这里
    搭建的是Eureka Server
    无须注册服务也无须获取注册信息,因此,这里将fetch-registryregister-with-eureka的值 都设置为falseEureka.client.service-url.defaultZone 用于设置 “服务注册中心地址

③ 在项目启动类 上添加 @EnableEurekaServer 注解
  • 项目启动类添加 @EnableEurekaServer 注解 启动 Eureka Server功能

    在这里插入图片描述


    EurekaServerApplication.java (项目启动类) :

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer // 启动Eureka Server
    public class EurekaServerApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(EurekaServerApplication.class, args);
    	}
    
    }
    
④ 启动 项目启动类 的main( )方法
  • 启动 项目启动类main( )方法启动成功后,在浏览器访问 http://localhost:7000/ 网址 来查看 Eureka Server主界面 , 效果如下图 :

    在这里插入图片描述

2.2 搭建 “Eureka Client” 作为 “服务提供者”
  • 下面我们来搭建一个 EurekaClient 作为 服务提供者,并将其注册上面搭建Eureka Server ( 服务注册中心 ) 中,具体步骤如下
⑤ 创建 Eureka Client 项目 ( 作为 “服务提供者” )
  • 使用 Spring Initializr方式创建一个名称eureka-provider ( 服务提供者 )的 Spring Boot项目。这里将 Group 命名为 com.myh , 将 Artifact命名为 eureka-provider , 添加 WebEureka Client 依赖

    在这里插入图片描述

  • 项目创建好后pom.xml文件 代码如下所示 :

    pom.xml :

    <?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>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <!--    SpringBoot的版本为:2.1.7.RELEASE   -->
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.myh</groupId>
        <artifactId>eureka-provider</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-provider</name>
        <description>eureka-provider</description>
        <properties>
            <java.version>1.8</java.version>
            <!--    Springcloud的版本为:Greenwich.SR2  -->
            <spring-cloud.version>GreenWich.SR2</spring-cloud.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--    引入了 eureka-client 的jar包    -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <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>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
⑥ 全局配置文件( .yml文件 )中添加 “Eureka” ( 服务提供者 )的相关配置信息
  • 全局配置文件application.yml中添加Eureka的相关配置信息 ( 项目自动生成配置文件application.properties,我们可直接将后缀名改掉就行,这两个文件格式都可以只是内部的内容格式不同。)

    application.yml :

    server:
      port: 7006 #指定 "服务提供者"的端口号: 7006
    
    spring:
      application:
        name: eureka-provider #端口号名称配置 / 指定"服务提供者"的名称
    eureka:
      client:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          service-url:
             defaultZone:
               http://localhost:7000/eureka/  #指定EurekaServer(服务注册中心)的地址
      instance:
        hostname: localhost #主机名
    

    上面的配置信息中,server.port 指定了服务提供者端口号 , spring.application.name 指定了服务提供者名称
    eureka.client.service-url.defaultZone 指定Eureka Server ( 服务注册中心 ) 的 地址

⑦ 在项目启动类 上添加 @EnableEurekaClient 注解
  • 项目启动类添加 @EnableEurekaClient 注解 启动 Eureka Client功能

    在这里插入图片描述


    EurekaProviderApplication.java (项目启动类) :

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableEurekaClient //启动Eureka Client功能
    public class EurekaProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaProviderApplication.class, args);
        }
    
    }
    
⑧ 运行 “程序启动类”
  • 保证EurekaServer ( 服务注册中心 )启动状态下运行EurekaProviderApplication 这个项目启动类启动eureka-provider启动成功后控制台输出如下信息代码 :

    在这里插入图片描述

    述日志信息说明 eureka-provider ( 服务提供者 ) 成功注册EurekaServer ( 服务注册中心 )上。在浏览器中访问 :
    http://localhost:7000/,效果如下图所示 :

    在这里插入图片描述

    上图可见,“Instances currently registered with Eureka这一项中注册了一个 名称为 : “EUREKA-PROVIDER” 的 服务,说明 服务提供者 已经 成功注册EurekaServer ( 服务注册中心 ) 中。

2.3 搭建 “Eureka Client” 作为 “服务消费者”

搭建一个 EurekaClient 作为 服务消费者。其搭建方式与搭建服务提供者基本一样,具体步骤如下。

  • 下面我们来搭建一个 EurekaClient 作为 服务消费者,并将其注册上面搭建Eureka Server ( 服务注册中心 ) 中,具体步骤如下
⑨ 创建 Eureka Client 项目 ( 作为 “服务消费者” )
  • 使用 Spring Initializr 方式创建一个名称为 : eureka-consumerSpring Boot 项目,这里将 Group 命名为 com.myh,将 Artifact 命名为 eureka-consumer , 添加 Eureka Client 依赖

    在这里插入图片描述

  • 创建好后pom.xml 文件代码 如下所示 :

    pom.xml

    <?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>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <!--	SpringBoot的版本为:2.1.7.RELEASE 	-->
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.myh</groupId>
        <artifactId>eureka-consumer</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-consumer</name>
        <description>eureka-consumer</description>
        <properties>
            <java.version>1.8</java.version>
            <!--	Springcloud的版本为:Greenwich.SR2 	-->
            <spring-cloud.version>GreenWich.SR2</spring-cloud.version>
        </properties>
        <dependencies>
    
            <!--  引入了 eureka-client 的jar包	-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
        </dependencies>
        <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>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
⑩ 全局配置文件( .yml文件 )中添加 “Eureka” ( 服务消费者 ) 的相关配置信息
  • 全局配置文件application.yml中添加Eureka的相关配置信息 ( 项目自动生成配置文件application.properties,我们可直接将后缀名改掉就行,这两个文件格式都可以只是内部的内容格式不同。)

    application.yml

    server:
      port: 7002 #指定 "服务消费者"的端口号: 7002
    
    spring:
      application:
        name: eureka-consumer #端口号名称配置 / 指定"服务消费者"的名称
    eureka:
      client:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          service-url:
             defaultZone:
               http://localhost:7000/eureka/  #指定EurekaServer(服务注册中心)的地址
      instance:
        prefer-ip-address: true #显示主机的IP地址 ( 用于指定以"IP地址"注册到 Eureka Server上 )
    

    上面的配置信息中,server.port 指定了服务消费者端口号 , spring.application.name 指定了服务消费者名称
    eureka.client.service-url.defaultZone 指定Eureka Server ( 服务注册中心 ) 的 地址
    eureka.instance.prefer-ip-address 用于指定 IP地址 "注册"Eureka Server ( 服务注册中心 )上。

⑪ 在项目启动类 上添加 @EnableEurekaClient 注解
  • 项目启动类添加 @EnableEurekaClient 注解 启动 Eureka Client功能

    在这里插入图片描述


    EurekaConsumerApplication.java (项目启动类) :

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableEurekaClient //启动Eureka Client功能
    public class EurekaConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaConsumerApplication.class, args);
        }
    
    }
    
⑫ 运行 “程序启动类”
  • 保证EurekaServer ( 服务注册中心 )启动状态下运行EurekaConsumerApplication这个项目启动类启动eureka-consumer启动成功后,在浏览器中访问 : http://localhost:7000/,效果如下图所示 :

    在这里插入图片描述

    上图可见,“Instances currently registered with Eureka这一项中注册了一个 名称为 : “EUREKA-CONSUMER” 的
    服务,说明 服务消费者 已经 成功注册EurekaServer ( 服务注册中心 ) 中。

小提示
  • 调试 Eureka 时,有时 Eureka Server 主页面提示 下图所示的 警告信息

    在这里插入图片描述

    之所以出现这样的 警告信息,是因为本地调试触发Eureka Server 的保护机制。此时,可以在 Eureka Server全局配置文件中配置 “eureka.server.enable-self-preservation=false 参数,关闭保护机制 即可。

三、搭建 Eureka “高可用集群” :

  • 通过开发第一个Eureka应用,我们认识并体验Eureka组件简单用法。但是上面这个例子没有体现Eureka的高可用特性。下面我们对上面这个 Eureka应用进行改造,搭建 如下图所示Eureka 高可用集群

    在这里插入图片描述

  • 搭建Eureka高可用集群具体步骤如下

1. 更改系统 " hosts文件" 配置
① 更改系统 " hosts文件" 配置
  • 由于 当前的开发环境只有一台PC操作系统Windows,因此,如果要构建集群、就需要修改 hosts 文件,为其加主机名映射 找到 C:Windows\System32\drivers\etc\hosts 文件 ,把该hosts文件拉到桌面上文件中添加以下代码内容后最后将hosts文件拉回到 “原文件夹中”

    127.0.0.1 server1
    127.0.0.1 server2
    
2. 改造Eureka Server ( 服务注册中心 )
  • Eureka Server高可用 实际上就是 将自己作为服务其他服务注册中心注册自己,这样就可以形成一组互相注册服务注册中心,以 实现服务清单互相同步达到高可用的效果
  • 我们 在之前项目 eureka-server基础上进行扩展,构建一个 双节点服务注册中心集群具体操作步骤如下所示
② 再建一个 Eureka Server项目
  • 按照上面 创建 Eumeka Server 项目 的方式,再搭建 一个名 eureka-server-anotherEumeka Server 项目 :

    使用 Spring Initializr方式创建一个名称eureka-server-anotherSpring Boot项目,这里将Group命名com.myh,将 Artifact 命名eumeka-server-another添加Eureka Server 依赖

    在这里插入图片描述


    项目创建好后pom.xml文件代码 如下所示 :

    pom.xml :

    <?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>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <!--    SpringBoot的版本为:2.1.7.RELEASE   -->
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.myh</groupId>
        <artifactId>eureka-server-another</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-server-another</name>
        <description>eureka-server-another</description>
        <properties>
            <java.version>1.8</java.version>
            <!--    Springcloud的版本为:Greenwich.SR2  -->
            <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
        </properties>
        <dependencies>
    
            <!--    引入了 eureka-server的jar包 -->
            <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>
        <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>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
③ 修改 eureka-server 项目 ( 第一个"服务注册中心" ) 中的"全局配置文件"
  • 修改项目 : eureka-server全局配置文件 : application.yml修改后的配置文件代码 如下所示 :

    application.yml :

    server:
      port: 7000  #服务端口号为: 7000 / 指定 "服务注册中心"的"端口号"为:7000
    
    spring:
      application:
        name: eureka-server #端口号名称配置 / 指定"服务注册中心"的名称
    
    eureka:
      client:
        register-with-eureka: false  #表示不将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true)
        fetch-registry: false  #表示 "不从" EurekaSever 中获取 "注册信息" (默认值为true)
        #(因为这里搭建的是Eureka Server,无须注册服务,也无须获取注册信息,所以 register-with-eureka 和 fetch-registry 的值都设置为false,其默认值为true )
        service-url:
          defaultZone:  #设置"服务注册中心地址" ( 指向第二个创建的 "服务注册中心" )
            http://server2:7009/eureka/
      instance:
        hostname: server1  #主机名
    
④ 修改 eureka-server-another 项目 ( 第二个"服务注册中心" ) 中的"全局配置文件"
  • 修改项目 : eureka-server-another全局配置文件 : application.yml修改后的配置文件代码 如下所示 :

    application.yml :

    server:
      port: 7009  #服务端口号为: 7009 / 指定 "该服务注册中心"的"端口号"为:7009
    spring:
      application:
        name: eureka-server2  #端口号名称配置 / 指定该"服务注册中心"的名称
      eureka:
        client:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置
          service-url:
            defaultZone: #设置"服务注册中心地址" ( 指向第一个创建的 "服务注册中心" , 该注册操作为 : Eureka的"高可用" : 将"自己作为服务"向其他服务注册中心 "注册自己" )
              http://server1:7000/eureka/
      instance:
        hostname: server2 #主机名
    
⑤ 在项目启动类 上添加 @EnableEurekaServer 注解
  • 项目启动类添加 @EnableEurekaServer 注解 启动 Eureka Server功能
3. 改造 “服务提供者”
⑥ 再创建一个 Eureka Client 项目 ( 作为 “服务提供者” )
  • 由于 上图 : Eureka的 Eureka 高可用集群"两个" 服务提供者,因此我们 还需要搭建一个服务提供者

  • 使用 Spring Initializr方式创建一个名称eureka-provider-another ( 服务提供者 )的Spring Boot项目。这里将 Group 命名为 com.myh , 将 Artifact命名为 eureka-provider-another , 添加 WebEureka Client 依赖

    在这里插入图片描述

  • 项目创建好后pom.xml文件 代码如下所示 :

    pom.xml :

    <?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>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <!--	SpringBoot的版本为:2.1.7.RELEASE 	-->
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.myh</groupId>
        <artifactId>eureka-provider-another</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-provider-another</name>
        <description>eureka-provider-another</description>
        <properties>
            <java.version>1.8</java.version>
            <!--	Springcloud的版本为:Greenwich.SR2 	-->
            <spring-cloud.version>GreenWich.SR2</spring-cloud.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--  引入了 eureka-client 的jar包	-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <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>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
⑦ 全局配置文件( .yml文件 )中添加 “Eureka” ( 服务提供者 )的相关配置信息
  • 全局配置文件application.yml中添加Eureka的相关配置信息 ( 项目自动生成配置文件application.properties,我们可直接将后缀名改掉就行,这两个文件格式都可以只是内部的内容格式不同。)

    application.yml :

    server:
      port: 7007 #指定 该"服务提供者"的端口号: 7007
    
    spring:
      application:
        name: eureka-provider #端口号名称配置 / 指定该"服务提供者"的名称
    eureka:
      client:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          service-url:
            defaultZone:
              http://localhost:7000/eureka/  #指定EurekaServer(服务注册中心)的地址
      instance:
        hostname: localhost #主机名
    

    上面的配置信息中,server.port 指定了服务提供者端口号 , spring.application.name 指定了服务提供者名称
    eureka.client.service-url.defaultZone 指定Eureka Server ( 服务注册中心 ) 的 地址

⑧ 在项目启动类 上添加 @EnableEurekaClient 注解
  • 项目启动类添加 @EnableEurekaClient 注解 启动 Eureka Client功能
4. 改造 “服务消费者”
  • 这里搭建Eureka高可用集群 只有一个服务消费者。修改项目 : eureka-consumer 中的全局配置文件application.yml修改后的代码内容如下所示 :

    application.yml :

    server:
      port: 7002 #指定 "服务消费者"的端口号: 7002
    
    spring:
      application:
        name: demo-consumer #端口号名称配置 / 指定"服务消费者"的名称
    eureka:
      client:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          service-url:
            defaultZone:
              http://server1:7000/eureka/,http://server2:7009/eureka/  #在两个"服务注册中心"中都进行"注册"
      instance:
        hostname: localhost #主机地址
        lease-renewal-interval-in-seconds: 5  #修改周期性心跳的默认时间为5s (默认为每30s发送一次)
        lease-expiration-duration-in-seconds: 10 #修改剔除服务的默认时间修改为10s (默认剔除时间为90s),每隔10s刷新服务列表,将无效服务剔除
    
5. 启用Eureka 高可用集群
  • 依次启动 “两个” Eureka Server( 服务注册中心 )"两个" 服务提供者"一个"服务消费者启动成功后无论访问哪个 Eureka ServerEureka Server注册实例 都是 一样 的。

  • 分别访问http://server1:7000/http://server2:7009/具体效果下图所示 :

    在这里插入图片描述


    在这里插入图片描述

四、Eureka 的 “常用配置”

4.1 心跳机制
  • Eureka通过心跳的方式实现对各个 "服务实例"健康检测。在Eureka服务续约剔除机制下
    客户端健康状态
    注册注册中心开始都会处于 UP状态除非心跳中止一段时间后
    服务注册中心将其剔除
    心跳机制可以有效检查客户端进程是否正常运作。下面将对 Eureka 心跳机制常用配置 进行讲述。

  • 服务启动后Eureka Client ( 服务实例 )将会 Eureka Server ( 服务注册中心 ) 发送 周期性心跳默认是每 30 秒 发送一次,可通过修改Eureka Client 实例全局配置文件中 的 eureka.instance.leaseRenwalIntervalInSeconds( lease-renewal-interval-in-seconds )属性 来改变发送周期性心跳默认时间具体代码如下所示 :

    eureka:
      instance:
        lease-renewal-interval-in-seconds: 5  #修改周期性心跳的默认时间为5s (默认为每30s发送一次)
    
  • Eureka Server 如果一定期限内没有接收到Eureka Client 实例的心跳,就会 将该实例从注册中心 “剔除掉”其他客户端无法访问这个实例。这个期限默认值为 : 90秒,可通过 eureka.instance.leaseExpriationDurationInSeconds ( lease-expiration-duration-in-seconds ) 属性改变这个值具体代码如下所示 :

    eureka:
      instance:
        lease-expiration-duration-in-seconds: 10 #修改剔除服务的默认时间修改为10s (默认剔除时间为90s),每隔10s刷新服务列表,将无效服务剔除
    
4.2 “自我保护机制”
  • Eureka自我保护机制 是为了 防止出现 “误杀” 服务情况Eureka 注册中心服务中心 都有 发生故障的可能
    如果 Eureka Server 服务注册中心 发生故障Eureka Client 服务 就有 可能不能正常续约,而这个时候 , 服务正常的 , 但是 注册中心将超过 90秒未续约服务剔除 造成 “误杀”服务 的情况。

  • Eureka Server 通过 判断 “是否” 存在大量 “续约失败”服务,从而 确定 "是否开启"自我保护默认情况下Eureka Server配置的自我保护阀值0.85。如果Eureka Server 运行期间根据 心跳比例 接收到服务续约 低于阀值Eureka Server开启自我保护不再剔除注册列表信息

  • 但是如果Eureka Server 保护期间 发生了 服务下线情况,这时 Eureka Server 维护服务清单不那么准确了。此时可以关闭保护机制确保服务中心 不可用的服务实例被及时 剔除

  • 默认情况下Eureka Server 自我保护开启的,如果需要关闭,就可以在 全局配置文件添加下列代码 :

    eureka:
      server:
        enable-self-preservation: false #关系Eureka Server "自我保护机制"
    
4.3 其他配置 :
  • 多数情况下Eureka Server 作为 现成产品不需要 “修改其配置信息” 。而 Eureka Client 作为 微服务架构中的应用不仅需要向 Eureka Server 注册还会作为服务实例 “互相调用”。下面将针对 Eureka Clent 以下两方面配置进行讲解具体如下 :
“服务注册” 相关的 “配置信息”
  • 关于 服务注册相关配置信息 都是以 eureka.client 作为前缀Eureka Client服务注册相关的配置信息 如下表所示

    参数名称 参数说明
    enable 启动 Eureka客户端默认值tue
    registryFetchIntervalSeconds Eureka 服务端获取注册信息间隔时间,单位为默认值30s
    fetchRegistry 是否Eureka 服务端 / Eureka服务注册中心 中 获取注册信息默认值false
    eurekaServerReadTimeoutSeconds 读取 Eureka Server信息超时时间,单位为默认值8s
    InitiallnstanceInfoReolicationInstervalSeconds 初始化实例信息Eureka 服务端间隔时间,单位为 默认值40s
    instanceInfoReolicationInstervalSeconds 更新 实例信息变化Eureka 服务端间隔时间,单位为 默认值30s
“服务实例” 相关的 “配置信息”
  • 关于 服务实例相关配置信息都以 eureka.instance前缀Eureka Client服务实例相关的配置信息 如下表所示

    参数名称 参数说明
    preferlpAddress 是否优先使用IP 地址作为主机名标识默认值false
    leaseRenewalIntervalInSeconds Eureka 客户端服务端 发送心跳时间间隔,单位为 默认值30s
    leaseExpirationDurationInSeconds Eureka 服务端收到最后一次心跳之后等待时间上限 ( 等待多少秒后剔除服务 ),单位为默认值90s如果超出时间后服务端就会将该服务实例从服务清单中剔除,从而禁止服务调用请求 “被发送” 到该实例上
    аpрname 服务名默认取 spring.application.name配置值,如果没有就为 unknown
    hostname 主机名不配置时 将根据 操作系统主机名来获取

网站公告

今日签到

点亮在社区的每一天
去签到