目录
基础知识:
什么是服务治理:
在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
什么是服务注册和发现:
Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心存放服务地址相关信息(接口地址)。
一、Eureka简介
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理。
通过部署多节点 Eureka
实例,避免单点问题,满足高可用架构。同时节点之间的地位是平等,节点通信方式采用点对点方式(peer to peer
),以便满足数据同步问题,这是一种去中心化的分布式架构。在这种架构中,peer
节点之间通过相互注册来提高可用性,每个peer
节点通过serviceUrl
指定其他peer
节点。
比如:
如果某台Eureka
服务器宕机,Eureka
客户端的请求会自动切换到新的Eureka
服务器节点,当宕机的服务器重新恢复后,Eureka
会再次将其纳入到服务器集群管理中。当节点开始接受客户端请求时,所有的操作也会进行节点间复制,将请求复制到其他Eureka
服务器当前所知的节点中。这点和Zookeeper
的master/salve
集中化机构有很大的区别,zookeeper
认为任何时候都要一个master
节点,满足节点之间任务调度和节点路由问题,保证的是CP
原理,是一种集中式中心化分布式架构。
我们从图可以看到Eureka以集群的方式作为注册中心,右下角服务提供者则以集群的方式注册进入注册中心。服务的消费者通过Eureka来获取服务提供者提供的服务。
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
它是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
把自身的服务实例注册到 Eureka Server 中
二、自我保护
背景
首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行。
默认配置下,如果Eureka Server在一定时间内没有接收到某个服务实例的心跳,Eureka Server将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当Eureka Server节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。
也就是说即使某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。
官方介绍:
自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
自我保护机制——好死不如赖活着
如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THANTHRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUSTTO BE SAFE
如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送心跳包,便会直接从服务注册列表中剔除该服务,但是在短时间( 90秒中)内丢失了大量的服务实例心跳,这时候Eurekaserver会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通但是EurekaClient为出现宕机,此时如果换做别的注册中心如果一定时间内没有收到心跳会将剔除该服务,这样就出现了严重失误,因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的)。
综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
关闭自我保护机制
eureka:
...
server:
#关闭自我保护机制,保证不可用服务被及时踢除
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
三、使用和代码
简单使用
新建服务端maven工程,在主启动上标注@EnableEurekaServer,代表他是提供注册服务的。
在其他微服务启动类上标注@EnableEurekaClient,代表这些微服务注册进入Eureka中。
(源码还没学习,学习完再更新)
本人收藏夹中springcloud笔记