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

news2024/12/23 18:40:19

目录:

    • Eureka 的 "工作机制" :
      • 一、Eureka 的 "工作原理" ( 两大组件 ) :
        • 1.1 Eureka Server ( 服务注册中心 )
        • 1.2 Eureka Client ( 服务/服务实例,其存在 "两种角色" : ①服务提供者 ②服务消费者 ) :
          • Eureka Client 的 含义
          • 服务提供者
          • 服务消费者
          • Eureka Server 与 服务提供者、服务消费者之间的关系
      • 二、 第一个 Eureka应用 :
        • 2.1 搭建 "Eureka Server"
          • ① 创建 Eureka Server 项目
          • ② 全局配置文件( .yml文件 )中添加 "Eureka" ( 服务注册中心 ) 的相关配置信息
          • ③ 在项目启动类 上添加 @EnableEurekaServer 注解
          • ④ 启动 项目启动类 的main( )方法
        • 2.2 搭建 "Eureka Client" 作为 "服务提供者"
          • ⑤ 创建 Eureka Client 项目 ( 作为 "服务提供者" )
          • ⑥ 全局配置文件( .yml文件 )中添加 "Eureka" ( 服务提供者 )的相关配置信息
          • ⑦ 在项目启动类 上添加 @EnableEurekaClient 注解
          • ⑧ 运行 "程序启动类"
        • 2.3 搭建 "Eureka Client" 作为 "服务消费者"
          • ⑨ 创建 Eureka Client 项目 ( 作为 "服务消费者" )
          • ⑩ 全局配置文件( .yml文件 )中添加 "Eureka" ( 服务消费者 ) 的相关配置信息
          • ⑪ 在项目启动类 上添加 @EnableEurekaClient 注解
          • ⑫ 运行 "程序启动类"
          • 小提示
      • 三、搭建 Eureka "高可用集群" :
        • 1. 更改系统 " hosts文件" 配置
          • ① 更改系统 " hosts文件" 配置
        • 2. 改造Eureka Server ( 服务注册中心 )
          • ② 再建一个 Eureka Server项目
          • ③ 修改 eureka-server 项目 ( 第一个"服务注册中心" ) 中的"全局配置文件"
          • ④ 修改 eureka-server-another 项目 ( 第二个"服务注册中心" ) 中的"全局配置文件"
          • ⑤ 在项目启动类 上添加 @EnableEurekaServer 注解
        • 3. 改造 "服务提供者"
          • ⑥ 再创建一个 Eureka Client 项目 ( 作为 "服务提供者" )
          • ⑦ 全局配置文件( .yml文件 )中添加 "Eureka" ( 服务提供者 )的相关配置信息
          • ⑧ 在项目启动类 上添加 @EnableEurekaClient 注解
        • 4. 改造 "服务消费者"
        • 5. 启用Eureka 高可用集群
      • 四、Eureka 的 "常用配置"
        • 4.1 心跳机制
        • 4.2 "自我保护机制"
        • 4.3 其他配置 :
          • "服务注册" 相关的 "配置信息"
          • "服务实例" 相关的 "配置信息"

在这里插入图片描述

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

该文章参考学习教材为:
《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:
        service-url:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          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:
        service-url:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          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:
        service-url:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          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:
        service-url:
          register-with-eureka: true  #表示将自己 "注册" 到"Eureka服务注册中心 / Eureka服务端" (默认值为true,所以该属性可省略不配置)
          fetch-registry: true  #表示 "从" EurekaSever 中获取 "注册信息" (默认值为true,所以该属性可省略不配置)
          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
    registryFetchIntervalSecondsEureka 服务端获取注册信息间隔时间,单位为默认值30s
    fetchRegistry是否Eureka 服务端 / Eureka服务注册中心 中 获取注册信息默认值false
    eurekaServerReadTimeoutSeconds读取 Eureka Server信息超时时间,单位为默认值8s
    InitiallnstanceInfoReolicationInstervalSeconds初始化实例信息Eureka 服务端间隔时间,单位为 默认值40s
    instanceInfoReolicationInstervalSeconds更新 实例信息变化Eureka 服务端间隔时间,单位为 默认值30s
“服务实例” 相关的 “配置信息”
  • 关于 服务实例相关配置信息都以 eureka.instance前缀Eureka Client服务实例相关的配置信息 如下表所示

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1697357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串

【LeetCode刷题】Day 7 题目1&#xff1a;209.长度最小的子数组思路分析&#xff1a;思路1&#xff1a;暴力枚举 O(N^2^)思路2&#xff1a;滑动窗口 O(N) 题目2&#xff1a;3. 无重复字符的最长子串题目分析&#xff1a;思想1&#xff1a;暴力枚举哈希表O(N^2^)思想2&#xff1…

时间(空间)复杂度(结构篇)

目录 前言&#xff1a; 一、时间复杂度 1.1 时间复杂度的定义 1.2 时间复杂度的分析 表示方法&#xff1a; 1.3 常见的时间复杂度 1.4 时间复杂度的计算以及简单的分析 冒泡排序 折半查找&#xff08;二分查找&#xff09; 斐波那契数列&#xff08;递归&#xff09…

Android卡顿丢帧低内存与adb shell内存状态

Android卡顿丢帧低内存与adb shell内存状态 卡顿丢帧除了CPU/GPU层面&#xff0c;另外&#xff0c;也需要特别注意整机低内存情况。kswapd0 是一个内核工作线程&#xff0c;内存不足时会被唤醒&#xff0c;做内存回收工作。 当内存频繁在低水位的时候&#xff0c;kswapd0 会被频…

人类最友好语言? YAML 深入解析:从语法到最佳实践

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法&#xff0c;以易于阅读和编写的方式表示数据结构。 YAML广泛应用于配置文…

C语言题目-添加逗号(详解)

前言 今天来看看如何使用C语言对一串数字添加逗号吧&#xff0c;在我们电子账户上的余额都是每3位数有一个逗号吧&#xff0c;今天让我们来使用C语言实现这个功能。 题目描述 对于一个较大的整数 N(1<N<2,000,000,000) 比如 980364535&#xff0c;我们常常需要一位一位数…

8、Qt—Log4Qt使用小记2(每日产生文件)

前言&#xff1a; 开发平台&#xff1a;Win10 64位 开发环境&#xff1a;Qt Creator 13.0.0 构建环境&#xff1a;Qt 5.15.2 MSVC2019 64位 例如&#xff1a;上一篇文章中笔者记录了Log4qt的编译及配置使用&#xff0c;这篇文章重点写下每天产生文件到指定文件夹中&#xff0c;…

软考高级架构师:数据库案例篇 - ER 图和数据流图

一、讲解 从数据流图&#xff08;DFD&#xff09;转换为实体关系图&#xff08;ER图&#xff09;是一个重要的步骤&#xff0c;可以帮助将系统的动态流程转换为静态的数据模型。以下是一些经验和步骤&#xff0c;帮助你完成这一过程&#xff1a; 1. 理解数据流图 识别进程&a…

【操作系统】基本概念 解析+思维导图(特征、概念、功能)并发 共享 虚拟 异步

1.操作系统基本概念 思维导图 1.1 概念和功能 概念 操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 1.操作系统是系统资源的管理者&#xff1a; ​ 操作系统是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理组织调度计算机的工作和资源分…

跟TED演讲学英文:How to escape education‘s death valley by Sir Ken Robinson

How to escape education’s death valley Link: https://www.ted.com/talks/sir_ken_robinson_how_to_escape_education_s_death_valley Speaker: Sir Ken Robinson Date: April 2013 文章目录 How to escape educations death valleyIntroductionVocabularySummaryTranscri…

redis6.2.7安装

1、下载上传到服务器 从官下载redis&#xff0c;地址 https://redis.io/download/#redis-downloads 然后上传到服务器目录 app/apps目录下 2、安装gcc编译器 使用gcc --version命令测试是否已经安装了gcc编译环境&#xff0c;如果没有安装执行以下命令安装 yum install -y …

2024系统架构师软考考题考点回忆版

2024系统架构师软考试题/考点梳理 选择题 (75道单选题) 软件测试(P205) 静态测试:是被测程序不运行,只依靠分析和检查源程序的语句、结构、过程来检查程序是否有错误。动态测试:运行被测试程序,对得到的结果与预期的结果进行比较分析,同时分析运行效率和健壮性能等。…

人力资源新趋势:RPO项目为何成为企业招聘首选?

随着市场竞争的加剧和人才需求的日益复杂化&#xff0c;企业对于高效、精准的招聘需求越来越迫切。在这样的背景下&#xff0c;人力RPO(招聘流程外包)项目应运而生&#xff0c;其独特的优势为企业带来了全新的招聘体验和效果。 首先&#xff0c;人力RPO项目能够显著降低企业的招…

python-情报加密副本

【问题描述】某情报机构采用公用电话传递数据&#xff0c;数据是5位的整数&#xff0c;在传递过程中是加密的。加密规则如下&#xff1a;每位数字都加上8,然后用和除以7的余数代替该数字&#xff0c;再将第1位和第5位交换&#xff0c;第2位和第4位交换。请编写程序&#xff0c;…

MySQL数据处理增删改

数据处理增删改DML 由于约束&#xff0c;以下操作都有可能执行失败&#xff08;后面讲约束&#xff09; 插入数据 INSERT 基础添加&#xff1a;VALUES 值的顺序必须和表中字段顺序相同 INSERT INTO class VALUES(1,王小,10); 向指定字段添加&#xff1a; 值的顺序和指定…

【QGIS入门实战精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山体阴影、耐用指数)

文章目录 一、加载dem二、山体阴影三、坡度四、坡向五、地形耐用指数六、地形位置指数七、地表粗糙度一、加载dem 二、山体阴影 方法一:符号系统 利用符号系统中的山体阴影,渲染出阴影效果。 方法二:山体阴影工具 该算法计算输入中的数字化地形模型的山体阴影。根据太阳的位…

C++第十九弹---string模拟实现(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、修改操作 2、迭代器操作 3、字符串操作 4、非成员函数重载操作 总结 1、修改操作 1、string& operator (const char* s); //尾部插入…

科林Linux6_网络

#include<sys/socket.h> #include<arpa/inet.h> //大小端转换 #include<netdb.h> //DNS一、Socket套接字 为了开发网络应用&#xff0c;系统提供一套API函数接口&#xff0c;用于网络应用开发&#xff0c;这些接口称为套接字函数 struct sockaddr_in…

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

【脚本篇】---spyglass lint脚本

目录结构 sg_lint.tcl &#xff08;顶层&#xff09; #1.source env #date set WORK_HOME . set REPORT_PATH ${WORK_HOME}/reports puts [clock format [clock second] -format "%Y-%m-%d %H:%M:%S"] #2.generate source filelist #3.set top module puts "##…

BFS 解决最短路问题

目录 一、前言 1.1 如何使用 BFS 找到最短路&#xff1a; 1.2 为什么不用 dfs &#xff1a; 二、模板套路 三、例题练习 3.1 例题1&#xff1a;迷宫中离入口最近的出口 3.2 例题2&#xff1a;最小基因变化 3.3 例题3&#xff1a;单词接龙 3.4 例题4&#xff1a;为高尔…