1、什么是注册中心
第一部分:服务的注册
第二部分:服务的发现
2、为什么需要注册中心,它解决了什么问题
(1)管理服务
(2)服务的依赖关系
3、什么是注册中心Eureka
(1)Eureka是基于Restful的微服务,提供服务的注册与发现、负载均衡、故障转移的能力
(2)三种角色
eureka server 注册发现
service provider服务提供方,将自己注册到eureka
service consumer服务消费方,从eureka获取注册服务列表,消费服务
二、一个Eureka入门
见:https://blog.csdn.net/csj50/article/details/104678944
三、高可用集群版的Eureka
见:https://blog.csdn.net/csj50/article/details/124961740
四、eureka架构原理
1、架构图
电脑说明:
(1)register(服务注册):把自己的IP、Port注册给eureka
(2)renew(服务续约):发送心跳,30秒发送一次,告诉eureka自己还活着
(3)eviction(剔除):超过90秒,eureka认为服务死了,从注册表剔除
(4)cancel(服务下线):provider停止关闭,调用eureka,把自己从注册表剔除,目的是防止consumer调用不存在的服务
(5)get registry(获取注册列表)
(6)replicate(复制):eureka集群自己的数据同步和复制
五、基于CAP定理分析eureka与zookeeper的区别
1、分布式系统CAP定理
(1)C:数据一致性(consistency)
也叫做数据原子性
系统在执行过某项操作后,仍然处于一致的状态。在分布式系统中,更新操作执行成功后所有的用户都应该读到最新的值,这样的系统被认为是具有强一致性的。等同于所有节点访问同一份最新的数据副本
(2)A:服务可用性(availability)
每一个操作总是能够在一定的时间内返回结果,这里需要注意的是“一定时间内”和“返回结果”。一定时间指的是,在可以容忍的范围内返回结果,结果可以是成功或者失败
(3)P:分区容错性(partition-tolerance)
在网络分区的情况下,被分隔的节点仍能正常对外服务(分布式集群,数据被分布式存储在不同的服务器上,无论什么情况,服务器都能正常被访问)
2、定律:在分布式系统里面只能同时命中2个
(1)CA,放弃P
如果想避免分区蓉错性问题的发生,一种做法是将所有的数据(与事务相关的)都放在一台机器上。
虽然无法100%保证系统不会出错,但不电脑会碰到由分区带来的负面效果。当然这个选择会严重的影响系统的扩展性。
(2)CP,放弃A
相对于放弃“分区蓉错性”来说,其反面就是放弃可用性。一旦遇到分区容错故障,那么受到影响的服务需要等待一段时间,因此在等待期间系统无法对外提供服务。
(3)AP,放弃C
这里所说的放弃一致性,并不是完全放弃数据一致性,而是放弃数据的强一致性,而保留数据的最终一致性。
以网络购物为例,对只剩下一件库存的商品,如果同时接受到了两份订单,那么较晚的订单将被告知商品告罄。
3、对比zookeeper和eureka
(1)zookeeper
cap:CP
dubbo集成:支持
spring cloud集成:支持
kv存储服务:支持
使用接口(多语言能力):提供客户端
watch支持:支持
集群监控:—
(2)eureka
cap:AP
dubbo集成:—
spring cloud集成:支持
kv存储服务:—
使用接口(多语言能力):http多语言
watch支持:支持
集群监控:metrics
(3)其他
什么是watch支持?就是客户端监听服务端的变化情况。
zookeeper通过订阅监听来实现
eureka通过轮询的方式来实现变化
4、eureka自我保护简介
如果因为网络问题,服务1分钟无法访问,eureka服务节点在短时间内丢失了大量的心跳,会保留死亡的注册信息
等网络恢复后,好数据和坏数据都在
六、什么是自我保护模式?在什条件下eureka会启动自我保护
1、自我保护的条件
一般情况下,电脑微服务在Eureka上注册后,会30秒定期发送心跳,Eureka通过心跳来判断微服务是否健康,同时会定期删除超过90秒没有发送心跳的服务。
2、有2种情况会导致Eureka Server收不到微服务的心跳
(1)是微服务自身原因所致,比如故障或关闭。
(2)是微服务于eureka之间的网络出现故障。
通常(微服务自身的故障关闭)只会导致个别服务出现故障,一般不会出现大面积的故障,而(网络故障)通常会导致Eureka Server在短时间内无法收到大批心跳。
考虑到这个区别,Eureka设定了一个阈值,当判断挂掉的服务的数量超过阈值时,Eureka Server认为很大程度上出现了网络故障,将不再删除心跳过期的服务。
3、那这个阈值是多少呢
15分钟之内是否低于85%。
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,这种算法叫Eureka Server的自我保护模式。
4、为什么要自我保护
(1)因为同时保留“好数据”与“坏数据”总比丢掉任何“好数据”要更好,当网络故障恢复后,这个Eureka节点会退出自我保护模式。
(2)Eureka还有客户端缓存功能(也就是微服务的缓存功能)。即便Eureka集群中所有节点都宕机失效,微服务的provider和consumer都能正常通信。
(3)微服务的负载均衡策略会自动剔除死亡的微服务节点。
5、关闭自我保护配置
#关闭自我保护,设置为false
eureka.server.enable-self-preservation=false
#清理间隔(单位毫秒,默认是60*1000)
eureka.server.eviction-interval-timer-in-ms=60000
七、优雅停服
1、直接kill进程会触发eureka的自我保护
2、使用actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3、在provider模块配置文件中加入(springboot2.1可用)
#启用shutdown
management.endpoint.shutdown.enabled=true
#禁用密码验证
management.endpoint.shutdown.sensitive=false
4、启动服务,http post请求发送shutdown
例如:http://127.0.0.1:8011/actuator/shutdown
返回:
{
"message": "Shutting down, bye..."
}
5、查看日志
2022-05-25 18:39:07.116 INFO 35236 --- [ Thread-7] o.s.c.n.e.s.EurekaServiceRegistry : Unregistering application SERVICE-PROVIDER1 with eureka with status DOWN
2022-05-25 18:39:07.117 WARN 35236 --- [ Thread-7] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1653475147117, current=DOWN, previous=UP]
2022-05-25 18:39:07.117 INFO 35236 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_SERVICE-PROVIDER1/localhost:service-provider1:8011: registering service...
2022-05-25 18:39:07.124 INFO 35236 --- [ Thread-7] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2022-05-25 18:39:07.138 INFO 35236 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_SERVICE-PROVIDER1/localhost:service-provider1:8011 - registration status: 204
2022-05-25 18:39:07.143 INFO 35236 --- [ Thread-7] com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient ...
2022-05-25 18:39:10.146 INFO 35236 --- [ Thread-7] com.netflix.discovery.DiscoveryClient : Unregistering ...
2022-05-25 18:39:10.169 INFO 35236 --- [ Thread-7] com.netflix.discovery.DiscoveryClient : DiscoveryClient_SERVICE-PROVIDER1/localhost:service-provider1:8011 - deregister status: 200
2022-05-25 18:39:10.180 INFO 35236 --- [ Thread-7] com.netflix.discovery.DiscoveryClient : Completed shut down of DiscoveryClient
2022-05-25 18:39:10.594 INFO 35236 --- [ Thread-7] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2022-05-25 18:39:10.596 INFO 35236 --- [ Thread-7] o.a.c.c.C.[Tomcat].[localhost].[/] : Destroying Spring FrameworkServlet 'dispatcherServlet'
八、加强eureka安全认证
1、eureka模块pom文件添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、eureka模块配置文件中加入(springboot2.1可用)
#安全认证
#开启基于http basic的安全认证
spring.security.basic.enabled=true
spring.security.user.name=admin
spring.security.user.password=123456
3、 修改defaultZone
http://admin:123456@${eureka.instance.hostname}:${server.port}/eureka/
4、添加WebSecurityConfig.java,注意包扫描路径
package com.example.mycloud.run;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // 关闭csrf
super.configure(http);
}
}
5、eureka模块编译并启动,访问eureka页面
输入用户名、密码,登录成功
6、provider模块修改defaultZone
http://admin:123456@${eureka.instance.hostname}:${server.port}/eureka/
电脑 电脑