# Eureka学习(一)——注册中心介绍与Eureka介绍
[TOC]
## 服务注册中心介绍
**服务注册中心的本质就是为了解耦服务提供者和服务消费者**
对于任何一个微服务,原则上都应存在或者支持多个提供者,而微服务一般都是支持弹性扩容缩容的特性,一个微服务的提供者数量与分布往往都是动态变化的,也无法预先确定,因此,原本在单体引用阶段常用的静态LB(负载均衡)机制不再使用了,需要引入额外的组件来管理微服务提供者的注册与发现,这个组件就是服务注册中心
### 服务注册中心原理

分布式微服务架构中,服务注册中心用于存储服务提供者地址信息、服务发布相关的属性信息,消费者通过主动查询和被动通知的方式获取服务提供者的地址信息,而不需要通过硬编码的方式得到提供者的地址信息,消费者只需要知道当前系统发布了哪些服务,而不需要知道服务具体存在于什么位置,这就是透明化路由。
**服务注册中心步骤**
1. 服务提供者启动
2. 服务提供者将相关服务信息主动注册到注册中心
3. 服务消费者获取服务注册信息
poll模式:服务消费者主动拉取可用的服务提供者清单
push模式:服务消费者订阅服务(当服务提供者有变化时,注册中心也会主动推送更新后的服务清单给消费者)
4. 服务消费者直接调用服务提供者
注册中心也需要提供服务提供者健康监控的功能,当发现服务提供者失效时需要及时删除。
## 主流注册中心对比
- **Zookeeper**:
Zookeeper是一个分布式的服务框架,是Apache Hadoop的子项目,主要用来解决分布式应用中经常遇到的一些数据管理问题,比如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等
简单的来说Zookeeper本质=存储+监听通知,用Znode进行存储
Zookeeper用来做服务注册中心,主要是因为它具有节点变更通知功能,只要客户端监听相关服务节点,服务节点的所有变更都能及时通知到监听客户端,这样调用方只需要使用Zookeeper的客户端可以实现服务节点的订阅和变更通知功能。
- **Eureka**
由Netflix开源,并被Pivatal集成到SpringCloud体系中,它是基于ResufulApi风格开发的服务注册与发现组件
- **Consul**
Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件,采用Raft算法保证服务的一致性,且支持健康检查
- **Nacos**
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,简单来说Nacos就是注册中心+配置中心的组合,帮助我们解决微服务开发中涉及到的服务注册与发现,服务配置,服务管理等问题,Nacos是Spring cloud Alibaba核心组件之一。
| 组件名 | 语言 | CAP | 对外暴露接口 |
| --------- | ---- | ------------------------------------------ | ------------ |
| Eureka | Java | AP(会使用自我保护机制,最大程度保证可用) | Http |
| Consul | Go | CP | Http/DNS |
| Zookeeper | Java | CP | 客户端 |
| Nacos | Java | 支持AP/CP切换 | Http |
## Eureka介绍
**Eureka基础架构**:


**Eureka交互详情**:

Eureka包含两个组件:Eureka Server 和Eureka Client,Eureka Client是一个Java客户端,用于简化和Eureka Server的交互,Eureka Server提供服务发现的能力,各个微服务启动时,通过Eureka Client向Eureka Server注册自己的信息,Eureka会存储该服务的信息
1. 图中Eureka Server代表了三个不同机房形成的集群
2. Application Service作为服务提供者向Eureka Server中注册服务,Eureka Server接受到注册事件会在集群和分区中尽心数据同步,Application Client作为消费端可以从Eureka Server中获取到服务注册信息,进行服务调用
3. 微服务启动时,会周期性的向Eureka Server发送心跳(默认周期30S)续约自己的信息
4. Eureka Server在一定的时间内(默认90s)没有收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点
5. 每个Eureka Server同时也会本地缓存Eureka Server中的信息,即使所有的Eureka Server节点停止服务,服务消费者依然可以使用缓存中的信息找到服务提供者
6. Eureka通过心跳检测、健康检查和客户端缓存等机制,提高系统的灵活性、可伸缩性和可用性。
### Eureka注册中心介绍

**进入自我保护模式**:

**自我保护模式**:
Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。一旦开启了保护机制,则服务注册中心维护的服务实例就不是那么准确了,此时我们可以使用`eureka.server.enable-self-preservation=false`来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(**不推荐**)。在Eureka注册中心页面可以看到,一旦上一分钟心跳数量<最少心跳阈值时,就会进入自我保护机制,不会剔除失效的实例

**关闭自我保护模式**
```yaml
eureka:
server:
enable-self-preservation: false # 关闭⾃我保护模式(缺省为打开)
```
### Eureka客户端介绍
服务提供者(Eureka客户端)需要向EurekaServer注册上对应的服务,并向Eureka完成服务续约
**服务注册过程**
1. 导入Eureka-client依赖,配置上Eureka服务注册中心地址
配置文件示例:
```yml
#注册到Eureka服务中心
eureka:
client:
service-url:
# 注册到集群,就把多个Eurekaserver地址使用逗号连接起来即可;注册到单实例(非集群模式),那就写一个就ok
defaultZone: http://localhost:8761/eureka
instance:
prefer-ip-address: true #服务实例中显示ip,而不是显示主机名(兼容老的eureka版本)
# 实例名称: 192.168.1.103:lagou-service-resume:8080,我们可以自定义它
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
# 自定义Eureka元数据
metadata-map:
cluster: cl1
region: rn1
```
2. 服务启动后向注册中心发起注册请求、携带服务元数据信息
3. Eureka注册中心会把服务的信息保存在Map集合汇总
#### 服务续约(服务提供者)
服务每隔30秒会向注册中心续约(心跳)一次,如果没有续约,那么90秒之后服务会被剔除,我们称之为服务续约或心跳检测。
配置调整:
```yaml
#向Eureka服务中⼼集群注册服务
eureka:
instance:
# 租约续约间隔时间,默认30秒
lease-renewal-interval-in-seconds: 30
# 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,EurekaServer会将服务从列表移除
lease-expiration-duration-in-seconds: 90
```
#### 消费者定期获取服务方列表
消费者每隔30秒会从注册中心拉取一份服务列表,可以通过下列配置调整
```yaml
#向Eureka服务中⼼集群注册服务
eureka:
client:
# 每隔多久拉取⼀次服务列表
registry-fetch-interval-seconds: 30
```
1. 消费者启动时,从EurekaServer服务列表获取只读备份,并缓存到本地
2. 每隔30秒重新获取并更新数据
3. 时间可以通过eureka.client.registry-fetch-interval-seconds修改
### Eureka服务端介绍
一般一个服务端也是另外一个服务端的消费端
**服务下线**
1. 当服务正常关闭操作时,会发送服务下线的REST请求给EurekaServer
2. 服务中心接收到请求后,将该服务置为下线状态
**失效剔除**
EurekaServer会定时进行检查,如果该实例在规定时间内(默认90s)都没有发出心跳,则会剔除该实例
Eureka学习(一)——注册中心介绍与Eureka介绍