kotlin / java 中的 Google Pub/Sub 客户端出现意外的 TLS 异常

问题描述 投票:0回答:1

我正在 Android 上编写一个应用程序,该应用程序利用 Google pubsub,并且已经用 go 编写了相应的客户端。

请提前原谅我,因为这是我的第一个 Android 应用程序,也是我第一次使用 kotlin。 我已经用 Java 进行了编程,所以如果有什么看起来明显错误的地方,请提前道歉。

我已经阅读了文档,但陷入困境。

我遇到的问题源于初始化 pubsub 客户端。 我相信我的凭据 json 是与我的项目、主题等一起获取的。我遇到的问题是,我不认为我应该向项目添加更多依赖项,因为 google pubsub 示例不包含这些依赖项。 我不知道这个兔子洞有多远,但我认为 Google 的例子应该开箱即用:

我参考的是: https://cloud.google.com/pubsub/docs/publish-receive-messages-client-library#pubsub-client-libraries-java

我没有使用 gcloud 命令,但创建了一个credentials.json,它在我的 golang 应用程序中运行得很好。

相关位: 构建.gradle.kts

android {
    packagingOptions {
        resources.excludes.add("META-INF/*")
    }
}

dependencies {
    implementation(libs.googlePubSub)
    implementation(libs.grpc)
    implementation(libs.tls)
}

app/src/main/res/raw/credentials.json

gradle/libs.versions.toml

[versions]
googlePubSub = "1.134.2"
grpc = "1.68.1"
tls = "2.0.69.Final"`

[libraries]
googlePubSub = { group = "com.google.cloud", name = "google-cloud-pubsub",    version.ref="googlePubSub"}
grpc = { group = "io.grpc", name = "grpc-netty", version.ref="grpc"}
tls = { group = "io.netty", name = "netty-tcnative-boringssl-static",   version.ref="tls"}

问题出现在这里:

fun getPublisher(): Publisher {

    return Publisher.newBuilder(getTopic()).setCredentialsProvider { credentials}.build()
}

fun getTopic(): TopicName {
    val topic = TopicName.of(configuration.project, configuration.requestTopic)

    val topicAdminSettings = TopicAdminSettings.newBuilder().setCredentialsProvider{ credentials }.build()

    TopicAdminClient.create(topicAdminSettings).use { topicAdminClient -> topicAdminClient.createTopic(topic)}

    return topic
}

我先添加了grpc库,然后添加了boringssl库,但这似乎不对。 我最近收到的错误(即使在添加了 Boringssl 库之后)是:

找不到 TLS ALPN 提供商;没有可用的 netty-tcnative、Conscrypt 或 Jetty NPN/ALPN

我必须指出,此时配置和凭据对象已正确填充。

我尝试遵循 Google pubsub Java 客户端的在线文档,并期望发布一条消息。 我还提到了一个示例项目,但这些库似乎已经过时了:

https://github.com/androidthings/weatherstation

编辑#1:

我更新了依赖项:

grpc-netty -> grpc-okhttp

并修改了包装:

resources.excludes.add("META-INF/*") -> resources.excludes.add("META-INF/INDEX.LIST") and resources.excludes.add("META-INF/DEPENDENCIES")

我现在面临的错误是应用程序没有连接到互联网。 它抱怨 pubsub.googleapis.com 无法在同一台机器上解析,ping 解析为 IP 地址。

编辑#2: 经过进一步调试,我发现我需要互联网权限。

编辑#3: Pub Sub 连接正常。

android kotlin google-cloud-pubsub
1个回答
0
投票

我的问题的解决方案确实是依赖。 我偶然发现过时的代码并且依赖关系不正确。

解决方案是:

  1. 使用 grpc-okhttp,而不是 grpc-netty
  2. 不要排除 META-INF 下的所有内容,只需排除 INDEX.LIST 和 DEPENDENCIES
© www.soinside.com 2019 - 2024. All rights reserved.