SpringBoot与Spring Cloud微服务多实例创建及Eureka相关问题咨询
微服务相关问题解答
1. 如何创建特定微服务的多个实例?
核心是保证每个实例的端口唯一,常见实现方式:
- 命令行指定端口启动:运行jar包时通过参数指定不同端口,示例:
java -jar your-service.jar --server.port=8081 java -jar your-service.jar --server.port=8082 - 多环境配置文件:创建多个环境配置文件(如
application-8081.yml、application-8082.yml),分别设置不同端口,启动时指定激活环境:
启动命令:# application-8081.yml server: port: 8081java -jar your-service.jar --spring.profiles.active=8081 - IDE多实例启动:以IDEA为例,复制现有微服务的启动配置,在
Program arguments中添加--server.port=8082,重复操作启动多个实例即可。
2. 基于Eureka Server的服务注册中心如何实现微服务多实例的负载分发?
Eureka结合客户端负载均衡组件(默认是Ribbon)完成负载分发,流程如下:
- 实例注册与心跳维护:微服务实例启动时向Eureka Server注册自身信息,后续每30秒发送一次心跳维持注册状态,Eureka Server实时更新注册表。
- 客户端拉取注册表:服务消费者启动时从Eureka Server拉取完整实例列表,每30秒刷新一次本地缓存。
- 负载策略执行:消费者调用服务时,Ribbon从本地缓存的实例列表中按预设策略选择实例:
- 默认策略:轮询(RoundRobinRule),依次调用每个实例
- 可选策略:随机(RandomRule)、响应时间权重(WeightedResponseTimeRule)、重试(RetryRule)等,可通过配置自定义。
3. 停止服务后Eureka仍显示服务运行的问题排查
核心原因
问题源于Eureka的自我保护机制和默认的心跳、清理配置:
- 自我保护模式:当Eureka Server15分钟内收到的心跳失败率超过85%时,会触发自我保护,此时不会剔除任何过期实例,避免网络波动误删正常服务。
- 默认时间配置:微服务默认30秒发一次心跳,Eureka Server默认90秒未收到心跳才标记实例过期,且每60秒才执行一次过期实例清理。
解决方案(开发环境适用,生产环境需谨慎调整)
Eureka Server配置修改
server: port: 8761 eureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false server: # 关闭自我保护模式(开发环境建议开启,生产不建议) enable-self-preservation: false # 缩短过期实例清理间隔(默认60000ms,改为5000ms) eviction-interval-timer-in-ms: 5000
Eureka客户端配置修改
eureka: instance: prefer-ip-address: true # 缩短心跳发送间隔(默认30s,改为5s) lease-renewal-interval-in-seconds: 5 # 缩短心跳过期时间(默认90s,改为10s) lease-expiration-duration-in-seconds: 10 client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://localhost:8761/eureka
调整后,停止服务后Eureka会更快识别实例过期并剔除,同时关闭自我保护避免误保留已停止的服务。
内容的提问来源于stack exchange,提问作者ayush
相关产品推荐
相关产品推荐

