Spring?Cloud?Eureka基礎(chǔ)應(yīng)用及原理
Eureka簡(jiǎn)介
Eureka這個(gè)詞來(lái)源于古希臘語(yǔ),意為“我找到了!我發(fā)現(xiàn)了!”。據(jù)傳,阿基米德在洗澡時(shí)發(fā)現(xiàn)浮力原理,高興得來(lái)不及穿上衣服,跑到街上大喊:“Eureka! ”。
在Netflix中,Eureka是一個(gè)RESTful風(fēng)格的服務(wù)注冊(cè)與發(fā)現(xiàn)的基礎(chǔ)服務(wù)組件。Eureka由兩部分組成,一個(gè)是Eureka Server,提供服務(wù)注冊(cè)和發(fā)現(xiàn)功能,即我們上面所說(shuō)的服務(wù)器端;另一個(gè)是Eureka Client,它簡(jiǎn)化了客戶端與服務(wù)端之間的交互。Eureka Client會(huì)定時(shí)將自己的信息注冊(cè)到Eureka Server中,并從Server中發(fā)現(xiàn)其他服務(wù)。Eureka Client中內(nèi)置一個(gè)負(fù)載均衡器,用來(lái)進(jìn)行基本的負(fù)載均衡。
下面我們將通過(guò)搭建一個(gè)簡(jiǎn)單的Eureka例子來(lái)了解Eureka的運(yùn)作原理。
搭建Eureka服務(wù)注冊(cè)中心
可以搭建包含Eureka Server依賴的Spring Boot項(xiàng)目。主要依賴如下:

在啟動(dòng)類(lèi)中添加注解@EnableEurekaServer,代碼如下所示:
@SpringBootApplication
//會(huì)為項(xiàng)目自動(dòng)配置必須的配置類(lèi),標(biāo)識(shí)該服務(wù)為注冊(cè)中心
@EnableEurekaServer
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}在application.yml配置文件中添加以下配置,配置注冊(cè)中心的端口和標(biāo)識(shí)自己為Eureka Server:
server:
port: 8761
#eureka配置--4部分
#1.dashboard web控制臺(tái)
#2.server服務(wù)端配置--配置過(guò)期時(shí)間等
#3.client客戶端配置--配置注冊(cè)發(fā)現(xiàn)地址
#4.instance項(xiàng)目實(shí)例
eureka:
#配置服務(wù)可視化默認(rèn)開(kāi)啟
dashboard:
enabled: true
path: /
instance:
hostname: localhost
#這個(gè)是euraka暴漏給提供者和消費(fèi)者服務(wù)發(fā)現(xiàn)注冊(cè)用的
client:
service-url:
#defaultZone: http://localhost:8761/eureka不能寫(xiě)死
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
#是否注冊(cè)到eureka上注冊(cè)中心是不用把自己上床到自己的provider
register-with-eureka: false
#是否需要到eureka上拉去服務(wù)路徑--consumer需要
fetch-registry: falselnstanceld是Eureka服務(wù)的唯一標(biāo)記,主要用于區(qū)分同一服務(wù)集群的不同實(shí)例。一般來(lái)講,一個(gè)Eureka服務(wù)實(shí)例默認(rèn)注冊(cè)的Instanceld是它的主機(jī)名(即一個(gè)主機(jī)只有一個(gè)服務(wù))。但是這樣會(huì)引發(fā)一個(gè)問(wèn)題,一臺(tái)主機(jī)不能啟動(dòng)多個(gè)屬于同一服務(wù)的服務(wù)實(shí)例。為了解決這種情況,spring-cloud-netflix-eureka提供了一個(gè)合理的實(shí)現(xiàn),如上面代碼中的Instanceld設(shè)置樣式。通過(guò)設(shè)置random.value可以使得每一個(gè)服務(wù)實(shí)例的lnstanceld獨(dú)一無(wú)二,從而可以唯一標(biāo)記它自身。
Eureka Server既可以獨(dú)立部署,也可以集群部署。在集群部署的信況下,EurekaServeri間會(huì)進(jìn)行注冊(cè)表信息同步的換作,這時(shí)被同步注冊(cè)表信息的Eureka Server將會(huì)被其他同步注冊(cè)表信息的Eureka Server稱為peer。
請(qǐng)注意,上述配置中的service-url指向的注冊(cè)中心為實(shí)例本身。通常來(lái)講,一個(gè)Eureka Server也是一個(gè)Eureka Client,它會(huì)嘗試注冊(cè)自己,所以需要至少一個(gè)注冊(cè)中心的URL來(lái)定位對(duì)等點(diǎn)peer。如果不提供這樣一個(gè)注冊(cè)端點(diǎn),注冊(cè)中心也能工作,但是會(huì)在日志中打印無(wú)法向peer注冊(cè)自己的信息。在獨(dú)立(Standalone) Eureka Server的模式下,Eureka Server一般會(huì)關(guān)閉作為客戶端注冊(cè)自己的行為。
Eureka Server與Eureka Client之間的聯(lián)系主要通過(guò)心跳的方式實(shí)現(xiàn)。心跳(Heartbeat)即Eureka Client定時(shí)向Eureka Server匯報(bào)本服務(wù)實(shí)例當(dāng)前的狀態(tài),維護(hù)本服務(wù)實(shí)例在注冊(cè)表中租約的有效性。
Eureka Server需要隨時(shí)維持最新的服務(wù)實(shí)例信息,所以在注冊(cè)表中的每個(gè)服務(wù)實(shí)例都需要定期發(fā)送心跳到Server中以使自己的注冊(cè)保持最新的狀態(tài).(數(shù)據(jù)一般直接保存在內(nèi)存中)。為了避免Eureka Client在每次服務(wù)間調(diào)用都向注冊(cè)中心請(qǐng)求依賴服務(wù)實(shí)例的信息,Eureka Client將定時(shí)從Eureka Server中拉取注冊(cè)表中的信息,并將這些信息緩存到本地,用于服務(wù)發(fā)現(xiàn)。
啟動(dòng)Eureka Server后,應(yīng)用會(huì)有一個(gè)主頁(yè)面用來(lái)展示當(dāng)前注冊(cè)表中的服務(wù)實(shí)例信息并同時(shí)暴露一些基于HTTP協(xié)議的端點(diǎn)在/eureka路徑下,這些端點(diǎn)將由EurekaClient用于注冊(cè)自身、獲取注冊(cè)表信息以及發(fā)送心跳等。
搭建Eureka服務(wù)提供者
可以搭建包含Eurake Client依賴的Spring Boot項(xiàng)目。主要依賴有:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.7</version>
</dependency>啟動(dòng)類(lèi)如下:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}在Spring Cloud的Finchley版本中,只要引入spring-cloud-starter-netflix-eureka-client的依賴,應(yīng)用就會(huì)自動(dòng)注冊(cè)到Eureka Server,但是需要在配置文件中添加Eureka Server的地址。在application.yml添加以下配置:
# Eureka配置
eureka:
instance:
hostname: client
instance-id: ${spring.application.name} :$ lvcap.application.instance_id:$ lspring.application.instance_id:$trandom value}}}
client:
service-url:
defaultZone: http://localhost:8761/eureka/
server :
port : 8760
spring:
application:
rame: eureka-client為服務(wù)提供者添加一個(gè)提供服務(wù)的接口,代碼如下:
@RestContro11er
public class SayHe11oContro11er {
@RequestMapping(value = "/he11o/{name}")
public String sayHe11o(@PathVarivab1e("name") String name){
return "He11o,".concat(name).concat("! ");
}
}上述接口將會(huì)向請(qǐng)求者返回打招呼的響應(yīng)信息。
搭建Eureka服務(wù)調(diào)用者
可以搭建包含Eurake Client依賴的Spring Boot項(xiàng)目。主要依賴有:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.7</version>
</dependency>啟動(dòng)類(lèi)代碼如下:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}在application.yml添加eureka-client相關(guān)配置,代碼如下所示:
# Eureka配置
eureka:
instance:
hostname: client
instance-id: ${spring.application.name} :$ lvcap.application.instance_id:$ lspring.application.instance_id:$trandom value}}}
client:
service-url:
defaultZone: http://localhost:8761/eureka/
server :
port : 8765
spring:
application:
rame: eureka-client添加一個(gè)AskController向eureka-client-service請(qǐng)求sayHello的服務(wù)。通過(guò)使用可以進(jìn)行負(fù)載均衡的RestTemplate向eureka-client-service發(fā)起打招呼的請(qǐng)求,并直接返回對(duì)應(yīng)的響應(yīng)結(jié)果。具體代碼如下所示:
@RestController
@Configuration
public class DemoController {
//注入本地服務(wù)名
@value("${spring.application. name}")
private string name;
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/ask")
public string ask(){
//從eureka-client-service服務(wù)提供者中請(qǐng)求sayHello服務(wù)
string askHelloFromService = restTemplate.getForEntity("http ://EUREKA-CLIENT-SERVICE/hello/{name}", String.class,name).getBody();
return askHelloFromService;
}
//注入一個(gè)可以進(jìn)行負(fù)載均衡的RestTemple用于服務(wù)間調(diào)用@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}Eureka服務(wù)注冊(cè)和發(fā)現(xiàn)
搭建好上述三個(gè)Eureka應(yīng)用后,依次啟動(dòng)三個(gè)應(yīng)用。
1.Eureka Server主頁(yè)
訪問(wèn)Eureka Server的主頁(yè)http://localhost:8761,可以看到下圖所示的界面。
從圖中可以看到以下信息:
-展示當(dāng)前注冊(cè)到Eureka server上的服務(wù)實(shí)例信息。
-展示Eureka Server運(yùn)行環(huán)境的通用信息。
-展示Eureka Server實(shí)例的信息。

2.服務(wù)間調(diào)用
訪問(wèn)http:l/localhost:8762/ask,eureka-client將調(diào)用eureka-client-service的sayHello服務(wù),向eureka-client-service傳遞服務(wù)名,等待eureka-client-service返回請(qǐng)求響應(yīng),響應(yīng)結(jié)果如下:
Hello, eureka-client !
RestTemplate將根據(jù)服務(wù)名eureka-client-service通過(guò)預(yù)先從eureka-service緩存到本地的注冊(cè)表中獲取到eureka-client-service服務(wù)的具體地址,從而發(fā)起服務(wù)間調(diào)用。
3.與服務(wù)注冊(cè)中心交換信息
DiscoveryClient來(lái)源于spring-cloud-client-discovery,是Spring Cloud中定義用來(lái)服務(wù)發(fā)現(xiàn)的公共接口,在Spring Cloud的各類(lèi)服務(wù)發(fā)現(xiàn)組件中(如Netflix Eureka或Consul)都有相應(yīng)的實(shí)現(xiàn)。它提供從服務(wù)注冊(cè)中心根據(jù)serviceld獲取到對(duì)應(yīng)服務(wù)實(shí)例信息的能力。當(dāng)一個(gè)服務(wù)實(shí)例擁有DiscoveryClient的具體實(shí)現(xiàn)時(shí),就可以從服務(wù)注冊(cè)中心中發(fā)現(xiàn)其他的服務(wù)實(shí)例。
在Eureka Client中注入DiscoveryClient,并從Eureka Server獲取服務(wù)實(shí)例的信息。在chapter4-eureka-client添加一個(gè)ServicelnstanceRestController的controller ,如下所示:
@RestController
public class ServiceInstanceRestController {
@Autowired
private DiscoveryClient discoveryClient ;
@RequestMapping(" /service-instances/ {applicationName}")
public List<ServiceInstance> serviceInstancesByApplicationName(
@Pathvariable
String applicationName(){
return this.discoveryClient.getInstances(applicationName);
}
}啟動(dòng)應(yīng)用后,訪問(wèn)地址http://localhost:8765/service-instancesleureka-client,獲取應(yīng)用名為eureka-client(服務(wù)本身)的服務(wù)實(shí)例元數(shù)據(jù),結(jié)果如下所示:

Eureka中標(biāo)準(zhǔn)元數(shù)據(jù)有主機(jī)名、IP地址、端口號(hào)、狀態(tài)頁(yè)url和健康檢查url等,這些元數(shù)據(jù)都會(huì)保存在Eureka Server的注冊(cè)表中,Eureka Client根據(jù)服務(wù)名讀取這些元數(shù)據(jù),來(lái)發(fā)現(xiàn)和調(diào)用其他服務(wù)實(shí)例。元數(shù)據(jù)可以自定義以適應(yīng)特定的業(yè)務(wù)場(chǎng)景,這些內(nèi)容將在下一篇文章進(jìn)行講解。

到此這篇關(guān)于Spring Cloud Eureka基礎(chǔ)應(yīng)用的文章就介紹到這了,更多相關(guān)Spring Cloud Eureka應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)調(diào)用自定義的應(yīng)用程序((最新推薦)
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)調(diào)用自定義的應(yīng)用程序的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06
Mybatis基礎(chǔ)概念與高級(jí)應(yīng)用小結(jié)
這篇文章主要介紹了Mybatis基礎(chǔ)回顧與高級(jí)應(yīng)用,本文內(nèi)容有點(diǎn)小長(zhǎng),希望大家耐心閱讀,此文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
vue+springboot項(xiàng)目上傳部署tomcat的方法實(shí)現(xiàn)
本文主要介紹了vue+springboot項(xiàng)目上傳部署tomcat的方法實(shí)現(xiàn),包括環(huán)境準(zhǔn)備、配置調(diào)整以及部署步驟,文中通過(guò)圖文及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
springSecurity實(shí)現(xiàn)簡(jiǎn)單的登錄功能
這篇文章主要為大家詳細(xì)介紹了springSecurity實(shí)現(xiàn)簡(jiǎn)單的登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
使用@ConfigurationProperties實(shí)現(xiàn)類(lèi)型安全的配置過(guò)程
這篇文章主要介紹了使用@ConfigurationProperties實(shí)現(xiàn)類(lèi)型安全的配置過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Spring Boot項(xiàng)目中定制攔截器的方法詳解
這篇文章主要介紹了Spring Boot項(xiàng)目中定制攔截器的方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10

