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
初始化之前尝试初始化。
有两个使用 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
初始化之前尝试初始化。