使用Golang和AWS SNS来创建一个HTTP客户端和服务器API

107 阅读2分钟

在这个例子中,我们将创建一个应用程序到应用程序(A2A)的通信。两个应用都是HTTP APIs。客户端(发布者)发送事件(图片上传或下载),服务器(订阅者)监听事件以处理它们。我们有两种事件类型,分别是uploaddownload 。这两种类型都与image 主题相关。

我们从主题过滤器中受益,因为。

  • 订阅者在语义上是相互关联的。

  • 订阅者消费类似类型的事件。

  • 订阅者应该在主题上共享相同的访问权限。

步骤

  1. 创建一个主题。

  2. 运行服务器。

  3. 订阅服务器到主题。

  4. 客户端产生事件。

创建一个主题

你将在以后的客户端中使用下面的ARN。

$ aws --profile localstack --endpoint-url http://localhost:4566 sns create-topic --name image

运行服务器

这就是应用程序的结构。确保应用程序正在运行,因为下一步将向它发送一个 "订阅确认 "请求。

├── internal
main.go
package main
request.go
package image
image.go
package image

订阅服务器到该主题

该命令使用 "image-topic-attributes.json "文件,其内容如下。

{
$ aws --profile localstack --endpoint-url http://localhost:4566 sns subscribe --topic-arn arn:aws:sns:eu-west-1:000000000000:image --protocol https --notification-endpoint https://1fd011d7aa1z.ngrok.io/api/v1/images --attributes file://image-topic-attributes.json

如上所述,我正在使用Ngrok将我的应用程序暴露给互联网。这方面的命令是./ngrok http -host-header=rewrite localhost:8080

一旦服务器订阅了这个主题,它应该会收到一个类似下面的请求。服务器会识别这个并确认订阅。

POST /api/v1/images HTTP/1.1

你也应该在日志中看到2021/03/28 19:01:48 confirming subscription ...

客户端产生事件

你将使用的SNS方法如下。

func (s SNS) Publish(ctx context.Context, message, topicARN string, msgAttrs map[string]string) (string, error) {

对于手动测试,使用下面的例子。

attrs := map[string]string{"Event": "upload"}
attrs := map[string]string{"Event": "download"}

当你发布其中一个消息时,服务器的输出会像下面这样。

POST /api/v1/images HTTP/1.1

服务器也将输出2021/03/28 19:06:04 uploading https://www......image.jpeg ... 日志。上面的MessageId ,将与客户端在发布消息时产生的一致。