练习 - 处理队列消息

已完成

在本练习中,你将使用可在消息队列中的消息上触发的路由来扩展应用程序。

备注

在开始本练习之前,请确保已下载 Azurite 扩展Azure 存储资源管理器Azure Functions Core Tools

构架应用

对于本练习,我们将从新的应用 Azure Functions 应用开始。 创建一个新目录,并转到该目录中。

  1. 选择“查看”>“命令面板” 。

  2. 选择“Azure Functions:创建新项目”。

  3. 选择一个文件夹,通常选择的是你的当前文件夹。

  4. 在“选择语言”中,选择“自定义处理程序”。

  5. 在“为第一个函数选择模板”中,选择“HttpTrigger”。

  6. 为应用命名,例如“queueTrigger”。

  7. 选择“匿名”的授权级别。 以后可以根据需要对其进行更改。

  8. 在根目录下,创建名为“server.go”的文件。 你的项目现在应该拥有下列文件:

    queueTrigger/
      function.json
    .funcignore
    .gitignore
    host.json
    local.settings.json
    proxies.json
    server.go 
    
  9. 转到 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”中的变量,该变量将包含队列的连接字符串。

创建应用

此时,你有一个应用框架。 现在准备好添加可处理传入队列消息的代码。

  1. 打开“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 设置了路由。

  2. 找到导入部分,并在其下添加以下结构:

    type InvokeRequest struct {
      Data     map[string]json.RawMessage
      Metadata map[string]interface{}
    }
    
  3. 找到 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)
    

    现在你已收到消息,让我们把它打印出来。

  4. 添加以下代码:

    fmt.Println(parsedMessage) // your message
    

    现在,代码已全部编写完成,但需要配置项目才能对其进行测试。

  5. 在“host.json”文件中,找到 defaultExecutablePath 元素,并对其赋予 ./server 值。

    备注

    对于 Windows,将使用 .\server.exe 值。

  6. 通过在项目根目录下运行 go build 生成“server.go”文件:

    go build server.go
    

配置环境

下一步是配置环境。 由于是在本地进行开发,因此需要对其进行设置,以便可以与仿真的消息队列对话。

  1. 在“local.settings.json”文件中,在称为 ValuesAzureWebJobsStorage 中查找元素(如果缺少,则添加该元素)。 对其赋予 UseDevelopmentStorage=true 值。 JSON 条目应如下所示:

    "AzureWebJobsStorage" : "UseDevelopmentStorage=true"
    
  2. 启动 Azurite 扩展,方式是打开命令面板(“视图”>“命令面板”),然后选择“Azurite: 启动队列服务”。

    备注

    此步骤将在项目中创建一些本地文件。

  3. 打开 Azure 存储资源管理器。 在左侧上,仿真器的内容可见。

  4. 右键单击“队列”节点,然后选择用于创建新队列的选项。 对其赋予“项”名称。

    Screenshot that shows the emulator in Azure Storage Explorer, with a new queue created.

    注意

    可以将队列命名为想要的名称。 但是,你即将配置“function.json”。 在此处命名队列的任何名称都需要转到“function.json”。

  5. queueTrigger 目录下,找到“function.json”。 确保 bindings 数组具有以下条目:

    {
       "name": "queueItem",
       "type": "queueTrigger",
       "direction": "in",
       "queueName" : "items",
       "connection": "AzureWebJobsStorage"
     }
    

    queueName 属性与在 Azure 存储资源管理器中创建的队列同名。 connection 属性指向在“local.settings.json”设置的值。

    name 属性具有值 queueItem。 Go 代码使用此值来分析队列消息。

运行应用程序

此时,已完成所有设置。 只需运行应用,启动 Azure 存储资源管理器并创建队列消息。 代码应该能够使用该消息。

  1. 在终端中,在项目根目录下运行 func start 命令:

    func start
    
  2. 在 Visual Studio Code 中,打开命令面板并运行“Azurite: 启动队列服务”。

  3. 启动 Azure 存储资源管理器(如果尚未启动)。

  4. 在 Azure 存储资源管理器中,选择“添加消息”:

    Screenshot that shows the selection for adding a message on the queue.

  5. 在出现的对话框中,输入“消息”,然后选择“确定”。 现在可以看到所创建消息的详细信息。

    Screenshot that shows message details.

  6. 在 Visual Studio Code 中,函数现在应该在运行中。 在终端中,现在应会看到打印为最后一行的消息。

    函数能够使用队列消息并写出其内容。

祝贺你! 你在 Go 中生成了一个可在队列消息上触发的 Azure 函数。 你还分析了该消息。

对传入消息执行哪些操作由你决定。 例如,可以将它存储在数据库中,也可以将其作为有效负载发送到 Web 请求中。