Spring 启动微服务 - 依赖

Spring Boot microservices - dependency

有两个使用 docker compose 部署的微服务。 docker compose 文件由 depends_on 属性 定义了服务之间的依赖关系。是否可以在 spring 启动应用程序中隐式实现相同的效果?

假设微服务 1 依赖于微服务 2。这意味着,在微服务 2 健康或在 Eureka 服务器上注册之前,微服务 1 不会启动。

通过研究,我找到了解决问题的方法。

Spring Retry 解决了对 Spring 云配置服务器的依赖。 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

下面的配置class用于解决对其他微服务的依赖

@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 初始化之前尝试初始化。