目录
1. 构建服务中心
- Spring Cloud Eureka 是 Spring Cloud Netflix 微 服 务 套 件 中 的 一 部 分, 它 基 于 Netflix Eureka 做 了 二 次 封 装, 主 要 负 责 完 成 微 服 务 架 构 中 的 服 务 治 理 功 能。
- Spring Cloud 通 过 为 Eureka 增 加 了 Spring Boot 风 格 的 自 动 化 配 置, 我 们 只 需 通 过 简 单 引 入 依 赖 和 注 解 配 置 就 能 让 Spring Boot 构 建 的 微 服 务 应 用 轻 松 地 与 Eureka 服 务 治 理 体 系 进 行 整 合。
– 服 务 注 册: 微服务向服务中心注册服务
– 服 务 发 现: 调用微服务时通过服务中心进行寻址(负载均衡,轮询机制等)
2. 服务注册与服务发现
- Spring Cloud Eureka, 使 用 Netflix Eureka 来 实 现 服 务 注 册 与 发 现, 它 既 包 含 了 服 务 端 组 件, 也 包 含 了 客 户 端 组 件
Eureka 服 务 端, 我 们 也 称 为 服 务 注 册 中 心。 它 同 其 他 服 务 注 册 中 心 一 样, 支 持 高 可 用 配 置
Eureka 客 户 端, 主 要 处 理 服 务 的 注 册 与 发 现。 客 户 端 服 务 通 过 注 解 和 参 数 配 置 的 方 式, 嵌 入 在 客 户 端 应 用 程 序 的 代 码 中, 在 应 用 程 序 运 行 时, Eureka 客 户 端 向 注 册 中 心 注 册 自 身 提 供 的 服 务 并 周 期 性 地 发 送 心 跳 来 更 新 它 的 服 务 租 约。
3. Eureka服务中心搭建
3.1 新建spring boot 项目
-
访问spring官网,进入https://spring.io/projects
-
进入Quick start,网址:https://start.spring.io/,选择Dependencies,加入Eureka Server, 然后点击Generate Project,就会生成一个Spring Boot基础项目。
3.2 pom文件引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<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.RC2</spring-cloud.version>
</properties>
<dependencies>
<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>
3.3 EurekaServerApplication.java代码
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
}
}
3.3 Application.yml配置
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3.4 Eureka信息面板
- 服务中心启动后,访问默认地址http://localhost:8761/
4. Eureka的服务治理机制
4.1服务提供者
-
服务注册:“服 务 提 供 者” 在 启 动 的 时 候 会 通 过 发 送 REST 请 求 的 方 式 将 自 己 注 册 到 Eureka Server 上, 同 时 带 上 了 自 身 服 务 的 一 些 元 数 据 信 息。Eureka Server 接 收 到 这 个 REST 请 求 之 后, 将 元 数 据 信 息 存 储 在 一 个 双 层 结 构 Map 中;
-
服务同步:通 过 服 务 同 步, 两 个 服 务 提 供 者 的 服 务 信 息 就 可 以 通 过 这 两 台 服 务 注 册 中 心 中 的 任 意 一 台 获 取 到;
-
服务续约:在 注 册 完 服 务 之 后, 服 务 提 供 者 会 维 护 一 个 心 跳 用 来 持 续 告 诉 Eureka Server:“ 我 还 活 着”, 以 防 止 Eureka Server 的“ 剔 除 任 务” 将 该 服 务 实 例 从 服 务 列 表 中 排 除 出 去, 我 们 称 该 操 作 为 服 务 续 约( Renew)。
关 于 服 务 续 约 有 两 个 重 要 属 性, 我 们 可 以 关 注 并 根 据 需 要 来 进 行 调 整:
leureka.instance.lease-renewal-interval-in-seconds = 30
leureka.instance.lease-expiration-duration-in-seconds = 90
4.2 服务消费者
-
获取服务:当 我 们 启 动 服 务 消 费 者 的 时 候, 它 会 发 送 一 个 REST 请 求 给 服 务 注 册 中 心, 来 获 取 上 面 注 册 的 服 务 清 单。 为 了 性 能 考 虑, Eureka Server 会 维 护 一 份 只 读 的 服 务 清 单 来 返 回 给 客 户 端, 同 时 该 缓 存 清 单 会 每 隔 30 秒 更 新 一 次。
-
服务调用:服 务 消 费 者 在 获 取 服 务 清 单 后, 通 过 服 务 名 可 以 获 得 具 体 提 供 服 务 的 实 例 名 和 该 实 例 的 元 数 据 信 息。客 户 端 可 以 根 据 自 己 的 需 要 决 定 具 体 调 用 哪 个 实 例, 在 Ribbon 中 会 默 认 采 用 轮 询 的 方 式 进 行 调 用, 从 而 实 现 客 户 端 的 负 载 均 衡。
-
服务下线:所 以 在 客 户 端 程 序 中, 当 服 务 实 例 进 行 正 常 的 关 闭 操 作 时, 它 会 触 发 一 个 服 务 下 线 的 REST 请 求 给 Eureka Server, 告 诉 服 务 注 册 中 心:“ 我 要 下 线 了”。 服 务 端 在 接 收 到 请 求 之 后, 将 该 服 务 状 态 置 为 下 线( DOWN), 并 把 该 下 线 事 件 传 播 出 去。
4.3 服务注册中心
-
失效剔除:Eureka Server 在 启 动 的 时 候 会 创 建 一 个 定 时 任 务, 默 认 每 隔 一 段 时 间( 默 认 为 60 秒) 将 当 前 清 单 中 超 时( 默 认 为 90 秒) 没 有 续 约 的 服 务 剔 除 出 去。
-
自我保护:Eureka Server 在 运 行 期 间, 会 统 计 心 跳 失 败 的 比 例 在 15 分 钟 之 内 是 否 低 于 85%, 如 果 出 现 低 于 的 情 况( 在 单 机 调 试 的 时 候 很 容 易 满 足, 实 际 在 生 产 环 境 上 通 常 是 由 于 网 络 不 稳 定 导 致), Eureka Server 会 将 当 前 的 实 例 注 册 信 息 保 护 起 来, 让 这 些 实 例 不 会 过 期, 尽 可 能 保 护 这 些 注 册 信 息。
注意:在 这 段 保 护 期 间 内 实 例 若 出 现 问 题, 那 么 客 户 端 很 容 易 拿 到 实 际 已 经 不 存 在 的 服 务 实 例, 会 出 现 调 用 失 败 的 情 况, 所 以 客 户 端 必 须 要 有 容 错 机 制, 比 如 可 以 使 用 请 求 重 试、 断 路 器 等 机 制。
5. Eureka的配置
5.1 Eureka 客 户 端 的 配 置
主 要 分 为 以 下 两 个 方 面
- 服 务 注 册 相 关 的 配 置 信 息, 包 括 服 务 注 册 中 心 的 地 址、 服 务 获 取 的 间 隔 时 间、 可 用 区 域 等。
- 服 务 实 例 相 关 的 配 置 信 息, 包 括 服 务 实 例 的 名 称、 IP 地 址、 端 口 号、 健 康 检 查 路 径 等。
5.2 Eureka 服务端配置
- Eureka 服 务 端 更 多 地 类 似 于 一 个 现 成 产 品, 大 多 数 情 况 下, 我 们 不 需 要 修 改 它 的 配 置 信 息。
-