Ligar a função Java ao Armazenamento do Microsoft Azure

Funções do Azure permite-lhe ligar serviços do Azure e outros recursos a funções sem ter de escrever o seu próprio código de integração. Estes enlaces, que representam a entrada e a saída, são declarados na definição da função. Os dados de enlaces são fornecidos à função como parâmetros. Um acionador é um tipo especial de enlace de entrada. Embora uma função tenha apenas um acionador, pode ter vários enlaces de entrada e saída. Para saber mais, veja Funções do Azure conceitos de acionadores e enlaces.

Este artigo mostra-lhe como integrar a função que criou no artigo de início rápido anterior com uma fila de Armazenamento do Azure. O enlace de saída que adicionar a esta função escreve dados de um pedido HTTP numa mensagem na fila.

A maioria dos enlaces requer uma cadeia de ligação armazenada que as Funções utilizam para aceder ao serviço vinculado. Para facilitar esta ligação, utilize a conta de Armazenamento que criou com a sua aplicação de funções. A ligação a esta conta já está armazenada numa definição de aplicação chamada AzureWebJobsStorage.

Pré-requisitos

Antes de começar este artigo, conclua os passos na parte 1 do início rápido de Java.

Transferir as definições da aplicação de funções

Já criou uma aplicação de funções no Azure, juntamente com a conta de Armazenamento necessária. A cadeia de ligação para esta conta é armazenada de forma segura nas definições da aplicação no Azure. Neste artigo, vai escrever mensagens numa fila de Armazenamento na mesma conta. Para ligar à sua conta de Armazenamento ao executar a função localmente, tem de transferir as definições da aplicação para o ficheiro local.settings.json.

Na raiz do projeto, execute o seguinte comando Funções do Azure Core Tools para transferir definições para local.settings.json, substituindo <APP_NAME> pelo nome da aplicação de funções do artigo anterior:

func azure functionapp fetch-app-settings <APP_NAME>

Poderá ter de iniciar sessão na sua conta do Azure.

Importante

Este comando substitui todas as definições existentes pelos valores da sua aplicação de funções no Azure.

Uma vez que contém segredos, o ficheiro local.settings.json nunca é publicado e deve ser excluído do controlo de origem.

Precisa do valor AzureWebJobsStorage, que é a cadeia de ligação da Conta de armazenamento. Utilize esta ligação para verificar se o enlace de saída funciona conforme esperado.

Ativar pacotes de extensões

A forma mais fácil de instalar extensões de enlace é ativar os pacotes de extensões. Quando ativa os pacotes, é instalado automaticamente um conjunto predefinido de pacotes de extensão.

Para ativar os pacotes de extensões, abra o ficheiro host.json e atualize o respetivo conteúdo para corresponder ao seguinte código:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[3.*, 4.0.0)"
    }
}

Agora, pode adicionar o enlace de saída de Armazenamento ao projeto.

Adicionar um enlace de saída

Num projeto Java, os enlaces são definidos como anotações de enlace no método de função. Em seguida, o ficheiro function.json é gerado automaticamente com base nestas anotações.

Navegue para a localização do código de função em src/main/java, abra o ficheiro de projeto Function.java e adicione o seguinte parâmetro à definição do run método:

@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg

O msg parâmetro é um OutputBinding<T> tipo, que representa uma coleção de cadeias. Estas cadeias são escritas como mensagens para um enlace de saída quando a função é concluída. Neste caso, o resultado é uma fila de armazenamento chamada outqueue. A cadeia de ligação da Conta de armazenamento é definida pelo connection método . Transmite a definição da aplicação que contém a cadeia de ligação da Conta de armazenamento, em vez de transmitir a própria cadeia de ligação.

A run definição do método tem agora de ter um aspeto semelhante ao seguinte exemplo:

@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)  
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") 
        OutputBinding<String> msg, final ExecutionContext context) {
    ...
}

Adicione código que utiliza o enlace de saída

Agora, pode utilizar o novo msg parâmetro para escrever no enlace de saída a partir do código de função. Adicione a seguinte linha de código antes da resposta de êxito para adicionar o valor de ao msg enlace de name saída.

msg.setValue(name);

Quando utiliza um enlace de saída, não tem de utilizar o código do SDK do Armazenamento do Azure para autenticação, obter uma referência de fila ou escrever dados. O runtime das Funções e o enlace de saída da fila fazem essas tarefas por si.

O seu run método tem agora de ter um aspeto semelhante ao seguinte exemplo:

public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", 
        connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
        .body("Please pass a name on the query string or in the request body").build();
    } else {
        // Write the name to the message queue. 
        msg.setValue(name);

        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
}

Atualizar os testes

Uma vez que o arquétipo também cria um conjunto de testes, tem de atualizar estes testes para processar o novo msg parâmetro na assinatura do run método.

Navegue para a localização do código de teste em src/test/java, abra o ficheiro de projeto Function.java e substitua a linha de código em //Invoke pelo seguinte código:

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

Agora, está pronto para experimentar o novo enlace de saída localmente.

Executar a função localmente

Tal como anteriormente, utilize o seguinte comando para criar o projeto e iniciar o runtime das Funções localmente:

mvn clean package 
mvn azure-functions:run

Nota

Uma vez que ativou os pacotes de extensões no host.json, a extensão de enlace de armazenamento foi transferida e instalada automaticamente durante o arranque, juntamente com as outras extensões de enlace da Microsoft.

Tal como anteriormente, acione a função a partir da linha de comandos com cURL numa nova janela de terminal:

curl -w "\n" http://localhost:7071/api/HttpTrigger-Java --data AzureFunctions

Desta vez, o enlace de saída também cria uma fila com o nome outqueue na sua conta de Armazenamento e adiciona uma mensagem com esta mesma cadeia.

Em seguida, utilize a CLI do Azure para ver a nova fila e verificar se foi adicionada uma mensagem. Também pode ver a sua fila com o Explorador de Armazenamento do Microsoft Azure ou no portal do Azure.

Definir a ligação da Conta de armazenamento

Abra o ficheiro local.settings.json e copie o valor de AzureWebJobsStorage, que é a cadeia de ligação da Conta de armazenamento. Defina a variável de AZURE_STORAGE_CONNECTION_STRING ambiente para a cadeia de ligação com este comando bash:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

Quando define a cadeia de ligação na AZURE_STORAGE_CONNECTION_STRING variável de ambiente, pode aceder à sua conta de Armazenamento sem ter de fornecer autenticação sempre.

Consultar a fila de Armazenamento

Pode utilizar o az storage queue list comando para ver as filas de Armazenamento na sua conta, tal como no exemplo seguinte:

az storage queue list --output tsv

O resultado deste comando inclui uma fila com o nome outqueue, que é a fila que foi criada quando a função foi executada.

Em seguida, utilize o az storage message peek comando para ver as mensagens nesta fila, como neste exemplo:

echo `echo $(az storage message peek --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`

A cadeia devolvida deve ser a mesma que a mensagem que enviou para testar a função.

Nota

O exemplo anterior descodifica a cadeia devolvida da base64. Isto deve-se ao facto de os enlaces de armazenamento de Filas escreverem e lerem a partir do Armazenamento do Azure como cadeias base64.

Reimplementar o projeto

Para atualizar a aplicação publicada, execute novamente o seguinte comando:

mvn azure-functions:deploy

Mais uma vez, pode utilizar o cURL para testar a função implementada. Tal como anteriormente, transmita o valor AzureFunctions no corpo do pedido POST para o URL, como neste exemplo:

curl -w "\n" https://fabrikam-functions-20190929094703749.azurewebsites.net/api/HttpTrigger-Java?code=zYRohsTwBlZ68YF.... --data AzureFunctions

Pode examinar novamente a mensagem Fila de armazenamento para verificar se o enlace de saída gera uma nova mensagem na fila, conforme esperado.

Limpar os recursos

Outros guias de introdução desta coleção têm por base este guia de introdução. Se planeia continuar com os inícios rápidos subsequentes ou com os tutoriais, não limpe os recursos criados neste início rápido. Se não quiser continuar, utilize o seguinte comando para eliminar todos os recursos criados neste início rápido:

az group delete --name myResourceGroup

Selecione y quando lhe for pedido.

Passos seguintes

Atualizou a função acionada por HTTP para escrever dados numa fila de Armazenamento. Para saber mais sobre o desenvolvimento de Funções do Azure com Java, veja o guia do programador java Funções do Azure e Funções do Azure acionadores e enlaces. Para obter exemplos de projetos de Funções completos em Java, veja os exemplos de Funções Java.

Em seguida, deve ativar a monitorização do Application Insights para a sua aplicação de funções: