练习 - 处理队列消息
在本练习中,你将使用可在消息队列中的消息上触发的路由来扩展应用程序。
备注
在开始本练习之前,请确保已下载 Azurite 扩展、Azure 存储资源管理器和 Azure Functions Core Tools。
构架应用
对于本练习,我们将从新的应用 Azure Functions 应用开始。 创建一个新目录,并转到该目录中。
选择“查看”>“命令面板” 。
选择“Azure Functions:创建新项目”。
选择一个文件夹,通常选择的是你的当前文件夹。
在“选择语言”中,选择“自定义处理程序”。
在“为第一个函数选择模板”中,选择“HttpTrigger”。
为应用命名,例如“queueTrigger”。
选择“匿名”的授权级别。 以后可以根据需要对其进行更改。
在根目录下,创建名为“server.go”的文件。 你的项目现在应该拥有下列文件:
queueTrigger/ function.json .funcignore .gitignore host.json local.settings.json proxies.json server.go
转到
queueTrigger
目录中的“function.json”文件。 在type
元素中查找第一个绑定项:{ "authLevel": "anonymous", "type": "httpTrigger", "direction": "in", "name": "req", "methods": [ "get", "post" ] }
将绑定项更改为此配置:
{ "name": "queueItem", "type": "queueTrigger", "direction": "in", "queueName" : "items", "connection": "AzureWebJobsStorage" }
在此步骤中,设置
name
属性。 稍后需要在代码中引用它。 你还将触发器类型更改为queueTrigger
,从而可以侦听队列消息。值
queueName
指出特定的队列。 稍后运行仿真器时,将创建具有此类名称的队列。最后,指出了“local.settings.json”中的变量,该变量将包含队列的连接字符串。
创建应用
此时,你有一个应用框架。 现在准备好添加可处理传入队列消息的代码。
打开“server.go”文件,然后添加以下代码:
package main import ( "encoding/json", "fmt" "io/ioutil" "log" "net/http" "os" ) func queueHandler(w http.ResponseWriter, r *http.Request) { } func main() { customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT") if !exists { customHandlerPort = "8080" } mux := http.NewServeMux() mux.HandleFunc("/queueTrigger", queueHandler) fmt.Println("Go server Listening on: ", customHandlerPort) log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) }
现已在
/queueTrigger
设置了路由。找到导入部分,并在其下添加以下结构:
type InvokeRequest struct { Data map[string]json.RawMessage Metadata map[string]interface{} }
找到
queueHandler()
方法,然后按照以下方式添加对它的更新:func queueHandler(w http.ResponseWriter, r *http.Request) { var invokeRequest InvokeRequest d := json.NewDecoder(r.Body) d.Decode(&invokeRequest) var parsedMessage string json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage) }
代码首先从传入的响应流中读取正文并将其解码:
var invokeRequest InvokeRequest d := json.NewDecoder(r.Body) d.Decode(&invokeRequest)
然后,通过调用
Unmarshal()
发掘消息本身:var parsedMessage string json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)
现在你已收到消息,让我们把它打印出来。
添加以下代码:
fmt.Println(parsedMessage) // your message
现在,代码已全部编写完成,但需要配置项目才能对其进行测试。
在“host.json”文件中,找到
defaultExecutablePath
元素,并对其赋予./server
值。备注
对于 Windows,将使用
.\server.exe
值。通过在项目根目录下运行
go build
生成“server.go”文件:go build server.go
配置环境
下一步是配置环境。 由于是在本地进行开发,因此需要对其进行设置,以便可以与仿真的消息队列对话。
在“local.settings.json”文件中,在称为
Values
的AzureWebJobsStorage
中查找元素(如果缺少,则添加该元素)。 对其赋予UseDevelopmentStorage=true
值。 JSON 条目应如下所示:"AzureWebJobsStorage" : "UseDevelopmentStorage=true"
启动 Azurite 扩展,方式是打开命令面板(“视图”>“命令面板”),然后选择“Azurite: 启动队列服务”。
备注
此步骤将在项目中创建一些本地文件。
打开 Azure 存储资源管理器。 在左侧上,仿真器的内容可见。
右键单击“队列”节点,然后选择用于创建新队列的选项。 对其赋予“项”名称。
注意
可以将队列命名为想要的名称。 但是,你即将配置“function.json”。 在此处命名队列的任何名称都需要转到“function.json”。
在
queueTrigger
目录下,找到“function.json”。 确保bindings
数组具有以下条目:{ "name": "queueItem", "type": "queueTrigger", "direction": "in", "queueName" : "items", "connection": "AzureWebJobsStorage" }
queueName
属性与在 Azure 存储资源管理器中创建的队列同名。connection
属性指向在“local.settings.json”设置的值。name
属性具有值queueItem
。 Go 代码使用此值来分析队列消息。
运行应用程序
此时,已完成所有设置。 只需运行应用,启动 Azure 存储资源管理器并创建队列消息。 代码应该能够使用该消息。
在终端中,在项目根目录下运行
func start
命令:func start
在 Visual Studio Code 中,打开命令面板并运行“Azurite: 启动队列服务”。
启动 Azure 存储资源管理器(如果尚未启动)。
在 Azure 存储资源管理器中,选择“添加消息”:
在出现的对话框中,输入“消息”,然后选择“确定”。 现在可以看到所创建消息的详细信息。
在 Visual Studio Code 中,函数现在应该在运行中。 在终端中,现在应会看到打印为最后一行的消息。
函数能够使用队列消息并写出其内容。
祝贺你! 你在 Go 中生成了一个可在队列消息上触发的 Azure 函数。 你还分析了该消息。
对传入消息执行哪些操作由你决定。 例如,可以将它存储在数据库中,也可以将其作为有效负载发送到 Web 请求中。