微服務Spring Cloud實戰—Eureka Server的簡介和高可用性—叢集
Eureka簡介
什麼是Eureka?
Eureka是Netflix開源的服務發現元件,本身是一個基於REST的服務。它包含Server和Client兩部分。Spring Cloud將它整合在子專案Spring Cloud Netflix中,從而實現服務的註冊與發現
(注:Eureka的GitHub: https://github.com/Netflix/Eureka
Netflix是一家線上影片租借提供商。)
Eureka的作用
Eureka包含兩個元件:Eureka Server和Eureka Client,他們的作用如下:
Eureka Server提供服務發現的能力,各個微服務啟動時,他們會向Eureka Server 註冊自己的資訊(例如IP、埠、微服務名稱等),Eureka Server會儲存這些資訊。 Eureka Client是一個Java客戶端,用於簡化Eureka Server的互動。 微服務啟動後,會週期性(預設30秒)地向Eureka Server傳送心跳 以續約自己的“租期”。 如果Eureka Server在一定時間內沒有接收到某個微服務示例的心跳,Eureka Server將會登出該例項(預設90秒)。 預設情況下,Eureka Server同時也是Eureka Client。多個Eureka Server例項, 互相之間通過複製的方式,來實現服務登錄檔內的資料的同步。 Eureka Client會快取服務登錄檔內的資訊。這種方式有一定的優勢————首先,微服務 每次請求都查詢Eureka Server,從而降低了Eureka Server的壓力;其次,即使Eureka Server所有節點都宕掉,服務消費者依然可以使用快取中的資訊找到服務提供者並完成呼叫。
綜上,Eureka通過心跳檢查、客戶端快取等機制,提高了系統的靈活性、可伸縮性和可用性。
Eureka Server的高可用
Eureka Server並不適合線上生產環境。Eureka Server會定時連線Eureka Server,獲取服務登錄檔
中的資訊並快取在本地。微服務在消費遠端API時總是使用本地快取的資料。因此,一般來說,即使
Eureka Server發生宕機,也不影響到服務之間的呼叫。但如果Eureka Server宕機時,某些微服務也
出現了不可用的情況,Eureka Client中快取若不被更新,就可能會影響到微服務的呼叫,甚至影響到
整個應用的高可用性。因此,在生產環境中,通常會部署一個高可用的Eureka Server叢集。
Eureka Server例項會彼此增量地同步資訊,從而儲存所有節點資料一致。
構建Eureka Server叢集
1.複製專案eureka,蔣ArtifactId修改為eureka-x。
2.配置系統的hosts改為127.0.0.1 peer1 peer2
3.修改application.yml如下:讓兩個節點的Eureka Server相互註冊。
spring:
application:
name: eureka-ha
---
spring:
cloud:
inetutils:
ignored-interfaces: #對於服務發現註冊,忽略某些命名的網路介面是非常有用的,比如使用Docker容器的時候。可以通過一些規則設定來忽略這些網路介面 https: //springcloud.cc/spring-cloud-dalston.html
- docker0 #忽略“docker0”的入口
- veth.* #忽略所有的入口以“veth.*”
profiles: peer1
server:
port: 8761 #指定該Eureka例項的埠
eureka:
server:
enableSelfPreservation: false #關閉自我保護
eviction-interval-timer-in-ms: 10000 #剔除已關停服務間隔(單位毫秒,預設是60*1000)
instance:
lease-expiration-duration-in-seconds: 30 #1
lease-renewal-interval-in-seconds: 10 #2
prefer-ip-address: true #3
#ip-address: 192.168.0.xxx //4
#指定當profiles=peer1,主機名是peer1
hostname: peer1
client:
register-with-eureka: false
fetch-registry: false
service-url:
#將自己註冊到peer2這個Eureka上面去
defaultZone: http://peer2:8762/eureka/
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
service-url: http://peer1:8761/eureka/
將application.yml檔案分為三段。第二段和第三段分別為spring.properties
指定一個值,該值表示他所在的那段內容應在哪個Profile裡。第一段由於並未指定
spring.profiles,因此這段內容會對所有Profile生效。
本文大部分內容轉載自周立的《Spring Cloud與Docker微服務架構實戰》