写在开头:网上关于springcloud的教程已经很多了,本系列博文不会去大家如何从头构建一个项目,只是对SpringCloud中的各个知识点做详细的阐述,同时把一些细节提供给大家作参考。
(1)各个微服务提供方与服务发现组件之间使用一定的机制(心跳机制)进行通信,以保证服务的可用性。默认情况下服务提供者每30秒向注册中心发送一次心跳告知服务的可用;如果注册中心超过90秒未收到某服务的心跳,则判定该服务异常,从服务注册表中移除该服务,这是EurekaServer默认开启的“自我保护机制”。但有时90秒未得到心跳并不是服务本身的问题,而是由于外界原因,比如网络原因等,此时该服务不该被移除。我们可以在application.yml或application.properties文件中关闭Eureka的自我保护:eureka.server.enable-self-preservation: false
(2)EurekaServer的高可用:可以创建多个EurekaServer实例,通过相互注册的方式实现高可用;同时在application.yml或application.properties文件中设置
"eureka.client.fetchRegistry = true"
,表示同步各个注册中心中的服务注册信息。
(3)在SpringCloud除了可以使用Eureka服务发现组件,还可以使用Zookeeper、consul等。@EnableDiscoveryClient注解为各种服务发现组件都提供了支持,而使用@EnableEurekaClient仅为Eureka组件提供了支持。所以通常使用前者。
(4)EurekaServer默认允许匿名访问,可能存在安全性问题,所以我们可以为其添加用户认证:
第一步:引入"spring-cloud-starter-security"依赖;
第二步:在application.yml或application.properties文件中设置:
security:
basic:
enabled: true
user:
name: user
password: 123456
第三步:此时再访问注册中心时就需要填写用户认证。同时向带有用户认证的注册中心注册服务时也需要提供认证信息:
http://user:123456@localhost:8761/eureka/
(5)访问注册中心,我们可以在页面中看到注册服务的status栏有"up"的标识。这里代表的是注册中心与微服务之间的通信状态,"UP"表示心跳机制正常,同时还有DOWN、OUT_OF_SERVICE、UNKNOWN等状态。但心跳机制并不能完全反映应用程序的状态,比如微服务内部由于网络等原因连接不到数据源,但此时心跳机制仍然是正常的,所以我们需要通过在服务提供者中的以下设置将服务的健康信息传播到注册中心:
eureka:
client:
healthcheck:
enabled: true
(6)向注册中心注册的客户端本地会保存一份注册中心的服务列表
信息,而且会定时(默认30秒)从注册中心同步最新的信息,可以通过配置项eureka.instance.registry-fetch-interval-seconds
进行配置。
(7)服务注册源码追踪:
InstanceInfoReplicator
实现了runable接口,重写后的run方法中会调用discoveryClient
的registry
方法完成注册:
discoveryClient
实例化过程中会其类中的initScheduledTasks()
,该方法根据当前实例配置是否注入注册中心开启两个定时任务:续约
与同步注册信息
:
执行服务注册逻辑:将客户端信息发送至注册中心