Service Discovery: Eureka
1 | register 动词,注册 |
Eureka Server Standalone
- spring-cloud-starter-eureka-server
- @EnableEurekaServer
1 | eureka server的application.yml配置 |
- 默认服务注册中心也会将自己作为客户端来尝试注册它自己,并且需要(至少一个)服务URL来定位对等方,单机我们需要禁用它的客户端注册行为,不禁用日志中会出现异常提醒。
- eureka server和client会通过心跳机制保持通讯,client每30秒发送一次心跳去续约,如果90秒内server不能收到client的心跳,则会将该client踢出注册表,自我保护模式下不会踢出失效的client
- eureka server没有后端存储,但registry中eureka instance都必须发送检测信号去使其注册保持最新状态(这些在内存中完成),eureka client还拥有一个rigistry的内存缓存,所以不必每次都去请求rigistry。
Eureka Server HA
1 | eureka server的application.yml配置 |
- 你能多个peer到系统中,只要它们互相至少通过一条边连接,它们之间能同步注册表。如果这些peers中物理上隔离的,系统原则上会存在脑裂类型失败。
Eureka Client
- spring-cloud-starter-eureka
- @EnableEurekaClient/@EnableDiscoveryClient
1 | discovery client的application.properties |
- defaultZone,为任何不表示偏好的客户提供服务URL(即,这是一个有用的默认值)。
- client通过RestTemplate来真正发起REST请求
授权访问
- spring-boot-starter-security
1 | eureka server 新增 |
为什么注册一个服务很慢?
- 成为一个instance涉及一个到注册中心的周期性心跳,通过client的serverUrl, 默认间隔30秒,
一个服务不可用于被其他clients发现,直到instance,server,client所有的在本地缓存中有相同的metadata,因此会花费3个心跳,你能改变这个周期,通过设置eureka.instance.leaseRenewalIntervalInSeconds=30,这将会加速client连接到其他服务的进度,
在生产上,使用默认的可能更好,因为在server上有一些计算间隔使关于续约周期的猜想。