服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。
体系如下:
Spirng Cloud Eureka使用Netflix Eureka来实现服务注册与发现。它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用java编写,所以Eureka主要适用于通过java实现的分布式系统,或是JVM兼容语言构建的系统。Eureka的服务端提供了较为完善的REST API,所以Eureka也支持将非java语言实现的服务纳入到Eureka服务治理体系中来,只需要其他语言平台自己实现Eureka的客户端程序。
Eureka包含两个组件:Eureka Server 和 Eureka Client:
1。Eureka Client是一个Java客户端,用于简化与Eureka Server的交互;
2。Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息;
3。微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒);
4。每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注册表的同步;
5。Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
server:
port: 8081
spring:
application:
name: eureka-service
eureka:
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
serviceUrl:
defaultZone: http://localhost:8081/eureka/
healthcheck:
enabled: true
register-with-eureka表示是否向注册中心注册本服务,fetch-registry表示是否从服务注册中心获取服务列表。defaultZone指服务注册中心地址。微服务名称即为spring.application.name的值。
只需要在springboot工程的启动application类上加一个注解@EnableEurekaServer,启动服务后访问http://localhost:8081/。
以后微服务的注册和发现就用这个eureka服务了。
某时某刻一个微服务不可用了,Eurake 不会立即清理,依旧会对该微服务的信息进行保存,默认情况下,如果 EurakeServer 在一定时间内没有接收到某个服务实例的心跳,EurakeServer 将会注销实例(默认90秒)。但是当网络分区故障发生时,微服务与 EurakeServer 之间无法正常通信,以上行为可能变的非常危险,因为微服务本身是健康的,此时本不应该注销这个服务。Eurake 通过“自我保护”来解决这个问题,当 EurakeServer 节点在短时间内丢失过多客户时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurakeServer 就会保护服务注册表中的信息,不在删除服务注册表中的数据(也就是不会注销任何微服务)。当故障恢复后,该 EurakeServer 节点会自动退出自我保护模式。
Eurake 服务端的 application.yml 修改defaultZone,为defaultZone: http://localhost:8081/eureka/,http://localhost:8001/eureka/或者defaultZone: http://localhost:8001/eureka/。即将本注册中心注册到其他注册中心上,以进行微服务的互相注册和发现。
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
server:
port: 8082
spring:
application:
name: eureka-user
eureka:
client:
register-with-eureka: true #false表示不向注册中心注册自己。
fetch-registry: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
serviceUrl:
defaultZone: http://localhost:8081/eureka/
只需要在springboot工程的启动application类上加一个注解@EnableEurekaClient,启动服务后访问http://localhost:8081/会发现多了一个服务。
由于多个服务注册中心互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发给集群中相连的其他注册中心,从而实现服务注册中心之间的服务同步。通过服务同步,提供者的服务信息就可以通过集群中的任意一个服务注册中心获得。
在注册服务之后,服务提供者会维护一个心跳用来持续高速Eureka Server,“我还在持续提供服务”,否则Eureka Server的剔除任务会将该服务实例从服务列表中排除出去。我们称之为服务续约。
下面是服务续约的两个重要属性:
(1)eureka.instance.lease-expiration-duration-in-seconds
leaseExpirationDurationInSeconds,表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。
默认为90秒
如果该值太大,则很可能将流量转发过去的时候,该instance已经不存活了。
如果该值设置太小了,则instance则很可能因为临时的网络抖动而被摘除掉。
该值至少应该大于leaseRenewalIntervalInSeconds
(2)eureka.instance.lease-renewal-interval-in-seconds
leaseRenewalIntervalInSeconds,表示eureka client发送心跳给server端的频率。如果在leaseExpirationDurationInSeconds后,server端没有收到client的心跳,则将摘除该instance。除此之外,如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也不会接收到流量,默认30秒。