Spring Boot 微服务 - 依赖
Posted
技术标签:
【中文标题】Spring Boot 微服务 - 依赖【英文标题】:Spring Boot microservices - dependency 【发布时间】:2022-01-08 21:59:20 【问题描述】:使用 docker compose 部署了两个微服务。服务之间的依赖关系在 docker compose 文件中由 depends_on
属性定义。是否可以在 spring boot 应用程序中隐式实现相同的效果?
假设微服务 1 依赖于微服务 2。这意味着,在微服务 2 健康或在 Eureka 服务器上注册之前,微服务 1 不会启动。
【问题讨论】:
您可以使用docs.spring.io/spring-cloud-commons/docs/current/reference/html/… 等待服务可用。但是在我看来,这应该是一个基础设施问题,应该在那里处理。 【参考方案1】:通过研究,我找到了解决问题的方法。
Spring Retry 解决了对 Spring Cloud Config Server 的依赖。 Maven 依赖 spring-retry 应该添加到 pom.xml 中,并将以下属性添加到 .properties 文件中:
spring.cloud.config.fail-fast=true
spring.cloud.config.retry.max-interval=2000
spring.cloud.config.retry.max-attempts=10
以下配置类用于解决对其他微服务的依赖。
@Configuration
@ConfigurationProperties(prefix = "depends-on")
@Data
@Log
public class DependsOnConfig
private List<String> services;
private Integer periodMs = 2000;
private Integer maxAttempts = 20;
@Autowired
private EurekaClient eurekaClient;
@Bean
public void dependentServicesRegisteredToEureka() throws Exception
if (services == null || services.isEmpty())
log.info("No dependent services defined.");
return;
log.info("Checking if dependent services are registered to eureka.");
int attempts = 0;
while (!services.isEmpty())
services.removeIf(this::checkIfServiceIsRegistered);
TimeUnit.MILLISECONDS.sleep(periodMs);
if (maxAttempts.intValue() == ++attempts)
throw new Exception("Max attempts exceeded.");
private boolean checkIfServiceIsRegistered(String service)
try
eurekaClient.getNextServerFromEureka(service, false);
log.info(service + " - registered.");
return true;
catch (Exception e)
log.info(service + " - not registered yet.");
return false;
.properties 文件中定义了当前微服务所依赖的服务列表:
depends-on.services[0]=service-id-1
depends-on.services[1]=service-id-2
在列表中的所有服务都注册到 Eureka 之前,不会初始化 bean dependentServicesRegisteredToEureka
。如果需要,可以将注解 @DependsOn("dependentServicesRegisteredToEureka")
添加到 bean 或组件中,以防止在 dependentServicesRegisteredToEureka
初始化之前尝试初始化。
【讨论】:
另外,我发现将eureka.client.registry-fetch-interval-seconds
属性减少到 10 秒很有用,因为默认值是 90 秒,等待注册表刷新的时间太长。以上是关于Spring Boot 微服务 - 依赖的主要内容,如果未能解决你的问题,请参考以下文章