Java基础之《微服务(3)—注册中心Eureka》

一、为什么需要注册中心

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/

参考资料:
https://blog.csdn.net/chy_18883701161/article/details/120866679
https://blog.csdn.net/u012702547/article/details/105086617
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值