java 如何发布消息到google pub/sub而不需要在应用程序启动时需要的服务帐户凭据json?

kgsdhlau  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(90)

我构建了一个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中。
这是我的服务类。

  1. public String publishMessageToPubSub() throws IOException, InterruptedException, ExecutionException {
  2. String response = "Success";
  3. Publisher publisher = null;
  4. boolean isShutdown = false;
  5. try {
  6. //pubsubProperties.getGcp_config() : This piece of code is getting the credJsonString from AWS paramstore
  7. InputStream inputStream = new ByteArrayInputStream(pubsubProperties.getGcp_config().getBytes());
  8. CredentialsProvider credentialsProvider = FixedCredentialsProvider
  9. .create(GoogleCredentials.fromStream(inputStream));
  10. ProjectTopicName topic = ProjectTopicName.of("project_id","topic_id");
  11. publisher = Publisher.newBuilder(topic).setCredentialsProvider(credentialsProvider).build();
  12. String messageToBePublished = "Hello World";
  13. byte[] encodedBytes = Base64.getEncoder().encode(messageToBePublished.getBytes());
  14. String encodedMessage = new String(encodedBytes);
  15. ByteString data = ByteString.copyFromUtf8(encodedMessage);
  16. PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(data).build();
  17. ApiFuture<String> messageIdFuture = publisher.publish(pubsubMessage);
  18. String messageId = null;
  19. try {
  20. messageId = messageIdFuture.get();
  21. log.info("Message Published Successfully with message Id : " + messageId);
  22. } catch (Exception e) {
  23. throw e;
  24. }
  25. publisher.shutdown();
  26. isShutdown = true;
  27. } catch (HttpStatusCodeException ioe) {
  28. throw ioe;
  29. } catch (Exception e) {
  30. throw e;
  31. } finally {
  32. if (publisher != null && !isShutdown) {
  33. // When finished with the publisher, shutdown to free up resources.
  34. publisher.shutdown();
  35. publisher.awaitTermination(1, TimeUnit.MINUTES);
  36. }
  37. }
  38. return response;
  39. }

这段代码工作正常,消息在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文件的身份验证方法。

hjzp0vay

hjzp0vay1#

你需要在你的项目中添加一个服务帐户(从pubsub中读取消息的应用程序)。并向该服务帐户添加gcp发布者访问权限。
这样你就可以在tipic上发表而不用证书了

相关问题