1.Eureka 基礎概念
Eureka 是 Netflix 開發的服務注冊與發現組件,是 Spring Cloud 微服務架構中的核心模塊,用于解決微服務間的自動發現與通信問題。其核心功能包括:
- 服務注冊:服務實例將自身信息(IP、端口、健康狀態等)注冊到 Eureka Server。
- 服務發現:服務消費者從 Eureka Server 獲取可用服務列表。
- 服務健康檢查:通過心跳機制檢測服務實例的存活狀態。
2.Eureka 架構原理
1. 核心組件
- Eureka Server:服務注冊中心,維護服務實例列表,提供注冊、發現、剔除功能。
- Eureka Client:分為服務提供者(Producer)和服務消費者(Consumer),負責與 Server 交互。
- 注冊中心集群:多個 Eureka Server 互相復制數據,實現高可用性。
2. 服務注冊與發現流程
1. 服務注冊
- 服務啟動時,Client 向 Server 發送注冊請求,攜帶服務元數據(如服務名、IP、端口)。
- Server 接收請求后,將服務信息存入注冊表,并返回注冊成功響應。
2. 心跳續約
- Client 定期(默認 30 秒)向 Server 發送心跳請求(續約),表明服務存活。
- 若 Server 超過一定時間(默認 90 秒)未收到心跳,會將服務標記為“過期”并剔除。
3. 服務發現
- Consumer 啟動時,從 Server 獲取服務列表并緩存到本地。
- Consumer 調用服務時,從本地緩存獲取服務實例(通常結合負載均衡算法)。
4. 服務剔除
- Server 定期掃描注冊表,剔除過期(無心跳)的服務實例。
- Client 停止服務時,會主動向 Server 發送取消注冊請求。
3. 自我保護模式(Self-Preservation Mode)
- 觸發條件:當 Server 檢測到大量服務實例心跳失敗(如網絡分區),會進入自我保護模式。
- 核心邏輯:暫停剔除服務實例,避免健康服務被誤刪。
- 影響:此時 Server 可能包含已失效的服務實例,Consumer 需結合客戶端健康檢查(如 Ribbon + Hystrix)確保調用有效性。
4. 數據一致性
- Eureka Server 采用去中心化架構,Server 之間通過異步復制實現數據同步。
- 因此,服務注冊信息可能存在短暫不一致,但滿足最終一致性。
3.Eureka 使用詳解
1. 環境準備
- JDK 1.8+
- Spring Boot 2.x
- Spring Cloud 對應版本(如 Greenwich、Hoxton)
2. 搭建 Eureka Server
步驟 1:添加 Maven 依賴
<dependencies><!-- Eureka Server 依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
步驟 2:配置 application.yml
server:port: 8761 # Eureka Server 端口eureka:instance:hostname: localhost # 本地測試用,生產環境用域名或IPclient:# 是否將自己注冊為服務(Server 本身不需要注冊)register-with-eureka: false# 是否從 Eureka Server 獲取服務列表(Server 不需要)fetch-registry: false# Eureka Server 地址(集群時多個地址用逗號分隔)service-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/server:# 關閉自我保護模式(生產環境謹慎使用)enable-self-preservation: false# 剔除過期服務的時間間隔(毫秒)eviction-interval-timer-in-ms: 60000
步驟 3:啟動類添加注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer // 啟用 Eureka Server 功能
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}
3. 服務提供者(Producer)注冊
步驟 1:添加依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
步驟 2:配置 application.yml
server:port: 8081 # 服務端口spring:application:name: service-producer # 服務名稱,用于注冊eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ # Eureka Server 地址instance:# 注冊到 Eureka 的實例 IP(默認用 hostname,建議顯式指定 IP)ip-address: 127.0.0.1# 端口是否暴露(用于健康檢查)port:enable: true# 實例ID格式(服務名+IP+端口)instance-id: ${spring.application.name}:${eureka.instance.ip-address}:${server.port}# 心跳續約間隔(秒,默認30秒)lease-renewal-interval-in-seconds: 10# 心跳過期時間(秒,默認90秒)lease-expiration-duration-in-seconds: 30
步驟 3:啟動類(無需額外注解,自動注冊)
4. 服務消費者(Consumer)發現服務
步驟 1:添加依賴(同服務提供者)
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 如需負載均衡,添加 Ribbon 依賴 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
步驟 2:配置 application.yml
server:port: 8082spring:application:name: service-consumereureka:client:service-url:defaultZone: http://localhost:8761/eureka/# 示例:使用 Ribbon 進行負載均衡調用
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced // 開啟負載均衡
public RestTemplate restTemplate() {
return new RestTemplate();}
}// 服務調用示例
@Service
public class UserService {
@Autowired
private RestTemplate restTemplate; public String getUser() {
// 通過服務名調用(Ribbon 自動選擇實例)
return restTemplate.getForObject("http://service-producer/user/1", String.class);}
}
5. 高可用集群部署
- 原理:多個 Eureka Server 互相注冊,形成集群(如 Server A 注冊到 Server B,Server B 注冊到 Server A)。
- 配置示例(Server A 的 application.yml):
eureka:client:service-url:defaultZone: http://serverB:8762/eureka/ # 注冊到 Server B
- 注意:生產環境建議使用域名或負載均衡器指向集群,避免硬編碼多個地址。
4.Eureka 核心參數調優
參數名 | 作用 | 默認值 | 建議生產值 |
eureka.instance.lease-renewal-interval-in-seconds | 心跳續約間隔(秒),縮短可加快服務狀態更新,但增加網絡開銷 | 30 | 10-15 |
eureka.instance.lease-expiration-duration-in-seconds | 心跳過期時間(秒),超過此時間未收到心跳則剔除服務 | 90 | 30-45 |
eureka.server.eviction-interval-timer-in-ms | 剔除過期服務的掃描間隔(毫秒) | 60000 | 30000 |
eureka.server.enable-self-preservation | 是否開啟自我保護模式,生產環境建議開啟,避免網絡波動導致服務誤刪 | true | true |
eureka.client.registry-fetch-interval-seconds | 服務消費者獲取服務列表的間隔(秒) |
5.Eureka 與其他服務發現組件對比
組件 | 一致性模型 | 健康檢查方式 | 支持功能 | 社區活躍度 |
Eureka | 最終一致性 | 客戶端心跳(主動) | 服務注冊發現、自我保護 | 較低(Netflix 已停止維護) |
Consul | 強一致性(Raft) | 客戶端心跳 + 服務端主動檢查 | 服務注冊、健康檢查、配置中心、服務網格 | 高 |
Nacos | 最終一致性 / 強一致性 | 客戶端心跳 + 服務端主動檢查 | 服務注冊、配置中心、流量管理 | 高(阿里維護) |
6.注意事項
1. 生產環境建議:
- 開啟自我保護模式(`enable-self-preservation: true`)。
- 部署至少 3 個 Eureka Server 節點形成集群。
- 結合客戶端健康檢查(如 Ribbon + Hystrix)處理失效服務。
2. Netflix 停止維護:
- Eureka 1.x 已進入維護模式,建議新項目考慮 Consul 或 Nacos。
- Spring Cloud 已推出 `spring-cloud-starter-cloud-eureka` 適配 Eureka 2.x(需自行構建)。
3. 服務發現優化:
- 服務消費者啟用本地緩存(Eureka 自動實現),減少對 Server 的調用壓力。
- 大型系統中按業務域拆分注冊中心,避免單中心負載過高。