我正在构建一个使用acme/autocert的服务.要使用具有多个副本的服务,我必须编写像DirCache这样的持久缓存接口.然后我注意到,重新启动服务后,启动时忽略了缓存中的所有有效证书.以下序列始终发生:
这是正确的行为吗?因为每个副本都会创建自己的证书,并且在这种情况下不可能使用持久性缓存
这是我的经理工厂
func NewManager(d *db.DynamoDB, staging bool) *Manager {
manager := &Manager{
CertCache: NewPersistentCertCache(d),
}
directoryURL := acme.LetsEncryptURL
if staging {
directoryURL = LetsEncryptStagingURL
log.Infof("Using CA staging environment")
}
log.Infof("CA URI %s", directoryURL)
client := &acme.Client{
DirectoryURL: directoryURL,
}
manager.AcmeManager = &autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: manager.AllowHostPolicy,
Cache: manager.CertCache,
Client: client,
}
return manager
}
Run Code Online (Sandbox Code Playgroud)
这个问题的解决方案是缓存接口和行为正常工作。我的缓存实现有问题。我在 Cache.Get(...) 中有一个从数据库读取到通道的 goroutine,但不幸的是,外部 func 主体没有等待该通道并始终返回 CacheMissed 错误。修复后一切正常。我的错