目录
1 Spring Cloud 简介
1 Netflix 简介
2 Spring Cloud 框架结构
3 Spring Cloud 和 Dubbo 的对比
4 Spring Cloud 版本号说明
5 Spring Cloud Netflix Eureka
一、 Eureka 简介
1 Eureka 组件
1.1 Eureka Server
1.2 Eureka Client
1.2.1 Application Service
1.2.2 Application Client
2 Eureka 和 Zookeeper 对比
1 什么是 CAP 定理
2 基于 CAP 定理比对 Eureka 和 Zookeeper
二 搭建 Eureka 注册中心
1 POM 文件
2 配置文件 application.yml
3 启动类
4 访问 Eureka Server WEB 服务管理平台
三 Eureka 服务管理平台介绍
1 Eureka Server 服务管理平台访问预览
四 搭建高可用集群
1 在 Eureka 应用中定义多环境配置
五 集群原理
1 Eureka 集群架构原理图
六 Eureka 优雅停服
1 自我保护模式
2 为什么要自我保护
3 关闭自我保护
1 Spring Cloud 简介
Spring Cloud
是
Spring
旗下的一个顶级项目。
Spring Cloud
是一个服务治理平台,提供了一些服务框架。包含了:服务注册与发现、
配置中心、消息中心 、负载均衡、数据监控等等。
Spring Cloud
是一系列框架的有序集合。它利用
Spring Boot
的开发便利性巧妙地简化
了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路
器、数据监控等,都可以用
Spring Boot
的开发风格做到一键启动和部署。
Spring Cloud
并
没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架
组合起来,通过
Spring Boot
风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开
发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Spring Cloud
是一个微服务框架,相比
RPC/SOA
框架而言,
Spring Cloud
提供的全套
的分布式系统解决方案。
Spring Cloud
对
Netflix
的多个微服务基础框架开源组件进行了封装,同时又实现了和
云端平台以及和
Spring Boot
开发框架的集成。
Spring Cloud
为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,
微代理,控制总线,一次性
token
,全局一致性锁,
leader
选举,分布式
session
,集群状
态管理等操作提供了一种简单的开发方式。
Spring Cloud
为开发者提供了快速构建分布式系统的工具,开发者可以快速的启动服
务或构建应用、同时能够快速和云平台资源进行对接。
1 Netflix 简介
Netflix(Nasdaq NFLX)
成立于
1997
年,是一家在线影片租赁提供商,主要提供
Netflix
超大数量的
DVD
并免费递送,总部位于美国加利福尼亚州洛斯盖图。
Netflix
经过几年的开源实践,推出最新开源改革计划,打造了全新的
Netflix
开源门
户,并且会继续开源更多好项目,增加
Netflix
项目开源透明度。
互联网流媒体播放商
Netflix
在几年前就开始创建自己的开源门户
Netflix Open
Source (
别名
NetflixOSS
,
http://netflix.github.io/)
了,他们并不知道这会如何发展;也不
知道开源贡献者是否会使用,改进或者是忽略;更没想到的是就这样拥有了公司的社区,
开发者会给予反馈,一些中间供应商会把这些开源软件集成到他们的解决方案中。
到了今天,
Netflix
拥有上百个开源软件,从基础设施平台到大数据工具,再到自动
化部署软件。随着时间的发展,
OSS
网站也由于越来越多的组件而变得越来越复杂。现
在,
Netflix
还会继续开源更多的软件。
Netflix
发布在
Github
中的项目库地址:
https://github.com/netflix
2 Spring Cloud 框架结构
3 Spring Cloud 和 Dubbo 的对比
Spring Cloud
和
Dubbo
都是微服务开发框架。不是新的技术就一定是好的技术。
Dubbo
优势在于开发简单,效率高。
Spring Cloud
优势在于功能全面且可靠性高。
对比内容 | Dubbo | Spring Cloud |
出身 | 阿里系 核心框架是服务化治理 | Spring 社区 核心框架是 Netflix 开源微服务架构群体 |
文档 | 集中,健全,中文 | 较多,内容大部分是英本版 |
性能 | Dubbo 的性能大约是 Spring Cloud 的 2~3 倍 |
功能 | 服务注册中 心 | zookeeper | Spring Cloud Netflix Eureka |
服务调用方 式 | RPC | REST API |
| 服务网关 | 无 | Spring Cloud Netflix Zuul |
断路由 | 集群容错 | Spring Cloud Netflix Hystrix |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无, monitor | Spring Cloud Sleuth |
消息总线 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
4 Spring Cloud 版本号说明
Spring Cloud
是一个包含若干子框架的框架集合体,是一个完整的微服务框架体系,
如果使用场景版本号来进行标记,容易混淆主框架版本和子框架版本标记。所以
Spring
Cloud
使用一种全新的版本号来对主框架进行版本标记,而子框架的版本标记大多还是使
用常用版本号标记的。
Spring Cloud
版本格式如: 版本号命名
.stage
版本号命名:
Spring Cloud
主框架版本号是使用英国伦敦地铁站名称来进行标记的,
并根据地铁站名称的首字母的英文自然升序排列来识别版本的递增。如:
Angle
、
Brixton
、
Camden
、
Dalston
、
Edgware
、
Finchley
等。后续版本提升会继续根据首字母升序排列。
stage
:阶段版本号。常用的阶段版本包括:
BUILD-XXX[SNAPSHOT]
、
GA
、
PRE(M1
、
M2
等
)
、
RC
、
SR
。
BUILD-XXX[SNAPSHOT] -
开发版本、一般是开发团队内部使用。
GA -
稳定版,内部开发到一定阶段了,各个模块集成后,经过全面测试发现没有问
题,可对外发行了。这个时候叫
GA(General Availability)
。基本上可以使用了。没有严重
的
BUG
问题,但是有未测出的
BUG
隐患。不推荐商业使用。
PRE -
里程碑版,由于
GA
还不属于公开发行版,里面还有些功能不完善或者
bug
,
于是就有了
milestone
(里程碑版)。
milestone
版主要修复了一些
bug
。一个
GA
后,一般
会有多个里程本版。例如
M1 M2 M3......
。不推荐商业使用。
RC -
候选发布版,从
BUILD
后到
GA
在到
M
基本上系统就算定型了,这个时候系
统就进入
Release Candidate
(候选发布版)。该阶段的软件类似于最终发行前的一个观察
期,该期间只对一些发现的等级高的
bug
进行修复。发布
RC1 RC2
等版本。可以考虑
RC
版本。
SR -
正式发布版,公开正式发布。正式发布版一般也有多个发布,例如
SR1 SR2 SR3
等等,一般是用来修复大
bug
或者优化。最好使用
SR
版本。
学习过程使用的版本是:
Greenwich.SR4
。当前版本中内部使用的
SpringBoot
是
2.2.x.RELEASE
版本。
5 Spring Cloud Netflix Eureka
一、 Eureka 简介
Eureka
是
Netflix
开发的服务发现
框架
,本身是一个基于
REST
的
服务
,主要用于定
位运行在
AWS
域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。
SpringCloud
将它集成在其子项目
spring-cloud-netflix
中,以实现
SpringCloud
的服务发现
功能。
1 Eureka 组件
Eureka
包含两个组件:
Eureka Server
和
Eureka Client
。
1.1 Eureka Server
Eureka Server
提供服务注册服务,各个节点启动后,会在
Eureka Server
中进行注册,
这样
EurekaServer
中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息
可以在界面中直观的看到。
Eureka Server
本身也是一个服务,默认情况下会自动注册到
Eureka
注册中心。
如果搭建单机版的
Eureka Server
注册中心,则需要配置取消
Eureka Server
的自动注
册逻辑。毕竟当前服务注册到当前服务代表的注册中心中是一个说不通的逻辑。
Eureka Server
通过
Register
、
Get
、
Renew
等接口提供服务的注册、发现和心跳检测等
服务。
1.2 Eureka Client
Eureka Client
是一个
java
客户端,用于简化与
Eureka Server
的交互,客户端同时也具
备一个内置的、使用轮询
(round-robin)
负载算法的负载均衡器。在应用启动后,将会向
Eureka Server
发送心跳
,
默认周期为
30
秒,如果
Eureka Server
在多个心跳周期内没有接收
到某个节点的心跳,
Eureka Server
将会从服务注册表中把这个服务节点移除
(
默认
90
秒
)
。
Eureka Client
分 为 两 个 角 色 , 分 别 是 :
Application Service(Service Provider)
和
Application Client(Service Consumer)
1.2.1 Application Service
服务提供方,是注册到
Eureka Server
中的服务。
1.2.2 Application Client
服务消费方,通过
Eureka Server
发现服务,并消费。
注意:在这里,
Application Service
和
Application Client
不是绝对上的定义,因为
Provider
在提供服务的同时,也可以消费其他
Provider
提供的服务;
Consumer
在消费服
务的同时,也可以提供对外服务。
2 Eureka 和 Zookeeper 对比
1 什么是 CAP 定理
CAP
原则又称
CAP
定理,指的是在一个分布式系统中,
Consistency
(数据一致性)、
Availability
(服务可用性)、
Partition tolerance
(分区容错性),三者不可兼得。
CAP
由
Eric Brewer
在
2000
年
PODC
会议上提出。该猜想在提出两年后被证明成立,
成为我们熟知的
CAP
定理
分布式系统 CAP 定理 |
C 数据一致性 (Consistency) /kənˈsɪstənsi/ | 也叫做数据原子性 系统在执行某项操作后仍然处于一致的状态。在分布式系统中,更新操作执行成功后所有的用户都应该读到最新的值, 这样的系统被认为是具有强一致性的。等同于所有节点访问同一份最新的数据副本。 优点: 数据一致,没有数据错误可能。 缺点: 相对效率降低。 |
A 服务可用性 (Availablity) /əveɪləbɪləti/ | 每一个操作总是能够在一定的时间内返回结果,这里需 要注意的是"一定时间内"和"返回结果"。一定时间内指的是, 在可以容忍的范围内返回结果,结果可以是成功或者是失败。 |
P 分区容错性 (Partition-torlerance) /pɑːrˈtɪʃn/ /ˈtɑːlərəns/ | 在网络分区的情况下,被分隔的节点仍能正常对外提供 服务(分布式集群,数据被分布存储在不同的服务器上,无论什么情况,服务器都能正常被访问) |
定律:任何分布式系统只可同时满足二点,没法三兼顾 |
CA,放弃 P | 如果想避免分区容错性问题的发生,一种做法是将所有的数据(与事务相关的)/服务都放在一台机器上。虽然无法100%保证系统不会出错,但不会碰到由分区带来的负面效 果。当然这个选择会严重的影响系统的扩展性。 |
CP,放弃 A | 相对于放弃"分区容错性"来说,其反面就是放弃可用性。一旦遇到分区容错故障,那么受到影响的服务需要等待一定 时间,因此在等待时间内系统无法对外提供服务。 |
AP,放弃 C | 这里所说的放弃一致性,并不是完全放弃数据一致性, 而是放弃数据的强一致性,而保留数据的最终一致性。以网络购物为例,对只剩下一件库存的商品,如果同时接受了两 个订单,那么较晚的订单将被告知商品告罄。 |
2 基于 CAP 定理比对 Eureka 和 Zookeeper
对比项 | Zookeeper | Eureka | 描述 |
CAP | CP | AP | ZooKeeper 分布集群是使用主从模型实现的。在一个时间点上, 只有一个 leader 真正的对外提供服务。其他的follower 都会实时备份leader 中 的 数 据 , 当leader 宕机,则 follower 选举出新的 leader 对外提供服务。 Eureka 分布集群是平等模型(无主模型) 所有的节点都是平等的,客户端访问任意节点都可以提供实时的服务响应。如果某节点发送宕机等故障,接收到的请求会转交给其他的节点。无主模型,每个 节点的数据可能不实时 |
| | | 一致,节点需要通过网络通讯从其他节点获取数据,并实现数据的一致。可能有网络延迟或网络故障或通讯频率问 题。 |
Dubbo 集成 | 已支持 | - | Dubbo 开发的时候不需要考虑注册中心选择。 Spring Cloud 中推荐使用Eureka 作为注册中心,Eureka 是由Spring Cloud 子 项 目spring-cloud-netflix 集成的。是 Spring Cloud 中的一个组件,会有针对性的服务提供和发现组 件。 |
Spring Cloud 集成 | 已支持 | 已支持 |
kv 服务 | 支持 | - | ZK 支持数据存储 eureka 不支持 |
使用接口 (多语言能力) | 提供客户端 | http 多语言 | ZK 的跨语言支持 比较弱 |
watch 支持 | 支持 | 支持 | 什 么 是 Watch 支持?就是客户端监听服务端的变化情况。 zk 通过订阅监听来 实现 eureka 通过轮询的方式来实现 |
集群监控 | _ | metrics | metrics,运维者可以收集并报警这些度量 信息达到监控目的 |
二 搭建 Eureka 注册中心
Eureka Server
既是一个注册中心,同时也是一个服务。那么搭建
Eureka Server
的方式
和以往搭建
Dubbo
注册中心
ZooKeeper
的方式必然不同,那么首先搭建一个单机版的
Eureka Server
注册中心。
1 POM 文件
<
parent
>
<
groupId
>org.springframework.boot</
groupId
>
<
artifactId
>spring-boot-starter-parent</
artifactId
>
<
version
>2.2.2.RELEASE</
version
>
</
parent
>
<
groupId
>com.bjsxt</
groupId
>
<
artifactId
>cloudeureka</
artifactId
>
<
version
>1.0-SNAPSHOT</
version
>
<
dependencyManagement
>
<
dependencies
>
<
dependency
>
<
groupId
>org.springframework.cloud</
groupId
>
<
artifactId
>spring-cloud-dependencies</
artifactId
>
<
version
>Hoxton.SR1</
version
>
<
type
>pom</
type
>
<
scope
>import</
scope
>
</
dependency
>
</
dependencies
>
</
dependencyManagement
>
<
dependencies
>
<
dependency
>
<
groupId
>org.springframework.cloud</
groupId
>
<
artifactId
>spring-cloud-starter-netflix-eureka-server</
artifactId
>
</
dependency
>
</
dependencies
>
2 配置文件 application.yml
Eureka Server
本身也是一个服务,同时又是一个注册中心。在
Spring Cloud
中,启动
的微服务会自动的搜索注册中心并注册服务,那么在单机版
Eureka Server
环境中,当前服
务注册到当前服务中,明显是不合适的。所以搭建
Eureka Server
单机版时,需要提供特殊
的全局配置,避免回路注册逻辑。
同理,
Eureka Server
服务在注册中心中发现服务列表逻辑也是不必要的。毕竟注册中
心是一个中立的服务管理平台,如果是单机版
Eureka Server
环境中,
Eureka Server
服务再
去发现服务列表,明显也是不必要的。也需要通过全局配置,避免回路发现逻辑。
3 启动类
4 访问 Eureka Server WEB 服务管理平台
访问服务管理平台地址为:
http://ip:port/
三 Eureka 服务管理平台介绍
1 Eureka Server 服务管理平台访问预览
2
System Status
系统状态展示
3
DS Replicas
注册中心集群列表
4 Instances currently registered with Eureka
已在注册中心中注册的服务列表
5
General Info
当前注册中心相关信息展示
6
Instance Info
当前注册中心实例信息展示
四 搭建高可用集群
1 在 Eureka 应用中定义多环境配置
1.1 application-eureka1.yml
1.2 application-eureka2.yml
五 集群原理
Eureka Server
注册中心的集群和
Dubbo
的
ZooKeeper
注册中心集群在结构上有很大的
不同。
Eureka Server
注册中心集群中每个节点都是平等的,集群中的所有节点同时对外提供
服务的发现和注册等功能。同时集群中每个
Eureka Server
节点又是一个微服务,也就是说,
每个节点都可以在集群中的其他节点上注册当前服务。又因为每个节点都是注册中心,所
以节点之间又可以相互注册当前节点中已注册的服务,并发现其他节点中已注册的服务。
1 Eureka 集群架构原理图
六 Eureka 优雅停服
1 自我保护模式
般情况下,微服务在
Eureka
上注册后,会每
30
秒发送心跳包,
Eureka
通过心跳
来判断服务时候健康,同时会定期删除超过
90
秒没有发送心跳服务。
有两种情况会导致
Eureka Server
收不到微服务的心跳:一是微服务自身的原因;二
是微服务与
Eureka
之间的网络故障。
通常微服务自身的故障关闭只会导致个别服务出现故障,一般不会出现大面积故障,
而网络故障通常会导致
Eureka Server
在短时间内无法收到大批心跳。考虑到这个区别,
Eureka
设置了一个阀值,当判断离线服务的数量超过阀值时,
Eureka Server
认为很大程
度上出现了网络故障,将不再删除心跳过期的服务。
那么这个阀值是多少呢?
15
分钟之内是否低于
85%
;
Eureka Server
在运行期间,会
统计心跳失败的比例在
15
分钟内是否低于
85%
,这种算法叫做
Eureka Server
的自我保护
模式
2 为什么要自我保护
因为同时保留
"
好数据
"
与
"
坏数据
"
总比丢掉任何数据要更好,当网络故障恢复后,这
个
Eureka
节点会退出
"
自我保护模式
"
。
Eureka
还有客户端缓存功能
(
也就是微服务的缓
存功能
)
。即便
Eureka
集群中所有节点都宕机失效,微服务的
Provider
和
Consumer
都
能依托服务缓存正常通信。微服务的负载均衡策略会自动剔除离线的微服务节点。
3 关闭自我保护