一、Eureka简介
SPRING-CLOUD注册中心:EUREKA
参考URL: https://zhuanlan.zhihu.com/p/36492112
SpringCloud是基于springBoot的一整套实现微服务的框架.Eureka为springCloud架构中首选推荐的服务治理组件。
Eureka,古希腊词语,英文读音[juə’ri:kə],意思是“我找到了!我发现了!”。
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息为消费者提供服务发现功能。不过,此时不再接受服务注册,因为Eureka Server已经全部挂掉了。这就是AP原则的体现。
Eureka在CAP理论中属于AP,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。
1. 注册中心的好处
- 实现客户端和服务端IP地址的解耦,避免对服务提供者IP硬编码。
- 实现服务端的动态扩容
- 多模块部署下,可监控各个服务运行状况
二、Eureka基本架构
- Register Service:服务注册中心,他是一个Eureka Service,提供服务注册和发现功能
- Provider Service:服务提供者,他是一个Eureka Client,提供服务
- Consumer Service:服务消费者,他是一个Eureka Client,消费服务
其实2、3 是一样的,都是Eureka Client,注册自己到Eureka Server。
三、原理
spring-cloud-eureka是spring-cloud-nettfix微服务套件中的一部分, 它基于nettfix-eureka做了二次封装,主要负责微服务架构中的服务治理功能。
服务治理一般都会有两个功能:服务注册、服务发现。通常会有一个注册中心,每个服务单元向注册中心登记自己信息,比如提供的服务,ip, 端口以及一些附加信息等。注册中心会将新的服务实例发送给其它依赖此服务的实例。
原理解析
eureka提供的EndPoint
-
注册服务 :POST /eureka/apps/appId
服务启动时,向注册中心发起注册请求。申请向注册中心注册,最终由注册中心维护一个服务注册表 -
删除服务 :DELETE /eureka/apps/appId/instanceId
-
更新服务 :PUT /eureka/apps/appId/instanceId
-
服务发现 :GET /eureka/apps/appId
消费者根据服务名称,向注册中心查找对应的IP:PORT列表
………
客户端和注册中心所有的交互都是根据endpoint来的。
Eureka的缓存
-
客户端拉去服务列表时,注册中心会从缓存中拿,并不是每次都去服务注册表中获取。默认30秒
-
客户端会缓存服务列表。默认30秒
-
负载均衡器Ribbon会缓存服务列表
四、搭建 eureka-server
参考URL: https://blog.csdn.net/sinat_38843093/article/details/80222277
Spring Cloud 基于Spring Boot 2.x的服务注册与发现(Eureka)
参考URL: https://blog.csdn.net/yy1098029419/article/details/80405345
- maven引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
- 配置application.yml
server:
port: 8081
context-path: /eureka-server
# eureka server 启动时会创建一个定时任务,每隔一段时间(默认60s)将当前清单中超时(默认90s)没有续约的服务剔除出去
# 自我保护 :
# 在信息面板中可能会出现这样的红色警告 EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
# 该警告就是触发了eureka的自我保护机制,服务注册到eureka server后会维护一个心跳连接.eureka server在运行期间,会统计心跳失败的比例在15分钟内是否低于85%.
# 如果低于,会将当前的实例注册信息保护起来,让这些实例不会过期.可以配置 eureka.server.enable-self-preservation=false 来关闭保护机制
# 关闭保护机制,信息面板中会显示 THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
eureka:
server:
enable-self-preservation: false
instance:
# hostname不配置的话,会根据操作系统的主机名来获取
hostname: localhost
# 注册服务之后,服务提供者会维护一个心跳用来持续告诉eureka server服务正常,以防止eureka server的剔除任务将该服务实例从服务列表中排除出去,该操作称为服务续约
# lease-renewal-interval-in-seconds: 30 定义服务续约任务的调用间隔时间(默认30s,官方不推荐修改)
# lease-expiration-duration-in-seconds: 90 定义服务失效的时间(默认90s,官方不推荐修改)
client:
# 在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为
# 配置register-with-eureka: false 和 fetch-registry: false 来表明自己是一个eureka server
register-with-eureka: false
fetch-registry: false
# 为了性能考虑,eureka server 会维护一份只读的服务清单返回给客户端,同时该缓存清单会每隔30s更新一次(可通过registry-fetch-interval-seconds进行修改)
# registry-fetch-interval-seconds: 30
- 启动类加上 @EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
使用actuator监控,需要关闭权限验证,否则访问某些端点会报401
management.security.enabled=false
五、eureka-client 客户端
- maven引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
- 配置application.yml
server:
port: 8082
context-path: /eureka-client
eureka:
client:
service-url:
# 配置服务注册中心集群时,此处可以配置多个地址(通过逗号隔开)
defaultZone: http://localhost:8081/eureka-server/eureka/
# spring.application.name,这个很重要,在以后的服务与服务之间相互调用一般都是根据这个name
spring:
application:
name: eureka-client
- 在启动类加上 @EnableEurekaClient 注解
六、eureka Server Self Preservation Mode(自我保护模式)
【推荐-作者写的比较全面】Eureka Server之注册实例自我保护机制
链接:https://www.jianshu.com/p/9cf099dd9d55
Eureka 自我保护模式、健康检查机制、Eureka 元数据
参考URL: https://blog.csdn.net/wangmx1993328/article/details/88565342
1、什么是 Eureka Server 自我保护?
当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
如果 Eureka Server 在 15 分钟内有超过 85% 的 Eureka Client 都没有正常的发送心跳过来(单机模式时尤为明显),那么 Eureka Server 就认为注册中心与客户端出现了网络故障,Eureka Server 自动进入自我保护机制。
这也就是为什么平时使用一个 Eureka Server 与一个 Eureka Client 时,即使手动关闭了 Eureka Client,但是 Eureka Server 主页中“Instances currently registered with Eureka”下面 status 栏仍然显示为 UP。
总结:当注册中心,某一时段内收不到大部分服务的心跳。会默认自身出了问题,并不会将这些服务踢出注册表
- 自我保护机制意义
自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定
自我保护的原则是:宁可放过,不可杀错!自我保护模式是一种针对网络异常波动的安全保护措施,能使 Eureka 集群更加的健壮、稳定的运行。
七、Eureka高可用集群
SpringCloud实践(三) 高可用的Eureka注册中心
参考URL: https://blog.csdn.net/csolo/article/details/80540359?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
1. Eureka的高可用性
- 注册中心支持集群,某一节点宕机,其他节点继续对外服务。
- 自我保护策略,
2. 注册中心宕机,服务间能否正常通信?
可以,消费端会缓存服务端的IP:PORT,注册中心宕机,只是不能更新已经缓存的IP集合。所以还是可以通信的。但此时如果客户端宕机,客户端感知不到。由此也可以看出,注册中心只是服务注册和发现的作用,并不会干预服务间的调用。
3. Eureka Server到底要部署几台机器?
Eureka Server设计(转载 石杉的架构笔记)
参考URL: https://www.cnblogs.com/daiwei1981/p/10040272.html
推荐阅读原作者链接,作者分析了Eureka 原理。一句话概括:维护注册表、拉取注册表、更新心跳时间,全部发生在内存里!这是Eureka Server非常核心的一个点。
作者假设你一共部署了2000个服务实例。
每个服务实例内部都有一个Eureka Client组件,它会每隔30秒请求一次Eureka Server,拉取变化的注册表。
此外,每个服务实例上的Eureka Client都会每隔30秒发送一次心跳请求给Eureka Server。
那么大家算算,Eureka Server作为一个微服务注册中心,每秒钟要被请求多少次?一天要被请求多少次?
按标准的算法,每个服务实例每分钟请求2次拉取注册表,每分钟请求2次发送心跳
这样一个服务实例每分钟会请求4次,2000个服务实例每分钟请求8000次
换算到每秒,则是8000 / 60 = 133次左右,我们就大概估算为Eureka Server每秒会被请求150次
那一天的话,就是8000 * 60 * 24 = 1152万,也就是每天千万级访问量。
总结:根据作者描述,2000个服务实例,每天才是千万级访问量。Eureka 可以承受每天千万级的访问量。
个人总结: 感觉生产环境一般使用2台Eureka 做高可用即可。
八、参考
Eureka性能测试
参考URL: http://springcloud.cn/view/31
转载:https://blog.csdn.net/inthat/article/details/105237763