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:
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:
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: