Junho de 2018

Volume 33 Número 6

Pontos de Dados — Substituindo uma API Pesada pelo Azure Functions

Por Julie Lerman | De 2018 junho

Código disponível para download em msdn.com/magazine/0618magcode.

Volta na 2015 e 2016, escrevi algumas colunas sobre uma API de Web de Node. js que interagir com documentos do Azure. Foi muito envolvidos. Mesmo que fizemos projetado vantagem do SDK do Node.js do DocumentDB, precisei gravar muita lógica. Houve lógica para a criação de objetos que representado conta do DocumentDB, o banco de dados e as coleções. Ocorreu o código para criar consultas e executá-los, camadas de chamadas assíncronas. Mas conseguiu gravar uma API pouco adequada permitidos meu aplicativo criar, consultar e atualizar dados no banco de dados.

Colunas mais recentes, trabalhei com funções do Azure, APIs de sem servidor da Microsoft que residem no Azure e integração perfeita com outras tecnologias do Azure. Um das integrações é com o Azure Cosmos DB, o armazenamento de dados no qual documentos do Azure à evolução.

Depois de gravar um número de funções do Azure, integrá-los com o banco de dados do Cosmos para ler e gravar dados, analisamos meu APIs Node.js mais antigos e realizar que pode eliminar a 98 por cento do código, convertendo-os em funções do Azure. Isso ocorre porque a maioria do código escrevi foi interagir com o banco de dados, mas agora funções do Azure cuidar de todo esse trabalho. Com nada mais que uma configuração para identificar a cadeia de caracteres de conexão, se os dados são provenientes do banco de dados ou inseridas — e a consulta relevante, os recursos internos da função cuidará do restante.

Usando extensões e o código do Visual Studio

As colunas anteriores de funções do Azure, eu trabalhei diretamente no portal do Azure. Mas também é possível usar as ferramentas de núcleo de funções do Azure para desenvolver em seu computador e, em seguida, implantar no Azure. A primeira versão das ferramentas (versão 1) é executado somente no Windows, com o .NET 4.7.1 ou superior, e há uma extensão de 2017 do Visual Studio para trabalhar com essas ferramentas.

Em contrapartida, versão 2 das ferramentas de núcleo de funções do Azure é executado no .NET Core e é entre plataformas, e uma extensão de código do Visual Studio permite que você trabalhe com ele facilmente (bit.ly/2H7VmxH). Essa é a versão que trabalhará com neste artigo. Observe que as ferramentas e a extensão no modo de visualização.

Trabalhar com essa extensão tem alguns requisitos de instalação, você encontrará o leia-Me para a extensão de código do Visual Studio. E supõe que você já tiver instalado o código do Visual Studio e seus pré-requisitos em seu sistema, que pode ser o Windows, macOS ou Linux.

A extensão ajuda você a criar facilmente novas pastas de aplicativo de função do Azure para conter funções do Azure, criar as funções (com uma variedade de modelos para sua escolha), executar e depurá-los localmente e implantá-los para o Azure. Ter sido realmente impressionado porque ele retira o trabalho pesado e tudo o que você precisa fazer é o foco no seu código, que é a promessa de computação sem servidor.

A extensão de funções do Azure, além de também instalei a extensão de banco de dados do Azure Cosmos para o código do Visual Studio (bit.ly/2HkPfDE). Estou usando que examinar as coleções e os documentos de meus bancos de dados existentes, mas você também pode usar a extensão para criar novas contas, bancos de dados e coleções, Cosmos banco de dados, bem como recuperar e atualizar os documentos e criar novos documentos. Eu tiver colocado em uma sugestão para poder importar documentos recebe arquivos JSON preexistentes e espera ver que lá algum dia.

Crítica usando essas duas extensões é a capacidade de entrar em sua conta do Azure do código do Visual Studio, para que eu instalei também a extensão de conta do Azure (bit.ly/2k1phdp).

Cada uma dessas extensões de três tem instruções passo a passo prática nas páginas de vinculados a, que ajudará você a começar a usá-los. Vou fazer uma apresentação leve para fins de mostrando como muito mais fácil de criar equivalentes a função do Azure minha API da Web Node. js que era compilar todos os códigos e as dependências que dependiam da solução Node. js. No entanto, ainda usarei JavaScript como o idioma para meu funções. Suporte a JavaScript e Node. js é incorporado ao código do Visual Studio.

Criando o projeto de funções do Azure

Depois de instalar as extensões de três e suas dependências, estava na hora de recriar o API. Comecei criando uma nova pasta no meu computador, denominado NinjaFunctions, em seguida, abri-lo no código do Visual Studio. Se você estiver acompanhando, comece usando a extensão de funções do Azure para transformar a pasta em uma pasta de funções do Azure. Você pode fazer isso clicando em criar novo projeto ícone (que se parece com uma pasta), na barra de ferramentas do painel de funções do Azure. Em seguida, siga os prompts para selecionar a pasta NinjaFunctions já aberta e o idioma. Estou escolhendo JavaScript. A extensão, em seguida, adicionar alguns arquivos necessários para as funções em sua pasta e inicializar um repositório Git. Figura 1 mostra o IDE com os resultados do processo na janela de saída de funções do Azure, bem como os arquivos (.vscode,. gitignore, host.json e local.settings.json), adicionado. Você também pode ver o painel de funções do Azure, listando todos os meus aplicativos de função do Azure baseado em nuvem e, abaixo, meus bancos de dados do banco de dados do Cosmos, graças a essa extensão.

Figura 1 código do Visual Studio depois de criar o novo projeto de funções do Azure

Criando uma função do Azure no projeto

Com o projeto foi configurado, é hora de criar a primeira função. Essa função importará arquivos JSON para meu banco de dados do banco de dados do Cosmos. Observe que a nova conta de banco de dados (lermandatapoints) já criado, mas ainda não tiver criado um banco de dados ou uma coleção. Farei isso usando a extensão de banco de dados do Azure Cosmos. No painel de extensão, clique com botão direito na conta de banco de dados do Cosmos onde você deseja criar o banco de dados e escolha Criar banco de dados no menu. Digite o novo nome quando solicitado (Meus, naturalmente, é Ninjas) e esse banco de dados será criado na sua conta do Azure usando as configurações padrão. Fique à vontade para ajustar essas configurações no portal, se necessário. Finalmente, crie uma coleção no banco de dados, clicando duas vezes o novo banco de dados, escolha Criar coleção e fornecendo o seu nome. Vou ser entediante e chamar minha coleção Ninjas, também. Você pode deixar em branco para esta demonstração pouco a chave de partição.

O objetivo da primeira função é ler um documento existente fornecido no formato JSON e adicioná-lo para a nova coleção.  Se você leu minha artigos de funções do Azure nessa coluna, você deve se lembrar que uma é chamada de "Criando Azure funções que pode ler do Cosmos DB com quase sem código" (msdn.com/magazine/mt829268). Nesse caso, eu criará uma função que pode gravar ao banco de dados do Cosmos com quase nenhum código.

Eu não criando um front-end. Em vez disso, usarei o aplicativo carteiro construir chamadas para meu APIs e passar o documento JSON como um corpo de mensagem. Você pode fazer o mesmo com o Fiddler, também.

Em Painel de extensão de funções do Azure, clique no ícone de Create Function para criar uma nova função na pasta do projeto. Desejo que essa função para responder às solicitações HTTP, então selecione o disparador HTTP e, em seguida, forneça um nome. Minha é AddNinjaDocument. As instruções a seguir torne a função anônima é mais fácil de testar sem ter que fornecer credenciais.

Em resposta a essa ação, a extensão cria uma nova pasta com três arquivos:

• function.json, que contém a configuração padrão para a função

• js arquivo para a lógica

• um arquivo de dados de exemplo

Configurando a função

Como a função criada na minha coluna janeiro de 2018, "Criando Azure funções para interagir com Cosmos DB" (msdn.com/magazine/mt814991), essa função dados de saída para um banco de dados do banco de dados do Cosmos. O artigo anterior, usei o portal para configurar essa integração e o portal escreveu minhas opções em um arquivo function.json. Neste momento, definirei a configuração manualmente no function.json. Abra o arquivo e você verá dois integrações já definidas, com base no fato de que o modelo de gatilho HTTP foi usado. Após a integração de segundo, adicione uma vírgula e copie nessa configuração cosmosDB, que especifica o nome do documento para enviar para o banco de dados, o tipo de integração (cosmosDB), os nomes de banco de dados e coleção, a configuração de conexão e a direção a integração (para o banco de dados de saída):

{
  "name": "outputDocument",
  "type": "cosmosDB",
  "databaseName": "Ninjas",
  "collectionName": "Ninjas",
  "createIfNotExists": true,
  "connectionStringSetting": "mydbconnection",    
  "direction": "out"
}

Posso definir a cadeia de caracteres de conexão no arquivo local.settings.json modo não preciso codificadas no arquivo function.json. Local.Settings.JSON é a representação local do arquivo app.settings.json que live no portal e contêm segredos seu aplicativo.

Portanto, aqui, isso apenas significa que a cadeia de caracteres de conexão pode ser encontrada em uma configuração chamada mydbconnection.

A configuração vai para a seção valores de local.settings.json. Você pode copiar a cadeia de caracteres de conexão clicando duas vezes a conta de banco de dados do Cosmos no painel de extensão de banco de dados do Cosmos e colá-la no arquivo json. A cadeia de caracteres começará com:

"mydbconnection":
"AccountEndpoint=https://yourdb.documents.azure.com/

Em um aprimoramento futuro para as ferramentas de núcleo de função do Azure, a presença do tipo cosmosDB no arquivo function.json irá disparar a extensão para instalar automaticamente um pacote com a lógica necessária para executar e depurar seu projeto localmente. Neste momento, no entanto, você precisará instalar esse pacote manualmente. Vamos fazer isso agora.

Na janela de terminal, certifique-se você está apontado para a pasta raiz, NinjaFunctions e digite o seguinte comando CLI de funções do Azure:

extensões de Func instalar -p Microsoft.Azure.WebJobs.Extensions.CosmosDb - v 3.0.0-beta7

Observe que estou instalando a versão beta atual como escrever este artigo. Você pode verificar sua página do NuGet para a versão mais recente, se você precisa instalá-lo manualmente (bit.ly/2EyLNCw). Isso criará uma nova pasta chamada extensões de funções em seu projeto (consulte Figura 2). A pasta contém um projeto do .NET 2.0 padrão, que é controlado pelo arquivo de projeto, extensions.csproj. A listagem de código csproj está em Figura 3.

Figura 2 as novas extensões de funções de pasta para a extensão do Cosmos DB

Figura 3 na pasta extensions.csproj com referências à extensão de banco de dados do Cosmos

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
      <WarningsAsErrors></WarningsAsErrors>
      <DefaultItemExcludes>**</DefaultItemExcludes>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.CosmosDb"                       Version="3.0.0-beta7" />
    <PackageReference       Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator"       Version="1.0.0-beta2" />
  </ItemGroup>
</Project>

Adicionando o pequeno trecho de código

Vamos voltar para a função AddNinjaDocuments. O arquivo function.json está configurado, portanto, a próxima etapa é completar o arquivo js, que é onde reside a lógica da função. Você pode excluir todo o código de exemplo do padrão. Tudo o que você realmente precisa para a função é código para associar o JSON de entrada a saída da função. em outras palavras, o que é enviado para a coleção de banco de dados do Cosmos:

module.exports = function (context, req) {
  context.bindings.outputDocument=req.body;
  context.done();
};

Mas é útil ter um pouco de informações de depuração. Portanto, em vez da versão minimalista pura, substitua todo o conteúdo do código de exemplo padrão com o seguinte:

module.exports = function (context, req) {   
  context.log('HTTP request received.');
  try {
    context.bindings.outputDocument = req.body;
  }
  catch (error) {
    context.log(error);
  }
  context.bindings.res = { status: 201, body: "Insert succeeded." };
  context.done();
};

O código JavaScript é muito diferente do código c# a função que escrevi nos artigos anteriores. Você pode aprender sobre a estrutura de JavaScript em funções do Azure em bit.ly/2GQ9eJt.

O contexto que está sendo passado para a função é usado pelo tempo de execução para passar dados dentro e fora de função. Chamei o banco de dados do Cosmos associação "outputDocument" na configuração function.json. Agora estou definindo essa associação para o corpo é encapsulado na solicitação HTTP de entrada. O modelo criado uma associação denominada res para a resposta HTTP, o que estou usando para o sucesso da função de retransmissão. O método context.done sinaliza para o tempo de execução que a função foi concluída.

Executando a função no código do Visual Studio

Portanto, isso é tudo que é necessário para a função! Tudo é atendido com as configurações do aplicativo, a configuração de função e APIs de funções do Azure. Você pode prosseguir e executar a função no código do Visual Studio. Embora seja possível absolutamente a depuração, defina pontos de interrupção e explorar variáveis, vamos, basta executar o aplicativo de função, que você pode fazer no terminal com o comando:

func start

Isso exibem o logotipo de funções do Azure intensamente colorido na janela do terminal e, em seguida, algumas informações de processamento de saída. O final de toda a essa saída, você verá a URL onde a função está sendo executado. Se houver várias funções em seu projeto, as URLs serão listadas separadamente para cada um. Carteiro ou o Fiddler, crie uma solicitação POST usando esta URL. No corpo da seção que você pode colar em JSON listados na Figura 4 e, em seguida, envie a solicitação. Figura 5 mostra minha carteiro da interface do usuário, com a URL de solicitação e corpo exibida, juntamente com a resposta.

Figura 4 código JSON para um documento a ser inserido no banco de dados

 

{
    "Name": "Kacy Catanzaro",
    "ServedInOniwaban": false,
    "Clan": "American Ninja Warriors",
    "Equipment": [
      {
        "EquipmentName": "Muscles",
        "EquipmentType": "Tool"
      },
      {
        "EquipmentName": "Spunk",
        "EquipmentType": "Tool"
      }
    ],
    "DateOfBirth": "1/14/1990"
  }

Figura 5 Criando uma solicitação para chamar a função AddNinjaDocuments

Verificando a inserção

Embora a resposta HTTP no Figura 5 dizer que todas as deu certo, é bom ver os dados que foi enviados para o banco de dados na nuvem. E graças a extensão de banco de dados do Azure Cosmos, você pode verificar se diretamente no código do Visual Studio. Primeiro, vamos Certifique-se de que o aplicativo de função para em execução. Na janela de terminal, pressione CTRL + C para desligar o host. Talvez seja necessário pressionar CTRL + C novamente para obter o aviso de volta no terminal.

Agora, na extensão do banco de dados do Cosmos, expanda a conta, o banco de dados e a coleção. Talvez seja necessário atualizar a exibição com o ícone de atualização no painel da extensão. Dentro da coleção, você pode ver o documento que acabou de ser adicionado. Selecionar que abri-lo no editor de onde você verá não apenas os dados que você adicionou, mas os metadados são adicionados ao banco de dados do Azure Cosmos, como mostrado na Figura 6.

Figura 6 o novo documento conforme exibido pela extensão do Cosmos DB

Próximas Etapas

O download que acompanha este artigo também inclui duas funções mais criado para substituir os outros métodos da API do Node. js original. Uma é para retornar dados filtrados por uma parte do nome e a outra para retornar dados com base na id. Com eles, em vez de ter associação de saída para o banco de dados do Cosmos, há uma associação de entrada que define a consulta de banco de dados usando a API de SQL. A resposta HTTP produz uma representação JSON dos resultados da consulta.

Depois que você tenha testado e depurado funções do Azure no código do Visual Studio, você também pode usar a extensão para publicar as funções em sua conta do Azure. Você pode aprender mais sobre isso do Leiame da extensão.

É recomendável fazer o download do meu artigo original, que também está em um repositório do GitHub em github.com/julielerman/AureliaDocDB examinar. A API está na pasta modelos e, como você verá, há muito mais código envolvidos com a criação de leitura e gravação de chamadas em documentos que para as funções do Azure, graças a sua integração com o banco de dados do Cosmos. Acho que meu codificar futuro, será sempre considere a funções do Azure como a primeira linha de defesa quando for hora de gravar outra API da Web!


Julie Lerman é Diretora Regional da Microsoft, MVP da Microsoft, coach e consultora de equipes de software e reside nas colinas de Vermont. Você pode encontrá-la em apresentações sobre acesso de dados ou sobre outros tópicos em grupos de usuários e conferências em todo o mundo. Ela escreve no blog thedatafarm.com/blog e é autora do “Programming Entity Framework”, bem como de uma edição do Code First e do DbContext, todos da O'Reilly Media. Siga-a no Twitter em @julielerman e confira seus cursos da Pluralsight em juliel.me/PS-Videos.