SpringCloud Eureka 使用教程

发布于:2025-03-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

SpringCloud Eureka 使用教程

目录

  1. Eureka 简介
  2. 环境准备
  3. 搭建 Eureka Server
    • 3.1 Maven 依赖
    • 3.2 配置文件
    • 3.3 启动类注解
    • 3.4 访问控制台
  4. 创建 Eureka Client
    • 4.1 服务提供者配置
    • 4.2 服务消费者配置
  5. Eureka 深入配置
    • 5.1 自我保护模式
    • 5.2 集群配置
    • 5.3 健康检查
    • 5.4 元数据配置
    • 5.5 实例配置
  6. Eureka REST API
  7. 监控与管理
  8. 常见问题与解决

Eureka 简介

Eureka 是 Netflix 开源的服务发现组件,属于 Spring Cloud Netflix 项目。它提供了服务注册与发现的功能,包含两个核心组件:

Eureka Server: 服务注册中心,提供服务注册和发现功能
Eureka Client: 服务提供者和消费者,注册到 Eureka Server 并从中获取服务列表

Eureka 特点:
• 高可用性:支持集群部署
• 弹性:自我保护模式防止网络分区时的雪崩效应
• 易于集成:与 Spring Cloud 生态无缝集成

环境准备

• JDK 1.8 或更高版本
• Maven 3.x
• Spring Boot 2.5.x 或 2.6.x
• Spring Cloud 2020.x 或 2021.x

推荐使用 IDE:IntelliJ IDEA 或 Eclipse

搭建 Eureka Server

3.1 Maven 依赖

pom.xml 中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3.2 配置文件

application.yml 中添加以下配置:

server:
  port: 8761

spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false # 不向 Eureka 注册自己
    fetch-registry: false     # 不从 Eureka 获取注册信息
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      
# 关闭自我保护模式(默认开启)
# eureka:
#   server:
#     enable-self-preservation: false
      
# 关闭客户端刷新缓存时间(默认30秒)
# eureka:
#   client:
#     registry-fetch-interval-seconds: 5

3.3 启动类注解

创建启动类并添加 @EnableEurekaServer 注解:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

3.4 访问控制台

启动应用后,访问 Eureka 控制台:

http://localhost:8761

默认界面会显示"Discovering instances…",稍等片刻即可看到注册信息。

创建 Eureka Client

4.1 服务提供者配置

Maven 依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
application.yml 配置
server:
  port: 8081

spring:
  application:
    name: service-provider

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true # 使用IP地址注册
启动类注解
@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

4.2 服务消费者配置

消费者配置与服务提供者类似,只需更改 spring.application.name 和端口:

server:
  port: 8082

spring:
  application:
    name: service-consumer

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
添加 RestTemplate Bean
@Configuration
public class ConsumerConfig {
    
    @Bean
    @LoadBalanced // 启用负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
调用示例
@RestController
public class ConsumerController {
    
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/call-provider")
    public String callProvider() {
        return restTemplate.getForObject("http://service-provider/hello", String.class);
    }
}

Eureka 深入配置

5.1 自我保护模式

当短时间内大量服务心跳丢失时,Eureka Server 会进入自我保护模式,防止误删除有效服务实例。

相关配置:

eureka:
  server:
    enable-self-preservation: true # 默认开启
    renewal-percent-threshold: 0.85 # 续约百分比阈值

自我保护模式开启条件:
• 失效实例占比超过 (numberOfRenewsPerMinExpected - numberOfRenewsPerMinThreshold) / numberOfRenewsPerMinExpected

关闭自我保护模式(不推荐在生产环境使用):

eureka:
  server:
    enable-self-preservation: false

5.2 集群配置

单节点配置示例
eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/
多节点配置(不同服务器)

server1:

eureka:
  instance:
    hostname: peer1
  client:
    service-url:
      defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/

server2:

eureka:
  instance:
    hostname: peer2
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/

server3:

eureka:
  instance:
    hostname: peer3
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
使用 Docker 部署集群
FROM openjdk:8-jdk-alpine
COPY target/eureka-server.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

启动命令:

docker run -d -p 8761:8761 --name eureka1 eureka-server
docker run -d -p 8762:8761 --name eureka2 eureka-server
docker run -d -p 8763:8761 --name eureka3 eureka-server

5.3 健康检查

默认使用 Eureka 自带健康检查,可以切换为 Spring Boot Actuator:

management:
  endpoint:
    health:
      show-details: ALWAYS
  health:
    defaults:
      enabled: true

配置健康检查模式:

eureka:
  client:
    healthcheck:
      enabled: true # 开启Spring Boot健康检查

5.4 元数据配置

可以在 Eureka 中添加自定义元数据,供服务发现时使用:

eureka:
  instance:
    metadata-map:
      zone: shanghai
      version: 1.0.0
      custom-info: this is custom metadata

在客户端获取元数据:

ApplicationInfoManager applicationInfoManager = ApplicationInfoManager.getInstance();
InstanceInfo instanceInfo = applicationInfoManager.getInfo();
Map<String, String> metadata = instanceInfo.getMetadata();
String zone = metadata.get("zone");

5.5 实例配置

心跳配置
eureka:
  instance:
    lease-renewal-interval-in-seconds: 30 # 心跳间隔,默认30秒
    lease-expiration-duration-in-seconds: 90 # 租约过期时间,默认90秒
状态页面与健康检查路径
eureka:
  instance:
    status-page-url-path: /actuator/info
    health-check-url-path: /actuator/health

Eureka REST API

Eureka 提供了丰富的 REST API 接口:

获取注册服务列表
GET /eureka/apps
获取特定服务实例
GET /eureka/apps/{appName}
注册新服务实例
POST /eureka/apps/{appName}
Content-Type: application/json

{
  "instance": {
    "hostName": "localhost",
    "app": "service-provider",
    "ipAddr": "127.0.0.1",
    "port": {"$": 8081, "@enabled": "true"},
    "dataCenterInfo": {
      "@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
      "name": "MyOwn"
    }
  }
}
注销服务实例
DELETE /eureka/apps/{appName}/{instanceId}

完整 API 文档参考:Eureka REST Operations

监控与管理

Eureka 提供基本的管理界面,访问:

http://localhost:8761/

控制台主要功能:
• 查看所有注册服务
• 查看服务实例状态
• 手动注销服务实例
• 查看服务注册统计信息

对于生产环境监控,建议结合:
• Spring Boot Actuator
• Prometheus + Grafana
• ELK 日志系统

常见问题与解决

1. 服务无法注册到 Eureka

• 检查 Eureka Server 是否正常运行
• 检查网络连接和防火墙设置
• 验证服务配置的 Eureka Server 地址是否正确
• 检查服务端口是否被占用

2. 服务频繁上下线

• 检查服务健康状态
• 验证心跳配置是否合理
• 检查网络稳定性
• 调整租约过期时间(leaseExpirationDurationInSeconds)

3. Eureka 控制台不显示服务

• 等待一段时间(默认30秒同步周期)
• 检查服务实例元数据中的 status-page-url-path 配置
• 清除浏览器缓存或使用无痕模式访问

4. 自我保护模式问题

• 自我保护模式下会保留失效实例,可通过以下配置关闭:

eureka:
  server:
    enable-self-preservation: false

• 生产环境谨慎关闭自我保护模式

5. 集群同步问题

• 检查集群节点间的网络连接
• 验证各节点的 service-url 配置是否正确
• 检查各节点的时钟是否同步(建议使用 NTP 服务)

总结

Eureka 是微服务架构中重要的服务发现组件,本文介绍了:
• Eureka Server 的搭建与基本配置
• Eureka Client 的服务注册与发现
• 深入配置:自我保护模式、集群、健康检查等
• REST API 和监控管理
• 常见问题与解决方案

通过合理配置 Eureka,可以实现高效可靠的服务发现机制。在实际应用中,建议:
• 生产环境使用集群部署
• 根据业务需求调整心跳和租约配置
• 结合监控系统实现全面监控
• 定期检查和维护服务注册信息