Eureka Server
Eureka分為Eureka Server和Eureka Client
Eureka Server是服務注冊中心,提供服務注冊功能;Eureka Client可以從Eureka Server獲取服務注冊表;Eureka Server在向它注冊的Eureka Client發(fā)生故障時,會將其從服務注冊表中剔除
Eureka Server中存放1個服務注冊表,它是1個雙層的ConcurrentHashMap,key為服務的應用名,可以使用spring.application.name進行設置,value為1個Map,第2層Map的key為實例名,可以使用eureka.instance.instance-id進行設置,value是1個Lease對象,用來存放實力的ip,port,主頁url,ping url,應用名,實例名等
在微服務系統(tǒng)中,為了提高系統(tǒng)處理能力,一般會對應用程序進行多實例部署,當大量的請求到來時,會對其進行負載均衡,路由到1個應用的多個實例上去進行處理。在Eureka Server上存儲的服務注冊表也體現(xiàn)了這1點,應用和實例是1對多的關系
Eureka Client
Eureka Client分為服務提供者和服務消費者,服務提供者向外暴露服務,供服務消費者調(diào)用,形成1個涉及到多個服務的調(diào)用鏈
- 向Eureka Server進行注冊, register
- 向Eureka Server進行續(xù)約,告訴Eureka Server自己還活著 renew,默認30s
- 從Eureka Server上獲取服務注冊表的信息,并緩存在本地 fetch,默認30s
- 當Eureka Client下線時,會告訴Eureka Server,讓其將自己從服務注冊表中剔除 cancel,這個是主動下線,而Eureka Server會在Eureka Client發(fā)生故障時,將Eureka Client剔除,時被動下線
- 如果Eureka Client是服務消費者,它需要去訪問服務消費者,這涉及到Ribbon,因為Feign也是基于Ribbon的
SpringCloud對Netflix的EurekaClient進行了封裝,運行時還是走的Netflix的業(yè)務邏輯。Netflix使用Eureka Client接口定義Eureka Client需要完成的注冊、續(xù)約、獲取和下線工作,并使用Discovery Client類進行類實現(xiàn)。SpringCloud中使用EurekaDiscoveryClient來完成啟動時邏輯,EurekaDiscoveryClient持有1個Netflix的Eureka Clinet對象,SpringCloud運行時,還是去調(diào)用Netflix的業(yè)務邏輯
使用@EnableEurekaClient注解來標注SpringBoot主類,啟動時,會去jar包下的META-INF文件夾下找到spring.factories文件,該文件存放著Eureka Client啟動需要注入到Spring容器的依賴Bean。Netflix的DiscoveryClient類對Eureka Client啟動時需要做的事情做了規(guī)定,初始化時,它會創(chuàng)建1個定時任務線程池ScheduledThreadPoolExecutor,每隔一段時間,使用心跳線程向Eureka Server發(fā)送心跳,使用獲取服務線程從Eureka Server拉取服務注冊表,并緩存在本地