Spring-cloud體系搭建 01
1. Eureka簡介
在任何的分散式架構中,都需要去尋找服務的物理機器地址,我們稱之為服務發現,Eureka就是解決這類問題的元件。它是類似於Zookeeper的服務註冊中心元件,但Eureka保證了服務的高可用性,它自身的叢集機制和服務保護機制是其核心機制,我們可以給予它提供的便利搭建一套完整的為服務體系。下面進行Eureka服務端和客戶端的簡單搭建。
2. Eureka 服務特點
2.1. 高可用
支援叢集環境熱部署,可以跨多個節點進行服務例項共享,只要有一個節點可用就可以維持服務的可用性;
2.2. 點對點
叢集中每個服務節點共享服務例項的狀態;
2.3. 負載均衡
服務可以對請求進行負載均衡處理,一般採用輪詢健康例項的方式,也可以自定義服務發現方式
2.4. 客戶端彈性
所有註冊到註冊中心的客戶端都應該在本地快取一份服務列表,在服務不可用時可以繼續承擔服務的可用行。
2.5. 容錯率
Eureka註冊中心採用心跳檢測機制確保服務的可用行,及時清理不可用的服務例項。
3. Eureka-Server 服務端搭建
注:本文專案採用idea工具進行搭建
- 使用idea自身的spring initializr進行專案的初始化
- 初始化完成專案之後進行pom檔案匯入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
- 修改application.yml檔案,新增如下配置:
server:
# 指定該Eureka例項的埠
port: 8761
eureka:
instance:
# 指定該Eureka例項的主機名
hostname: localhost
preferIpAddress: true
server:
# 關閉自我保護機制 不推薦
# enableSelfPreservation: false
# 清理無效的服務節點,清理間隔(單位毫秒,預設是60*1000)
eviction-interval-timer-in-ms: 10000
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 最後在Eureka服務上面新增***@EnableEurekaServer***註解就可以啟動了。
由於Eureka提供了高可用的服務機制,我們可以啟動多個Eureka服務例項,然後client段修改配置檔案中defaultZone引數就可以了。Eureka服務註冊是通過服務輪詢的方式,一般我們啟動多個例項,client端只要在一個服務例項上註冊成功,有不需要額外的去其他服務例項進行註冊,並且Eureka有自身的服務列表拉取機制會同步更新服務列表,深入理解可以參考Eureka Client註冊到Eureka Server的祕密。
4. Eureka-Client端進行服務註冊
-
此處我以config配置中心作為Eureka的Client端。
-
首先我們構建一個maven工程,初始化完成後進行pom引入,
<!-- security 安全控制 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- eureka 服務註冊 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- 修改我們的配置檔案,注意Eureka客戶端的配置必須在Bootstrap.yml檔案中,涉及到配置檔案讀取順序的問題。 Bootstrap.yml 配置如下:
#服務註冊中心配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/ #,http://xxxxx:8761/eureka/
# 指定多少秒從註冊中心獲取一次例項服務列表 預設 30秒
# 減少值可以解決服務註冊慢問題,但一般不要設定太小
registry-fetch-interval-seconds: 20
instance:
# 獲取例項ip地址
prefer-ip-address: true
# 心跳包傳送時間 預設 30秒
lease-renewal-interval-in-seconds: 60
# 最後一次心跳時間間隔以下值之後清楚例項列表中的值,不應該小於心跳檢測時間 預設90秒
lease-expiration-duration-in-seconds: 100
# instance-id: config-server
-
配置完後需要在Client啟動類上加上*@EnableDiscoveryClient*註解。
-
配置完成後分別啟動Eureka-Server例項和Eureka-Client例項(本文以config-server代替),訪問可以看到client例項註冊到server中了。
注:prefer-ip-address: true 在生產環境一般需要設定為true,原因如下:
為什麼偏向於 IP地址在預設情況下, Eureka在嘗試註冊服務時, 將會使用主機名讓外界與它進行聯絡。這種方式在基於伺服器的環境中執行良好,在這樣的環境中,服務會被分配一個DNS支援的主機名。但是,在基 於容器的部署(如 Docker )中,容器將以隨機生成的主機名啟動,並且該容器沒有 DNS 記錄。 如果沒有將 eureka . instance.preferipAddress 設定量為 true,那麼客戶端應用程式將無法 正確地解析主機名的位置,因為該容器不存在 DNS 記錄。設定preferipAddress 屬性將通知 Eureka 服務,客戶端想要通過 IP地址進行通告。