在运行时从 Google 云存储中刷新 Spring 资源

Refresh Spring Resource from Google Cloud Storage in Runtime

我在 Google 云存储中有一个文件用作我的 Spring 服务器中的资源。我发现 Spring here 有一个 GCS SDK。但是,它只支持在应用程序启动时获取一次资源,就像任何 Spring 资源一样。就我而言,我需要在运行时定期更新资源,因此不需要重新部署。

当然可以像上面提到的那样在运行时获取资源 ,但是如果每个函数调用独立存储资源,内存使用量可能会膨胀。使用像 Spring 资源这样的单例模式将是理想的情况,因为资源计划用于多个 @Service 并节省内存使用量。有没有办法定义 @Bean@Resource 并定期更新它们?

根据问题评论部分中 Guillaume 的建议,这是我实施的解决方案。

@Component
public class FooClass implements InitializingBean {
    private static final String BUCKET_NAME = "bucket-name";
    private static final String FILE_PATH = "path/filename.extension";
    private static byte[] instanceVariable;

    @Autowired
    private Storage storage;

    public byte[] get() {
        return instanceVariable;
    }

    // Replacement of @PostConstruct
    @Override
    public void afterPropertiesSet() {
        setInstanceVariable();
    }

    @Scheduled(fixedRate = 60 * 1000) // Refresh each minute
    private void refreshAssociationRule() {
        setInstanceVariable();
    }

    private void setInstanceVariable() {
        Blob blob = storage.get(BUCKET_NAME, FILE_PATH);
        instanceVariable = blob.getContent();
    }
}

另一个 Spring 组件可以简单地自动装配 FooClass 并获取资源。

@Service
public class BarClass {
    @Autowired
    private FooClass fooClass;

    private void func() {
        byte[] resource = fooClass.get();
        // use resource here
    }
}

注意:如果资源不是像 String 这样的“引用的传递值”数据类型,这可能会导致并行请求中的内存膨胀。由于每个 get() 函数调用都会为内容分配内存资源,而不仅仅是引用。