Eureka服務注冊中心
最近在研究Spring Cloud,發現其中的組件實在是太多了,真的是頭大,只能一塊一塊看,像盲人摸象一樣。要想很短時間內掌握Spring Cloud是不可能的,小編就學習一塊就在這里分享一塊,有什么不對的地方,大家一起指正。
一、簡介
服務發現是基於微服務架構中的一個重要原則。Eureka既是服務端也是客戶端。Eureka服務端可以部署成為高可用,每一個服務器都會復制注冊的服務狀態到其他服務器。
二、搭建Eureka Server
搭建項目我們使用Spring Boot。在pom.xml中引入spring-cloud-starter-netflix-eureka-server。如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后在啟動類中加上注解
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServerApplication.class, args);
}
}
服務端有一個管理主頁,如圖:

三、高可用、區域和地區
Eureka server沒有后端的存儲,但是注冊表里的每一個服務實例都發送心跳保持注冊表里的服務是最新的(這些都是在內存中做的)。Eureka client也有一份在內存中的Eureka注冊緩存(每一個請求不必每次都去注冊表里找服務)。默認的,每一個Eureka server也是一個Eureka client,並且需要一個服務的url定位對等體。如果不提供這個服務url,服務仍然可以運行和工作,但是你的日志中會有大量的對等體不能注冊的log。
四、單機模式
客戶端與服務端和心跳使得單獨的Eureka server對故障有容錯性。在單機模式下,你可能更喜歡關閉客戶端行為,因此不會繼續嘗試注冊其對等體。
application.properties的示例如下:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
serviceUrl指向了相同的主機。
五、同伴意識
Eureka可以運行多個實例,來保證高可靠和高可用,讓他們彼此注冊。這是默認的行為,所以你需要做的只是為對方添加一個有效的serviceUrl。例如:
---
spring:
profiles: peer1
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2/eureka/
---
spring:
profiles: peer2
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1/eureka/
上面的例子中,我們可以把一段代碼運行到兩個實例上,可以通過spring.profiles.active來區分不同的配置。你也可以在一個系統中添加多個同伴(peer),只要他們彼此之間至少有一個邊彼此連接,他們之前就能同步注冊中心。如果同伴間放在不同的數據中心,有可能出現腦裂現象。
說實話,多個實例到底怎么彼此連接,小編也沒有看懂,官網上只給出了兩個實例的例子,多實例還要下去實驗。
六、更喜歡ip地址
Eureka 更喜歡ip地址的服務,而不是主機名(hostname)。可以設置eureka.instance.preferIpAddress=true,當應用用Eureka注冊時,它將使用ip地址。
小編只做了一個單機模式的例子,GitHub地址為:https://github.com/bigbugliu/spring-cloud-eureka-server。多實例的配置,大家一起做實驗吧。
