<<<<<<< HEAD
Spring Cloud 入门
简介
本章从如下几个点概述微服务的基础知识和思路: * 注册中心 * 服务注册 * 服务发现 * 服务同步 * 服务续约 * 服务获取 * 服务下线 * 服务剔除 * 自我保护 * 服务降级
- 在开始介绍之前先提几个问题,带着问题一步步深入了解注册中心
先统一下名词概念:服务端:注册中心的服务端;客户端:表示服务提供者,向注册中心注册服务的客户端;消费端:向注册中心请求调用服务者
* 注册中心是什么?
* 为什么要有注册中心?
* 注册中心的作用是什么?
* 客户端如何注册服务?
* 消费端如何调用服务?
* 服务端如何接收服务?
* 服务端如何存储服务?
* 多个服务端如何同步数据?
* 服务端的存储是否会满,满了怎么办?
* 服务端挂了一个,其它服务端是否有感知,做何种处理?
* 服务端挂了一个,对客户端有何影响,对消费端有何影响?
* 服务端全挂了,服务还能注册吗?
* 服务端全挂了,消费端调用服务会立刻报错吗?
* 服务端如何更新注册的服务?
* 服务端中存储的服务信息是否有超时机制?
* 服务端如何保证存储的服务信息是最新的?
* 服务端存储的信息结构是什么样的?
* 服务如何下线?
* 服务端可以强制剔除服务吗,如果可以怎么剔除?
* 消费端如何获取服务的真实地址?
注册中心
-
保存服务信息的仓库,提供接收服务信息,并向外提供服务信息的能力;
-
我们决定要使用微服务架构,从单体架构向微服务架构迁移:在对业务进行分析并拆解后,会将各个模块拆分为独立的小服务,模块与模块之间的信息交互以服务调用的形式实现。此时,各个服务要知道对方的服务地址。如果只有几个服务,且每个服务只有1个实例,管理起来相对简单;但当服务比较多,且每个服务都有多个实例,并随着业务量的波动而增加和减少,这时候,靠人工管理这些服务就比较困难。就需要有注册中心来统一对服务进行管理。
-
在Spring Cloud 中Eureka就是注册中心。
服务注册
-
服务启动时将自己的服务地址上报给注册中心。以便于注册中心能将服务进行管理并提供给调用者。
-
服务主动上报自己的服务信息,是以心跳的形式,包括自己的ip信息,端口等信息。
服务发现
- 服务注册到注册中心,注册中心接收到服务上报的心跳信息,并能够正确识别此服务,我们称为服务发现。
服务同步
-
注册中心一般是分布式架构。Eureka Server会有多个,某个Server收到服务提供者上报的注册信息,会遍历自己内存中保存的其它Server,将服务同步到其它Server。
-
同步方式有两种:增量同步,全量同步。
服务续约
- 服务注册后,会定期发送心跳到Eureka Server,以告诉Server自己活着。Euraka Server收到心跳后会更新服务信息,并将服务的最新状态同步到其它Server。
服务获取
-
调用服务的客户端查询注册中心,获取服务信息;
-
在注册中心会有服务存储层和缓存层(二级缓存);
- 存储层:所有服务注册及续约都会更新此层,保存的是各个服务上报的心跳信息;
- 二级缓存:一级和二级都保存对外输出的结构数据(是对存储层进行过处理的);一级与二级的区别:一级只读,二级是可读写;
- 二级缓存有过期失效机制(guava),一级缓存没有失效机制
-
一级缓存的数据是:Eureka Server 定期从二级缓存同步进去的
-
访问服务时先访问一级缓存,一级缓存没有需要的服务,则访问二级缓存,二级缓存没有需要的服务,则访问registry,并加载到二级缓存。
-
客户端访问到服务后,调用服务,获取到的服务在客户端也支持缓存功能,但有缓存超时机制(这样可以支持Eureka Server挂掉也可以超时时间内访问服务)
服务下线
- 关闭服务,并从注册中心将服务信息删除;
- 关闭服务时,需要先发送请求给Eureka Server,告诉Euraka Server此服务需要下线。Eureka Server收到请求会将服务状态设置为下线状态(DOWN),并把下线时间传播到其它的Server。
服务剔除
- 有时,服务不可用(服务刚挂掉还没超时等),需要将服务从注册中心剔除
- 在规定时间内服务没有续约,则会将没有续约的服务剔除。
- Eureka Server 自身的Evict Task剔除服务后,会删除二级缓存;
Eureka 存储设计
存储层
- 服务注册表:registry(com.netflix.eureka.registry.AbstractInstanceRegistry)
- registry由两层ConcurrentHashMap组成
- 第一层:key:注册的eureka客户端中spring.application.name配置的服务名;value:指向第二层ConcurrentHashMap的引用,表示key服务名对应的注册服务实例信息集合
- 第二层:key:注册的服务实例的InstanceId;value:Lease对象 包含了服务详情和服务治理相关的属性
二级缓存
-
第一级缓存 - readOnlyCacheMap - 外部读取 为了供客户端获取注册信息时使用,供对外暴露的getRegistry接口读取,本质上是 ConcurrentHashMap,无过期时间,保存服务信息的对外输出数据结构(Value,区别于registry中的Lease对象),TimerTask定时从二级缓存拉取注册信息;
-
第二级缓存 - readWriteCacheMap - 中间缓存 为了降低注册表registry读写锁竞争,降低读取频率,(Loading
readWriteCacheMap),本质上是 guava 的缓存,包含定时失效机制,保存服务信息的对外输出数据结构(Value);
* 过期机制
* 接收到Eureka Client 发送的 register、renew 和 cancel 请求并更新 registry 注册表之后,使二级缓存失效invalidate(Key... keys);
* Eureka Server 自身的 Evict Task 剔除服务后,删除二级缓存;
* 二级缓存本身设置了 guava 的失效机制,隔一段时间后自己自动失效
* 更新机制
* Eureka Client 获取全量或者增量的数据时,会先从一级缓存中获取;如果一级缓存中不存在,再从二级缓存中获取;如果二级缓存也不存在,这时候先将registry的数据同步到二级缓存中,再从缓存中获取
* 定时更新一级缓存的时候,会读取二级缓存,如果二级缓存没有数据,也会触发load,拉取registry的注册数据
接口层
Spring Cloud 核心子项目
Spring Cloud Netflix
结语
- 【参考文章】
- 【中文文档】
-
【Eureka 官网地址】
Spring Cloud 入门
简介
本章从如下几个点概述微服务的基础知识和思路: * 注册中心 * 服务注册 * 服务发现 * 服务同步 * 服务续约 * 服务获取 * 服务下线 * 服务剔除 * 自我保护 * 服务降级
- 在开始介绍之前先提几个问题,带着问题一步步深入了解注册中心
先统一下名词概念:服务端:注册中心的服务端;客户端:表示服务提供者,向注册中心注册服务的客户端;消费端:向注册中心请求调用服务者
* 注册中心是什么?
* 为什么要有注册中心?
* 注册中心的作用是什么?
* 客户端如何注册服务?
* 消费端如何调用服务?
* 服务端如何接收服务?
* 服务端如何存储服务?
* 多个服务端如何同步数据?
* 服务端的存储是否会满,满了怎么办?
* 服务端挂了一个,其它服务端是否有感知,做何种处理?
* 服务端挂了一个,对客户端有何影响,对消费端有何影响?
* 服务端全挂了,服务还能注册吗?
* 服务端全挂了,消费端调用服务会立刻报错吗?
* 服务端如何更新注册的服务?
* 服务端中存储的服务信息是否有超时机制?
* 服务端如何保证存储的服务信息是最新的?
* 服务端存储的信息结构是什么样的?
* 服务如何下线?
* 服务端可以强制剔除服务吗,如果可以怎么剔除?
* 消费端如何获取服务的真实地址?
注册中心
-
保存服务信息的仓库,提供接收服务信息,并向外提供服务信息的能力;
-
我们决定要使用微服务架构,从单体架构向微服务架构迁移:在对业务进行分析并拆解后,会将各个模块拆分为独立的小服务,模块与模块之间的信息交互以服务调用的形式实现。此时,各个服务要知道对方的服务地址。如果只有几个服务,且每个服务只有1个实例,管理起来相对简单;但当服务比较多,且每个服务都有多个实例,并随着业务量的波动而增加和减少,这时候,靠人工管理这些服务就比较困难。就需要有注册中心来统一对服务进行管理。
-
在Spring Cloud 中Eureka就是注册中心。
服务注册
-
服务启动时将自己的服务地址上报给注册中心。以便于注册中心能将服务进行管理并提供给调用者。
-
服务主动上报自己的服务信息,是以心跳的形式,包括自己的ip信息,端口等信息。
服务发现
- 服务注册到注册中心,注册中心接收到服务上报的心跳信息,并能够正确识别此服务,我们称为服务发现。
服务同步
-
注册中心一般是分布式架构。Eureka Server会有多个,某个Server收到服务提供者上报的注册信息,会遍历自己内存中保存的其它Server,将服务同步到其它Server。
-
同步方式有两种:增量同步,全量同步。
服务续约
- 服务注册后,会定期发送心跳到Eureka Server,以告诉Server自己活着。Euraka Server收到心跳后会更新服务信息,并将服务的最新状态同步到其它Server。
服务获取
-
调用服务的客户端查询注册中心,获取服务信息;
-
在注册中心会有服务存储层和缓存层(二级缓存);
- 存储层:所有服务注册及续约都会更新此层,保存的是各个服务上报的心跳信息;
- 二级缓存:一级和二级都保存对外输出的结构数据(是对存储层进行过处理的);一级与二级的区别:一级只读,二级是可读写;
- 二级缓存有过期失效机制(guava),一级缓存没有失效机制
-
一级缓存的数据是:Eureka Server 定期从二级缓存同步进去的
-
访问服务时先访问一级缓存,一级缓存没有需要的服务,则访问二级缓存,二级缓存没有需要的服务,则访问registry,并加载到二级缓存。
-
客户端访问到服务后,调用服务,获取到的服务在客户端也支持缓存功能,但有缓存超时机制(这样可以支持Eureka Server挂掉也可以超时时间内访问服务)
服务下线
- 关闭服务,并从注册中心将服务信息删除;
- 关闭服务时,需要先发送请求给Eureka Server,告诉Euraka Server此服务需要下线。Eureka Server收到请求会将服务状态设置为下线状态(DOWN),并把下线时间传播到其它的Server。
服务剔除
- 有时,服务不可用(服务刚挂掉还没超时等),需要将服务从注册中心剔除
- 在规定时间内服务没有续约,则会将没有续约的服务剔除。
- Eureka Server 自身的Evict Task剔除服务后,会删除二级缓存;
Eureka 存储设计
存储层
- 服务注册表:registry(com.netflix.eureka.registry.AbstractInstanceRegistry)
- registry由两层ConcurrentHashMap组成
- 第一层:key:注册的eureka客户端中spring.application.name配置的服务名;value:指向第二层ConcurrentHashMap的引用,表示key服务名对应的注册服务实例信息集合
- 第二层:key:注册的服务实例的InstanceId;value:Lease对象 包含了服务详情和服务治理相关的属性
二级缓存
-
第一级缓存 - readOnlyCacheMap - 外部读取 为了供客户端获取注册信息时使用,供对外暴露的getRegistry接口读取,本质上是 ConcurrentHashMap,无过期时间,保存服务信息的对外输出数据结构(Value,区别于registry中的Lease对象),TimerTask定时从二级缓存拉取注册信息;
-
第二级缓存 - readWriteCacheMap - 中间缓存 为了降低注册表registry读写锁竞争,降低读取频率,(Loading
readWriteCacheMap),本质上是 guava 的缓存,包含定时失效机制,保存服务信息的对外输出数据结构(Value);
* 过期机制
* 接收到Eureka Client 发送的 register、renew 和 cancel 请求并更新 registry 注册表之后,使二级缓存失效invalidate(Key... keys);
* Eureka Server 自身的 Evict Task 剔除服务后,删除二级缓存;
* 二级缓存本身设置了 guava 的失效机制,隔一段时间后自己自动失效
* 更新机制
* Eureka Client 获取全量或者增量的数据时,会先从一级缓存中获取;如果一级缓存中不存在,再从二级缓存中获取;如果二级缓存也不存在,这时候先将registry的数据同步到二级缓存中,再从缓存中获取
* 定时更新一级缓存的时候,会读取二级缓存,如果二级缓存没有数据,也会触发load,拉取registry的注册数据
接口层
Spring Cloud 核心子项目
Spring Cloud Netflix
结语
- 【参考文章】
- 【中文文档】
- 【Eureka 官网地址】
a82aeba0dff112e63d0954030aa2b2eb3f0fc117
- 【Eureka 客户端配置】