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 微服务 - 依赖的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 微服务如何实现编排? [关闭]

spring boot 的基本使用和短信微服务的搭建

微服务架构之spring boot admin

maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目

基于 Spring Boot 的微服务集成测试

微服务架构体系丨Spring Boot原理与实践应用