4

我正在开发包含客户端、注册表和配置服务器的 Spring 云项目(Spring Boot + Eureka API),因此我需要从配置服务器加载 Message 属性:

我已经有一个配置服务器,其 application.properties 配置良好,可从客户端服务器获得。

我当前在客户端微服务中的 MessageSource Bean:

@Configuration
public class Config {

    @Bean
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}
4

2 回答 2

0

我使用嵌入 spring-cloud-config ( spring.cloud.config.server.bootstrap=true),所以我配置为将 git repo 下载到我的可运行 jar 附近的本地文件夹 -build/config/backend

spring:
   cloud:
       config:
           server:
               bootstrap: true
               git:
                   searchPaths: backend
                   basedir: build/config

在我将此类配置用于消息资源之后(我messages directory在文件中的资源messages*.properties

spring.messages.basename=file:${spring.cloud.config.server.git.basedir}/${spring.cloud.config.server.git.searchPaths}/messages/messages

和bean配置

    @Value("${spring.messages.basename}")
    private String basename;

    @Value("${spring.messages.cache-duration}")
    private Duration cacheDuration;

    @Value("${spring.messages.use-code-as-default-message}")
    private Boolean useCodeAsDefaultMessage;

    @Bean
    @Primary
    @RefreshScope
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(basename)));
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
        messageSource.setCacheMillis(cacheDuration.toMillis());
        messageSource.setUseCodeAsDefaultMessage(useCodeAsDefaultMessage);
        return messageSource;
    }

从 git repo 更新配置后,它还会更新应用程序中的消息资源

于 2020-11-20T09:38:53.760 回答
0

如果你想从配置服务加载它们,你只需要指向它的配置路径。

此类的值是从 bootstrap.yml 中读取的。

我在 application.yml 级别上有一个名为“locale”的文件夹,里面有文件“messages_en_GB.properties”。

Structure:
  application.yml
  locale (folder)
     messages_en_GB.properties

@Configuration
public class MessageConfig {

  private static final Logger LOGGER = LoggerFactory.getLogger(MessageConfig.class);

  @Value("${spring.cloud.config.uri}")
  private String cloudUri;

  @Value("${spring.cloud.config.label}")
  private String cloudLabel;

  @Value("${spring.profiles.active}")
  private String profile;

  @Value("${spring.cloud.config.enabled:false}")
  private boolean cloudEnabled;

  @Bean
  @RefreshScope
  public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource =
        new ReloadableResourceBundleMessageSource();
    messageSource.setBasename(buildMessageLocation());
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
  }

  private String buildMessageLocation() {

    if (Strings.isNullOrEmpty(cloudUri) || Strings.isNullOrEmpty(profile) || Strings
        .isNullOrEmpty(cloudLabel) || !cloudEnabled) {
      LOGGER.info("The cloud configuration is disabled, using local messages properties file");
      return "classpath:locale/messages";
    }

    return cloudUri + "/" + profile + "/" + profile + "/" + cloudLabel + "/locale/" + "messages";
  }
于 2019-11-27T15:22:07.457 回答