当前位置: 首页 > 知识库问答 >
问题:

使用Java而不是引导,通过Eureka查找Spring云配置服务器。yml

云飞翮
2023-03-14

我试图将代码构建到我们的基本pom中,通过Eureka自动配置Spring Cloud配置服务器查找。我们这样做是为了避免为构建微服务的开发人员模板化. yml属性。例如,我们想java配置从这些属性触发的所有行为:

spring:
  application:
    name: MyMicroservice
  cloud:
    config:
      enabled: true
    server:
      prefix: /diagnostics/admin/config
    failFast: true
    discovery:
      enabled: true
      serviceId: echo

management:
  context-path: /diagnostics/admin

eureka:
  password: password
  client:
    serviceUrl:
      defaultZone: http://user:${eureka.password}@localhost:8761/eureka/
  instance:
    leaseRenewalIntervalInSeconds: 10
    statusPageUrlPath: /diagnostics/admin/info
    healthCheckUrlPath: /diagnostics/admin/health

经过大量实验后,以下方法主要适用于Eureka发现的配置服务器(不会导致重写的配置属性):

@Order(-1)
public class AdditionalBootstrapPropertySourceLocator implements PropertySourceLocator {

    @Override
    public PropertySource<?> locate(Environment environment) {
        Map<String, Object> theBootstrapYmlConfig = new HashMap<>();
        theBootstrapYmlConfig.put("spring.cloud.config.enabled", new Boolean(true));
        theBootstrapYmlConfig.put("spring.cloud.config.server.prefix", "/diagnostics/admin/config");
        theBootstrapYmlConfig.put("spring.cloud.config.failFast", new Boolean(true));
        theBootstrapYmlConfig.put("spring.cloud.config.discovery.enabled", new Boolean(true));
        theBootstrapYmlConfig.put("spring.cloud.config.discovery.serviceId", "echo");

        theBootstrapYmlConfig.put("management.context-path", "/diagnostics/admin");

        theBootstrapYmlConfig.put("eureka.client.serviceUrl.defaultZone", "http://user:password@localhost:8761/eureka/");
        theBootstrapYmlConfig.put("eureka.instance.leaseRenewalIntervalInSeconds", new Integer(10));
        theBootstrapYmlConfig.put("eureka.instance.statusPageUrlPath", "/diagnostics/admin/info");
        theBootstrapYmlConfig.put("eureka.instance.healthCheckUrlPath", "/diagnostics/admin/health");

        return new MapPropertySource("myExtraBootstrap", theBootstrapYmlConfig);    
    }    
}

我似乎也需要这个豆子:

@ConditionalOnWebApplication
@Configuration
@Import(EurekaClientAutoConfiguration.class)
public class WorkfrontDiscoveryClientConfigServiceBootstrapConfiguration {

    @Bean
    @ConditionalOnClass({ DiscoveryClient.class, ConfigServicePropertySourceLocator.class })
    @ConditionalOnMissingBean
    DiscoveryClientConfigServiceBootstrapConfiguration discoveryClientConfigServiceBootstrapConfiguration() {
        DiscoveryClientConfigServiceBootstrapConfiguration discoveryClientConfigServiceBootstrapConfiguration =
                 new DiscoveryClientConfigServiceBootstrapConfiguration();
        return discoveryClientConfigServiceBootstrapConfiguration;
    }

}

最后,我把它们都放进了Spring。确保工厂建成。问题是PropertySourceLocator从未用于在ConfigServicePropertySourceLocator内构造调用以检索属性。无论我做什么,我似乎都无法匹配在引导中指定属性的行为。yml将生产。

4天后编辑

这里的关键因素(和限制)是通过Eureka查找配置服务器的能力。在当前的Spring Cloud版本(1.0.2)中,对于上面的配置-查找-通过-尤里卡java属性源配置,在Spring初始化周期中过早地检索和构建属性源。另外,如果Eureka服务器运行缓慢或在引导启动时不可用,则当Eureka最终启动时,配置服务器属性源永远不会重建。这在我看来是一个错误。

我解决了这一切,消除了通过Eureka查找配置服务器的概念,并且在引导中需要这个最小的配置。yml:

spring:
  application:
    name: MyMicroservice
  cloud:
    config:
      uri: http://localhost:8888/diagnostics/admin/config

eureka:
  client:
    serviceUrl:
      defaultZone: http://user:password@localhost:8761/eureka/

然后在java AdditionalBootstrapProperty tySourceLocator中设置其余部分

30天后再编辑

Java配置引导属性仍然是一项挑战。我这样做是因为我开发的框架没有模板或代码生成(spring boot的前提)。我已将spring retry添加到mix中,配置客户端将重试,但重新注册到Eureka不会。这就是为什么尤里卡第一次被我抛弃的原因。我投票支持将spring retry集成到Eureka注册过程中,这样我就可以首先回到Eureka来构建我的框架。仍然在SpringCloud1.0上。2.

100天后编辑

更新我们结束的地方。继续我们的咒语,避免属性模板化,在代码中强制执行策略和实践。。在没有Eureka first概念的情况下,我们放弃了PropertySourceLocator,只使用了SpringApplicationRunListener,如下所示:

public class OurFrameworkProperties implements SpringApplicationRunListener {
  :
  public void started() {
    if (TestCaseUtils.isRunningFromTestCase()) {
      System.setProperty("spring.cloud.config.failFast", "false");
      System.setProperty("spring.cloud.config.enabled", "false");
      System.setProperty("eureka.client.enabled", "false");
    } else {
      // set production values same way
    }
  }
}

警告:每次spring应用程序运行或执行器刷新()时,此started()实际上会在spring代码中被调用两次(顺便说一句,一次不传递任何程序参数)。

共有2个答案

冀冯浩
2023-03-14

您必须在boostrap.properties中设置此属性

eureka.instance.metadataMap.configPath: /your-app-name

评论一下这个

#spring.cloud.config.uri=http://localhost:8888/

而且很明显肯定也是这个

eureka.client.serviceUrl.defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
eureka.client.instance.preferIpAddress: true

根据文件https://cloud.spring.io/spring-cloud-config/multi/multi__spring_cloud_config_client.html#discovery-第一引导

顾鸣
2023-03-14

如果您的属性资源定位器列在spring中。工厂(我假设是一个引导配置),那么它需要是一个@组件(或者甚至可能是一个@配置)。

 类似资料:
  • 我正在使用Spring Cloud Config服务器,能够检测来自git存储库的更改并将其传递给配置客户机。 有两种方法,我已经实现了: null 所以两者都工作得很好,那么使用Spring Cloud Bus有什么好处吗?或者在生产环境中,不使用Spring Cloud Bus会有什么问题吗?因为将需要额外的工作来设置RabbitMQ集群(HA)作为生产中的Spring云总线。 谢谢,大卫

  • 我想实现以下目标: 在“开发”模式下,在当前webapp中执行Spring云配置 因此,当前webapp的类路径包含对配置服务器和客户端的依赖关系: 在开发模式下,并在引导程序中具有以下属性。yml,没问题(嵌入式配置服务器已配置并启动) 当不在'dev'模式(例如spring.profiles.active=prod)时,当前的webapp不会启动:它无法自动装配我的属性(我猜嵌入式服务器是以错

  • 我一直在试图找到一个与eureka服务器集成的spring cloud gateway的运行示例,以及一些Hystrix示例,但到目前为止我还没有找到。有什么地方可以找到它吗?我真的很想看到spring cloud gateway投入使用,取代我目前的Zuul API服务。 谢谢!

  • 我正在尝试创建SpringCloudConfigServer,以便使用SSHURI连接到git存储库(bitbucket)。我正在关注Spring云配置 我使用ssh-keygen实用工具生成了密钥对,并粘贴了。发布文件内容在我的bitbucket帐户的ssh部分,但当我运行作为spring启动应用程序的服务器时,我得到无效的privateKey异常。 我也使用了这个堆栈溢出帖子中提供的建议,但是

  • 我正在使用Spring Cloud配置服务器,我需要为每个阶段的产品测试和开发创建一个配置文件,我已经为默认配置文件创建了4个yml文件application.yml,为每个配置文件创建了应用程序-{配置文件},所以我的问题是如何通过环境变量加载特定的配置,并在每个配置文件配置和端口上运行配置服务器,我已经创建了一个bootstrap.yml但我不能解决这个问题。如果有人能指导我完成这些步骤来满足

  • 我试图在应用程序启动时从配置服务器读取log4j2配置。 bootstrap.yml 应用程序似乎在启动期间得到了正确的配置,因为我看到了适当的日志级别。然而,自动配置似乎不起作用。当我更改日志记录器的日志级别时,它似乎没有在monitorInterval通过后从配置服务器读取更新的配置。我已将monitorInterval设置为10秒。根据文件,最小间隔应为5秒。如果我指向本地驱动器上的文件,而