05-SpringCloud 之 Eureka

什么是 Eureka

Eureka 即:服务发现框架,提供服务注册与发现功能,分为 Eureka Server 和 Eureka Client

  • Eureka Server:作为服务端,提供服务注册与订阅功能
  • Eureka Client:作为客户端,Provider 可以到 Eureka Server 中注册自己提供的服务,Consumer 可以从 Eureka Server 中订阅自己所需要的服务

Eureka Server 配置

  1. 新建 Module:spring-cloud-eureka-server-7001

  2. 编写 pom 引入依赖

    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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>spring-cloud-netflix</artifactId>
            <groupId>com.kaishen</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>spring-cloud-eureka-server-7001</artifactId>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <!-- 引入该模块所需依赖 -->
        <dependencies>
            <!-- Eureka Server -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
            </dependency>
        </dependencies>
    </project>
    
  3. 编写 application.yml

    application.yml
    server:
      port: 7001
    
    # Eureka 配置
    eureka:
      instance:
        hostname: eureka7001.com # 服务实例名
      client:
        register-with-eureka: false # 是否向注册中心注册
        fetch-registry: false # 自己就是注册中心
        service-url:
          defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ # 此为集群配置,用逗号分隔,可只配一个,作为当个注册中心使用
    
  4. 编写启动类,开启注解

    EurekaServerApplication7001
    package com.kaishen;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    /**
     * Eureka 服务启动类
     * @author : toby
     * Create in 17:46 2022/5/8
     */
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication7001 {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication7001.class, args);
        }
    }
    

Eureka Server 集群配置

  1. 主机设置,可以在 C:\Windows\System32\drivers\etc\hosts 中模拟不同主机,实现伪集群

    Eureka Server

  2. 同 Eureka Server 配置,创建 spring-cloud-eureka-server-7002/spring-cloud-eureka-server-7003

  3. 修改各自的 application.yml,将 eureka.client.service-url.defaultZone 属性配置为集群即可

  4. 启动集群,访问任意节点可以看到以下界面,即集群配置完成

    集群配置

Eureka Client 配置

  1. 新建 Module:spring-cloud-provider-dept-8001

  2. 编写 pom 引入依赖

    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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>spring-cloud-netflix</artifactId>
            <groupId>com.kaishen</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>spring-cloud-provider-dept-8001</artifactId>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <!-- 引入该模块所需依赖 -->
        <dependencies>
            <!-- api -->
            <dependency>
                <groupId>com.kaishen</groupId>
                <artifactId>spring-cloud-api</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
            <!-- junit -->
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- log4j -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
            </dependency>
    
            <!-- logback -->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </dependency>
    
            <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
            <!-- SpringBoot Web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- SpringBoot 监控 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <!-- DataSource -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
            </dependency>
    
            <!-- MySQL -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <!-- MyBatis -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
            </dependency>
    
            <!-- Eureka Client -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
        </dependencies>
    </project>
    
  3. 编写 application.yml

    application.yml
    server:
      port: 8001
    
    # Spring 配置
    spring:
      application:
        name: spring-cloud-provider-dept
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource # 数据源
        driver-class-name: org.gjt.mm.mysql.Driver # 驱动
        url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
        username: root
        password: 123456
    
    # MyBatis 配置
    mybatis:
      mapper-locations: classpath:mybatis/mappings/*.xml
      type-aliases-package: com.kaishen.pojo
    
    # 监控信息配置
    info:
      app.name: kaishen-spring-cloud-dept8001
    
    # Eureka 配置
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
      instance:
        instance-id: spring-cloud-provider-dept8001 # 服务描述信息
        prefer-ip-address: true # 显示 ip 地
    
    
    ####### Consumer 配置如下 #######
    server:
      port: 80
    
    # Eureka 配置
    eureka:
      client:
        register-with-eureka: false # Consumer 无需注册
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    
  4. 编写启动类,开启注解:

    DeptProviderApplication8001
    package com.kaishen;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    
    /**
     * 部门服务启动类
     * @author : toby
     * Create in 18:50 2022/5/8
     */
    @SpringBootApplication
    @EnableEurekaClient
    public class DeptProviderApplication8001 {
    
        public static void main(String[] args) {
            SpringApplication.run(DeptProviderApplication8001.class, args);
        }
    }
    
  5. 启动服务后,可在 Eureka Server 界面看到如下信息,即已完成服务注册

    服务注册

  6. 之后便可继续完善微服务业务功能,新建 dao、mapper、service、controller 等

Eureka 自我保护机制

  • 默认情况下,EurekaServer 在一定时间内 (默认 90s) 没有接收到微服务的心跳,EurekaServer 将会移除该微服务的实例
  • 自我保护机制:如果在 15 分钟内超过 85% 的节点都没有了正常心跳,那么 Eureka 就会认为客户端与注册中心发生了网络故障,EurekaServer 将自动进入自我保护状态,此时会出现以下几种情况
    • EurekaServer 不再从注册列表中移除因长时间没有收到心跳的服务
    • EurekaServer 仍然能够接收新的服务注册与查询请求,但不会被同步到其他节点上 (即:保证当前节点仍然可用)
    • 当网络稳定后,当前实例上新的注册信息会被同步到其他节点
  • 关闭自我保护机制(不推荐):eureka.server.enable-self-preservation = false
posted @ 2022-05-28 09:28  kaishen  阅读(26)  评论(0)    收藏  举报