簡介
Netflix Eureka 是一款由 Netflix 開源的基於 REST 服務的注冊中心,用於提供服務發現功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服務套件的一部分,基於 Netflix Eureka 進行了二次封裝,主要負責完成微服務架構中的服務治理功能。
Spring Cloud Eureka 是一個基於 REST 的服務,並提供了基於 Java 的客戶端組件,能夠非常方便的將服務注冊到 Spring Cloud Eureka 中進行統一管理。
部署 Eureka Server
-
創建一個名為 eureka-server 的 Spring Cloud 的項目(略)
-
引入 eureka-server 依賴(maven)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
開啟 EurekaServer
在啟動類上添加@EnableEurekaServer
注解,開啟 EurekaServer 的自動裝配功能。 -
修改服務端口為8761
-
修改 register-with-eureka 配置
添加一個eureka.client.register-with-eureka=false
的配置,作為EurekaServer可以不將自己的實例注冊到 Eureka Server 中,如果是集群部署設置為true(不配置默認值也是true)。 -
修改
fetch-registry
配置
添加一個 eureka.client.fetch-registry=false 的配置,表示不從 Eureka Server 中獲取 Eureka 的注冊表信息,如果是集群部署設置為true(不配置默認值也是true)。 -
添加defaultZone配置
添加一條配置eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
(如果不加這個的話又自定義了端口,可能會報錯Connect to localhost:8761 timed out) -
啟動 Eureka Server,訪問 http://localhost:8761/,如果順利的話可以看到如下成功頁面
至此,一個簡單的Eureka注冊中心就完成了,后面實戰中的 Eureka Client 都會注冊到這個注冊中心。上面的demo只是一個單機部署,接下里我們看看我們要部署多個Eureka節點時怎么做。
Eureka Server 集群部署
集群部署一般有兩種情況,一是偽集群部署,二是真正的集群部署。
集群部署,我們可以在多台物理機上部署,這樣多個實例可以用同一個端口,不會出現偽集群端口沖突的問題,更推薦這種方式,性能更高,穩定性也更好。
偽集群部署一般說的是在同一台物理機器上部署多個節點,這時候端口就必須不一樣,否則啟動的時候會出現端口沖突;
偽集群部署示例:
假設要部署3個節點:master/slave1/slave2
-
在application.yml配置定義三個節點的端口:
port: master: 8761 slave1: 8762 slave2: 8763
-
我們可以分別創建三個配置文件application-master.yml、application-slave1.yml、application-slave2.yml,三個配置文件除了有沖突的地方端口不一樣,其他配置完全一樣
# application-master.yml server: port: ${port.slave1} # 服務端口 # application-master.yml server: port: ${port.slave1} # 服務端口 # application-slave2slave2.yml server: port: ${port.slave2} # 服務端口 # 以下配置三個配置文件都一樣 eureka: client: register-with-eureka: true #不將自己的實例注冊到 Eureka Server fetch-registry: true #不從 Eureka Server 中獲取 Eureka 的注冊表信息 service-url: defaultZone: http://127.0.0.1:${port.master}/eureka/,http://127.0.0.1:${port.slave1}/eureka/,http://127.0.0.1:${port.slave2}/eureka/ instance: hostname: eureka-server server: enable-self-preservation: true # 開啟自我保護機制,默認也是開啟的
-
IDEA 分別以三個不同的profiles啟動
-
訪問 http://localhost:8761/ 或者 http://localhost:8762/ 或者 http://localhost:8761/,出現以下類似頁面則代表成功
觀察上面的頁面,發現 Eureka Server 節點均出現在 unavailable-replicas 下,說明集群搭建還是失敗了,那這個問題怎么解決呢?
-
在
host
添加以下配置127.0.0.1 eureka-server-master 127.0.0.1 eureka-server-slave1 127.0.0.1 eureka-server-slave2
-
修改三個配置文件的
defaultZone
信息eureka: client: service-url: defaultZone: http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/
-
配置
eureka.instance.hostname
信息(尤其是在同一台物理機上配置三個節點時,需要修改為不同的host)eureka: instance: hostname: eureka-server-master eureka: instance: hostname: eureka-server-slave1 **eureka: instance: hostname: eureka-server-slave2
-
重新啟動,訪問http://localhost:8761/ ,其他兩個節點君出現在 available-replicas 選項
注意:如果執行完上面還是出現在,請檢查是否配置了 prefer-ip-address = true,true #以IP地址注冊到服務中心,相互注冊使用IP地址,如果是在一台物理機上,IP都是一個,所以建議設置成false,或者不配置再試試。
部署 Eureka Client
-
創建一個名為eureka-client 的SprintBoot的項目(略)
-
引入eureka-client依賴(maven)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
引入spring-boot-starter-web依賴,如果沒有加上spring-boot-starter-web,服務無法正常啟動
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
開啟 EurekaClient
在啟動類上加入注解@EnableEurekaClient
,用於啟用Eureka發現配置 -
配置端口為8081
server.port = 8081 port.master = 8761 port.slave1 = 8762 port.slave2 = 8763
-
配置注冊中心地址
添加配置eureka.client.serviceUrl.defaultZone=http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/
-
啟動服務,刷新 http://localhost:8761/ 頁面,如果看到了EUREKA-CLIENT應用則表示注冊成功
Eureka自我保護機制
自我保護機制是為了避免因網絡分區故障而導致服務不可用的問題。具體現象為當網絡故障后,所有的服務與 Eureka Server 之間無法進行正常通信,一定時間后,Eureka Server 沒有收到續約的信息,將會移除沒有續約的實例。這個時候正常的服務也會被移除掉,所以需要引入自我保護機制來解決這種問題。
當服務提供者出現網絡故障,無法與 Eureka Server 進行續約,Eureka Server 會將該實例移除,此時服務消費者從 Eureka Server 拉取不到對應的信息,實際上服務提供者處於可用的狀態,問題就是這樣產生的。
開啟自我保護機制
eureka.server.enable-self-preservation=true # 開啟自我保護機制,默認也是開啟的
當服務提供者出現網絡故障,無法與 Eureka Server 進行續約時,雖然 Eureka Server 開啟了自我保護模式,但沒有將該實例移除,服務消費者還是可以正常拉取服務提供者的信息,正常發起調用。
但是自我保護機制也有不好的地方,如果服務提供者真的下線了,由於 Eureka Server 自我保護還處於打開狀態,不會移除任務信息,當服務消費者對服務提供者 B 進行調用時,就會出錯。
自我保護模式有利也有弊,但我們建議在生產環境中還是開啟該功能,默認配置也是開啟的。
完整代碼實例:
總結
- 使用
@EnableEurekaServer
注解實現注冊中心 - 使用
@EnableEurekaClient
注冊到注冊中心 - Eureka Server 集群部署的時候需要保證
register-with-eureka
和fetch-registry
為true,單機部署可以為false - 生產環境建議開啟自我保護機制