我构建了一个gradle应用程序,它可以将消息发布到google pub/sub。我已经在GCP上创建了一个服务帐户,并下载了凭据json文件。我在GCP上创建了主题和订阅,在订阅中,我添加了我的服务帐户名称作为主体,并赋予了发布/订阅编辑器角色。以下是我的gradle应用程序的详细信息。
**Gradle依赖:**实现组:'org.springframework.cloud',名称:'spring-cloud-gcp-starter-pubsub',版本:'1.2.8.释放'
implementation 'org.springframework.cloud:spring-cloud-gcp-starter:1.2.0.RELEASE'
**application.yaml:**spring:纵断面:活动:myEnv应用程序:名称:pubsub云:gcp:project-id:project_id凭据:location:classpath:credentials.json
我把credentials.json放在src/main/resources中。
这是我的服务类。
public String publishMessageToPubSub() throws IOException, InterruptedException, ExecutionException {
String response = "Success";
Publisher publisher = null;
boolean isShutdown = false;
try {
//pubsubProperties.getGcp_config() : This piece of code is getting the credJsonString from AWS paramstore
InputStream inputStream = new ByteArrayInputStream(pubsubProperties.getGcp_config().getBytes());
CredentialsProvider credentialsProvider = FixedCredentialsProvider
.create(GoogleCredentials.fromStream(inputStream));
ProjectTopicName topic = ProjectTopicName.of("project_id","topic_id");
publisher = Publisher.newBuilder(topic).setCredentialsProvider(credentialsProvider).build();
String messageToBePublished = "Hello World";
byte[] encodedBytes = Base64.getEncoder().encode(messageToBePublished.getBytes());
String encodedMessage = new String(encodedBytes);
ByteString data = ByteString.copyFromUtf8(encodedMessage);
PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(data).build();
ApiFuture<String> messageIdFuture = publisher.publish(pubsubMessage);
String messageId = null;
try {
messageId = messageIdFuture.get();
log.info("Message Published Successfully with message Id : " + messageId);
} catch (Exception e) {
throw e;
}
publisher.shutdown();
isShutdown = true;
} catch (HttpStatusCodeException ioe) {
throw ioe;
} catch (Exception e) {
throw e;
} finally {
if (publisher != null && !isShutdown) {
// When finished with the publisher, shutdown to free up resources.
publisher.shutdown();
publisher.awaitTermination(1, TimeUnit.MINUTES);
}
}
return response;
}
这段代码工作正常,消息在GCP中发布,而credentials.json文件在src/main/resources中。
出于安全考虑,我们不能将此文件放在github中,并且此应用程序将通过Jenkins管道将git分支部署到ECS集群。但是,如果文件不存在,应用程序不会启动,并且在执行run方法后立即抛出下面的错误。
java.io.IOException:应用程序默认凭据不可用。如果在Google Compute Engine中运行,则可用。否则,必须定义环境变量GOOGLE_APPLICATION_CREDENTIALS,指向定义凭据的文件。有关详细信息,请参阅https://developers.google.com/accounts/docs/application-default-credentials。
它需要spring.cloud.gcp.project-id和spring.cloud.gcp.credentials.location属性,并试图找到credentials.json的位置,并使用内容示例化一些PubSub类。
并将该应用部署到ECS集群中。
请建议我一种不需要credentials.json路径来启动应用程序的方法,因为我可以设法获取json的内容以在代码中创建GoogleCredentials。或者有没有其他不需要credentials.json文件的身份验证方法。
1条答案
按热度按时间hjzp0vay1#
你需要在你的项目中添加一个服务帐户(从pubsub中读取消息的应用程序)。并向该服务帐户添加gcp发布者访问权限。
这样你就可以在tipic上发表而不用证书了