Eureka Server
Eureka分為Eureka Server和Eureka Client
Eureka Server是服務(wù)注冊(cè)中心,提供服務(wù)注冊(cè)功能;Eureka Client可以從Eureka Server獲取服務(wù)注冊(cè)表葬凳;Eureka Server在向它注冊(cè)的Eureka Client發(fā)生故障時(shí)绰垂,會(huì)將其從服務(wù)注冊(cè)表中剔除
Eureka Server中存放1個(gè)服務(wù)注冊(cè)表,它是1個(gè)雙層的ConcurrentHashMap火焰,key為服務(wù)的應(yīng)用名劲装,可以使用spring.application.name進(jìn)行設(shè)置,value為1個(gè)Map荐健,第2層Map的key為實(shí)例名酱畅,可以使用eureka.instance.instance-id進(jìn)行設(shè)置,value是1個(gè)Lease對(duì)象江场,用來(lái)存放實(shí)力的ip纺酸,port,主頁(yè)url址否,ping url餐蔬,應(yīng)用名,實(shí)例名等
在微服務(wù)系統(tǒng)中佑附,為了提高系統(tǒng)處理能力樊诺,一般會(huì)對(duì)應(yīng)用程序進(jìn)行多實(shí)例部署,當(dāng)大量的請(qǐng)求到來(lái)時(shí)音同,會(huì)對(duì)其進(jìn)行負(fù)載均衡词爬,路由到1個(gè)應(yīng)用的多個(gè)實(shí)例上去進(jìn)行處理。在Eureka Server上存儲(chǔ)的服務(wù)注冊(cè)表也體現(xiàn)了這1點(diǎn)权均,應(yīng)用和實(shí)例是1對(duì)多的關(guān)系
Eureka Client
Eureka Client分為服務(wù)提供者和服務(wù)消費(fèi)者顿膨,服務(wù)提供者向外暴露服務(wù),供服務(wù)消費(fèi)者調(diào)用叽赊,形成1個(gè)涉及到多個(gè)服務(wù)的調(diào)用鏈
- 向Eureka Server進(jìn)行注冊(cè)恋沃, register
- 向Eureka Server進(jìn)行續(xù)約,告訴Eureka Server自己還活著 renew必指,默認(rèn)30s
- 從Eureka Server上獲取服務(wù)注冊(cè)表的信息囊咏,并緩存在本地 fetch,默認(rèn)30s
- 當(dāng)Eureka Client下線時(shí)塔橡,會(huì)告訴Eureka Server梅割,讓其將自己從服務(wù)注冊(cè)表中剔除 cancel,這個(gè)是主動(dòng)下線葛家,而Eureka Server會(huì)在Eureka Client發(fā)生故障時(shí)炮捧,將Eureka Client剔除,時(shí)被動(dòng)下線
- 如果Eureka Client是服務(wù)消費(fèi)者惦银,它需要去訪問(wèn)服務(wù)消費(fèi)者,這涉及到Ribbon,因?yàn)镕eign也是基于Ribbon的
SpringCloud對(duì)Netflix的EurekaClient進(jìn)行了封裝扯俱,運(yùn)行時(shí)還是走的Netflix的業(yè)務(wù)邏輯书蚪。Netflix使用Eureka Client接口定義Eureka Client需要完成的注冊(cè)、續(xù)約迅栅、獲取和下線工作殊校,并使用Discovery Client類進(jìn)行類實(shí)現(xiàn)。SpringCloud中使用EurekaDiscoveryClient來(lái)完成啟動(dòng)時(shí)邏輯读存,EurekaDiscoveryClient持有1個(gè)Netflix的Eureka Clinet對(duì)象为流,SpringCloud運(yùn)行時(shí),還是去調(diào)用Netflix的業(yè)務(wù)邏輯
使用@EnableEurekaClient注解來(lái)標(biāo)注SpringBoot主類让簿,啟動(dòng)時(shí)敬察,會(huì)去jar包下的META-INF文件夾下找到spring.factories文件,該文件存放著Eureka Client啟動(dòng)需要注入到Spring容器的依賴Bean尔当。Netflix的DiscoveryClient類對(duì)Eureka Client啟動(dòng)時(shí)需要做的事情做了規(guī)定莲祸,初始化時(shí),它會(huì)創(chuàng)建1個(gè)定時(shí)任務(wù)線程池ScheduledThreadPoolExecutor椭迎,每隔一段時(shí)間锐帜,使用心跳線程向Eureka Server發(fā)送心跳,使用獲取服務(wù)線程從Eureka Server拉取服務(wù)注冊(cè)表畜号,并緩存在本地