在这个例子中,我们将创建一个应用程序到应用程序(A2A)的通信。两个应用都是HTTP APIs。客户端(发布者)发送事件(图片上传或下载),服务器(订阅者)监听事件以处理它们。我们有两种事件类型,分别是upload 和download 。这两种类型都与image 主题相关。
我们从主题过滤器中受益,因为。
-
订阅者在语义上是相互关联的。
-
订阅者消费类似类型的事件。
-
订阅者应该在主题上共享相同的访问权限。
步骤
-
创建一个主题。
-
运行服务器。
-
订阅服务器到主题。
-
客户端产生事件。
创建一个主题
你将在以后的客户端中使用下面的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 ,将与客户端在发布消息时产生的一致。