關于Spring Cloud Eureka的核心概念
? ? ? Eureka 是 Netflix 開源的一款基于 REST 的服務發現工具,主要用于中間層服務器的云端負載均衡。它通過維護一個服務注冊表來實現服務之間的通信1。在 Spring Cloud 中,Eureka 提供了一個高可用的服務注冊與發現機制,使得微服務架構中的各個模塊可以動態地加入或退出集群
一、核心工作原理
-
服務注冊
服務提供者(Eureka Client)啟動時,向Eureka Server發送元數據(IP、端口、健康狀態等)完成注冊,注冊表存儲結構為:Map<String,?Map<String,?Lease<InstanceInfo>>>Map<String,?Map<String,?Lease<InstanceInfo>>>
其中外層Map鍵為服務名稱,內層Map鍵為實例ID2。
-
服務續約
客戶端每30秒發送心跳包(eureka.instance.lease-renewal-interval-in-seconds
),服務端收到后更新租約時間。若90秒未收到心跳(eureka.instance.lease-expiration-duration-in-seconds
),標記實例不可用。 -
服務發現
消費者通過服務名稱向Eureka Server獲取實例列表,默認每30秒更新本地緩存(eureka.client.registry-fetch-interval-seconds
)。 -
服務剔除
Eureka Server每60秒檢查失效實例(eureka.server.eviction-interval-timer-in-ms
),啟動自我保護模式時暫停剔除
二、服務端配置(EUREKA SERVER)
-
依賴配置
在pom.xml
中添加Eureka Server依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
接著,在啟動類上添加 @EnableEurekaServer
注解即可啟用 Eureka Server 功能
配置文件設置
以下是典型的 application.yml
或 application.properties
文件配置示例,用于初始化單節點的 Eureka Server:
server:port: 8761 # Eureka默認端口
eureka:instance:hostname: localhostclient:register-with-eureka: false # 服務端無需自我注冊fetch-registry: false # 不拉取注冊表service-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動類注解
添加@EnableEurekaServer
以激活服務端:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}
三、客戶端配置(EUREKA CLIENT)
-
依賴配置
客戶端需引入spring-cloud-starter-netflix-eureka-client
:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
配置文件
application.yml
spring:application:name: user-service # 服務名稱 eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ # 注冊到Eureka Server
啟動類注解
使用@EnableDiscoveryClient
或@EnableEurekaClient
(兩者等效):
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
}
?
四、核心代碼實現步驟
-
?服務注冊
客戶端啟動后自動向Eureka Server注冊,可通過http://localhost:8761
查看注冊列表。 - .服務發現
? ? ? 使用DiscoveryClient
動態獲取其他服務實例
@Autowired
private DiscoveryClient discoveryClient;public List<ServiceInstance> getServiceInstances(String serviceName) {return discoveryClient.getInstances(serviceName);
}
?3. 服務消費者調用
@RestController
public class ConsumerController {@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/call")public String callService() {List<ServiceInstance> instances = discoveryClient.getInstances("PROVIDER-SERVICE");// 負載均衡邏輯...}
}
五、高級配置示例
-
高可用集群
部署多個Eureka Server并相互注冊YAML:?
# 節點1配置
eureka:client:service-url:defaultZone: http://eureka-node2:8762/eureka/
# 節點2配置
eureka:client:service-url:defaultZone: http://eureka-node1:8761/eureka/
?安全認證
添加Spring Security依賴并配置YAML:
eureka:client:service-url:defaultZone: http://user:password@localhost:8761/eureka/
?健康檢查與元數據
啟用健康檢查并自定義元數據YAML
eureka:instance:health-check-url-path: /actuator/healthmetadata-map:zone: us-east
?