分布式集群的概念
baijiahao.baidu.com/s?id=170191…
[Spring boot——Actuator 详解]
微服务的注册和发现
服务提供者、服务消费者、注册中心
•各个微服务在启动时,将自己的网络地址等信息注册到注册中心中,注册中心会存储这些信息。
•服务消费者可从注册中心查询服务提供者的网络地址,并使用该地址调用服务提供者的接口。
•各个微服务与服务发现组件使用一定机制(例如心跳)通信。注册中心若长时间无法与某微服务实例通信,就会注销该实例。
•微服务网络地址发生变更(例如实例增减或者IP端口发生变化等)时,会重新注册到注册中心。使用这种方式,服务消费者就无须人工修改提供者的网络地址了。
Eureka
eureka概念
Eureka可以分为eureka server 和 eureka client两大主体
eureka server
服务注册 服务提供者启动时,会通过 Eureka Client 向 Eureka Server 注册信息,Eureka Server 会存储该服务的信息,Eureka Server 内部有二层缓存机制来维护整个注册表
提供注册表 服务消费者在调用服务时,如果 Eureka Client 没有缓存注册表的话,会从 Eureka Server 获取最新的注册表
同步状态 Eureka Client 通过注册、心跳机制和 Eureka Server 同步当前客户端的状态。
eureka client 注册中心客户端
Eureka Client 是一个 Java 客户端,用于简化与 Eureka Server 的交互。Eureka Client 会拉取、更新和缓存 Eureka Server 中的信息。因此当所有的 Eureka Server 节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者,但是当服务有更改的时候会出现信息不一致。
Register: 服务注册
服务的提供者,将自身注册到注册中心,服务提供者也是一个 Eureka Client。当 Eureka Client 向 Eureka Server 注册时,它提供自身的元数据,比如 IP 地址、端口,运行状况指示符 URL,主页等。
Renew: 服务续约
Eureka Client 会每隔 30 秒发送一次心跳来续约。 通过续约来告知 Eureka Server 该 Eureka Client 运行正常,没有出现问题。 默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约,Server 端会将实例从其注册表中删除。
Eviction 服务剔除
当 Eureka Client 和 Eureka Server 不再有心跳时,Eureka Server 会将该服务实例从服务注册列表中删除,即服务剔除。
Remote Call: 远程调用
当 Eureka Client 从注册中心获取到服务提供者信息后,就可以通过 Http 请求调用对应的服务;服务提供者有多个时,Eureka Client 客户端会通过 Ribbon 自动进行负载均衡
自我保护机制
Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 即会进入自我保护机制。
Eureka Server 触发自我保护机制后,页面会出现提示:
eureka 进入保护机制后的情况
(1 Eureka 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
(2 Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
(3 当网络稳定时,当前实例新的注册信息会被同步到其它节点中
Eureka 自我保护机制是为了防止误杀服务而提供的一个机制。当个别客户端出现心跳失联时,则认为是客户端的问题,剔除掉客户端;当 Eureka 捕获到大量的心跳失败时,则认为可能是网络问题,进入自我保护机制;当客户端心跳恢复时,Eureka 会自动退出自我保护机制。
如果在保护期内刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,即会调用失败。对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。
Eureka集群架构
enreka 服务中心搭建
依赖引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
编写eureka-server启动类
@SpringBootApplication
@EnableEurekaServer (将启动类项目作为eureka的注册中心)
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
配置
spring:
application:
name: eureka server
server:
port: 8761
eureka:
client:
# 是否注册到Eureka server
register-with-eureka: false
# 是否从Eureka server获取注册信息,同步其他Eureka server节点用到
fetch-registry: false
# 设置与EurekaServer交互的地址,多服务可以用,分隔
service-Url:
defaultZone: http://localhost:8761/eureka
eureka的配置详解
注册到注册中心
依赖引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置更改
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
查看是否已经注册到注册中心
获取应用信息
http://localhost:30003/eureka/apps/APP0 (全量获取所有应用)
http://eureka-host:8761/eureka/apps/APP0 (获取APP0的应用信息)