【发布时间】:2024-05-02 23:05:03
【问题描述】:
如何在下面的代码中关闭客户端:
object GoogleSecret {
def apply(
project: String,
version: String = SecretVersion,
credentials: CredentialsProvider = defaultProvider
): Try[SecretService] = Try {
require(project != null && project.nonEmpty, "project is null or empty")
val settings = SecretManagerServiceSettings.newBuilder
.setCredentialsProvider(credentialsProvider)
.build()
val client = SecretManagerServiceClient.create(settings)
logger.info(s"connected to project: $project")
secrets => secrets.flatMap {
secret =>
logger.debug(s"getting secret: $secret")
try {
val value = client
.accessSecretVersion(SecretVersionName.of(project, secret, version))
.getPayload
.getData
.toStringUtf8
Some(secret -> value)
} catch {
case e: Throwable => {
logger.error(s"google error ($secret): ${e.getMessage}")
client.shutdown()
client.awaitTermination(30, TimeUnit.SECONDS)
client.close()
None
}
}
}.toMap
}
上述方法创建了一个客户端连接到 GCP Secret Manager,以获取秘密值,但我有一些问题:
- 这个片段应该做什么:
secrets => secrets.flatMap {
secret =>
logger.debug(s"getting secret: $secret")
try {
val value = client
.accessSecretVersion(SecretVersionName.of(project, secret, version))
.getPayload
.getData
.toStringUtf8
Some(secret -> value)
} catch {
case e: Throwable => {
logger.error(s"google error ($secret): ${e.getMessage}")
client.shutdown()
client.awaitTermination(30, TimeUnit.SECONDS)
client.close()
None
}
}
}.toMap
- 如何转换代码以返回 Map[String, String] 中的机密值,并关闭客户端连接(类似这样):
def apply(
project: String,
version: String = SecretVersion,
credentials: CredentialsProvider = defaultProvider
): Try[SecretService] = Try {
.
.
.
some code with the solution
.
.
.
client.shutdown()
client.awaitTermination(30, TimeUnit.SECONDS)
client.close()
secrets
}
提前致谢;)
【问题讨论】:
-
您可能想看看像 cats-effect 或 ZIO 这样的效果系统,它们提供了一种更安全的资源管理方式。跨度>