【问题标题】:Spring Boot microservices - dependencySpring Boot 微服务 - 依赖
【发布时间】:2022-01-08 21:59:20
【问题描述】:

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

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

【问题讨论】:

标签: spring-boot docker microservices netflix-eureka


【解决方案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 秒,等待注册表刷新的时间太长。
猜你喜欢
  • 2020-12-09
  • 1970-01-01
  • 2015-09-03
  • 2022-10-13
  • 2020-05-21
  • 2021-05-12
  • 2017-09-08
  • 2019-04-01
  • 2020-03-11
相关资源
最近更新 更多