ESTE Artigo Faz Parte Da Coleção de Conteúdos do #serverredseptEnt. AQUI VOCONTRARARARARARARARARARARARARARARARARARARARARARARAR DURANTE O MêSE DE SETEMBRO DE 2019.
Durante Esse Artigo Vovê Artrenderá A Realizar Migração de Uma Maneira Smors, Rápida E Dinâmica de Uma Appleação Среднее значение Para UMA Arquitutura Serverless, Fazendo Uso Do Azure Functions!
O Projeto означает Jáestá pronto e vocês podem fazer um git clone ou Скачать Aqui.
E, Caso desejam ver Палестра Собрей a assiveo mencionado bastam vídeo abaixo da palestra dada a a abaixo da palestra dada a a abaixo da 2019, onde eu falo mangamente sobre Azure Функции + Node.js + Arquitutura Serverless (Agradeço Imensame a Braziljs Pelo Convery EA Disponibilização do Vídeo):
YouTube:
Вамос Несса?!
Entendendo astrutura делает произведу
Nesse Projeto Vamos Foar Nas Duas Pastass: API е спереди Отказ Conforme Image Abaixo:
SE VOCêS EXPUTAREM ESSA Applicação Survearão que astamos Persistido Essa Applicação No MongoDB E USANDO O Best-End, Que Nesse Caso Estamos Usando O Node.js
ОС Дадес Персистидос содержит их:
CLASSE: Funcionario
- idfuncionario: (номер – GUID GERADO PELO MONGODB)
- Nomefuncionario: нить
- Груз: нить
- Numero WeldeDador: номер
Caso Desejam Executar Localmente Esseje Projeto, Bastam Seguir OS Passos No Readme.md Do Repositório Do Projeto.
BOM, AGORA QUE VOCêS ESTãO COM O PROJETO означает EM MãOS, VAMOS CATHAR A Fazer Migração Para o Azure Functions?!
MAS ANTES, Vamos Entender O Que Seria O Azure Ozure!
O que é lazure функции?! ⚡️.
Функции Azure EM UM Serviço de Computação Serverless Que Premious Executar o Facilmente Pequenos Trechos de Código Ou Funções a nuvem Sobre Sense SEM Precisar Provisionar OU Gerenciar Infraestrutura.
E o Azure Functions Возможны Уискание inúmeras linguagens, Entre Elas:
Já as linguagens abaixo, Jásui Suporte, Porém Estão Na Sua Versão Предварительный просмотр:
- Башмак
- Выступ
Se desejarem saber mais detahales das linguagens que posuem suporte Ao Azure Функции, Bastam Acessar O Link Акхи Отказ
Porém, Para Esse Artigo Focarmos Нет JavaScript! 😉
Шаблоны важны без функций Azure
Antes de Cateçar A Realizar Migração E Geate Mencionar Que o Функции Azure Шаблоны Dispõe de inúmeros JA PRONTOS E PORTORADOS SO PARA COTACHAR Серма Усадос. Entre Eles:
- Httptrigger.
- Таймерс
- COSMOSDBTRIGER
- Blobtrigger.
- Квесуэтригер
- Eventgridtrigger.
- EventHubtrigger
- Servicebusqueuetrigger
- Servicebustopictrigger.
NãA Entrarei EM DetaLes de Cada Um, Pois Senão Esse Artigo FiCará Muito Grande. MAS, CASO DESEJAM ENTEDER MAIS SOBRE CADA CADE TOMAL E SEU MELHOR USO NUMA DETRANINADA Applação, Recomendo a Leitura Na Documentação Акхи Отказ
Para Esse Post, Estaremos Fazendo Uso Do Template: Httptrigger. UMA VEZ Que Esse Template Dispara A Execução Do Seu Código Usando Uma Solicitação http. E É Justamente O Que Precisaremos Para Realizar Migração!
Caso Vovê Seja UM (A) Estudante de Alguma Instituição de Ensino de Faculdade OU Universidade, Poderá Crar Sua Conta нет Azure для студентов Отказ Essa Conta Te Dará O Beansício Em Возможна Crédito de USD 100,00 Para Usar Os Serviços de Maneira Gratuita, SEM EURUMEDADE DE ОТУССУР ХМАРТ КАРТИО ДЕ КРЕДИТ. Para Ativar Essa Conta, Bastam Acessar O Link Ao Lado: Акхи Отказ Com Essa Conta, Vovê Poderá Fazer Uso de 1.000.000 Solicitações Gratuitas Por Mês Para Processar Eventos Нет функций Azure!
BOM, DEPOIS DESSE Обзор Собрей Azure Функции, PodeMos Enfim Começar A Nossa Migração! Vamos Que Vamos!
Instalando O Pacote Azure Functions Основные инструменты
O Функции Azure Основные инструменты NoS Permitirá desenvolver e Testar As Funções de Maneira Местные Na Nossa Máquina Tire Dum Tminal OU Подсказка De Comando.
Abaixo Seguem OS Programs E O Pacote Que Precisaremos Para Contruar No Nosso Учебное пособие:
DEPOIS Que Vovê Tiver O Node.js Instalado Na Sua Máquina, Basta Digitar O Seguinte Comando:
- Окна
npm install -g azure-functions-core-tools
- Macos
brew tap azure/functions brew install azure-functions-core-tools
- Linux (Ubuntu/Debian) COM APT
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
Para Maiores Informações Para Instalar de Maneira Correta O AZURE Функции Основные инструменты, Bastam Acessar O Link Aqui.
E COMO VOU SABER SE DE FATO O MEU AZURE Функции Основные инструменты Está Instalado de Maneira Correta Na Minha Máquina?! Bastam Digitar O Seguinte Comando Нет терминала:
> func
SE ACONTECER CONFORME O GIF ABAIXO é Porce O Pacote Foi Instalado Com Sucesso!
Ótimo. Агора, подемос Кребер, как нозас Funções. Para Isso, Crie Um Pasta Modern Na Sua Máquina E Vamos Cateçar!
Криандо Ума Нова Applicação Нет функций Azure
Agora Que Já Temos Instalado O Pacote, Vamos Crar Uma Nova Applicação. Para Isso, Бастам Seguir o Passos Conforme O GIF Abaixo:
Обсуждение Que, QUANDO ABRIMOS O Visual Studio Code, Precisamos Clicar No Botão Да que aparece нет canto неполноценный dirato para habilitar alguns Arquivos важно не произвел.
Криандо Conexão COM O Монгодб
BOM, Vamos Fazer Agora Algumas Alterações Burnias No Nosso Projeto Recém Criado. Para Isso, Vamos Instalar Localmente O Монгодб Нет Nosso Projeto. Digitem o Seguinte Comando:
> npm install mongodb
AO Instalar O Mongodb Нет Projeto, наблюмем que houve alterações no arquivo Package.json. . Нет окончательного o Arquivo Deverá FiCar Da Seguinte Maneira:
- Arquivo: Package.json.
{
"name": "crud-serverless-mongodb",
"version": "1.0.0",
"description": "Projeto azure functions com persistencia com o mongoDb",
"scripts": {
"test": "echo \"No tests yet...\""
},
"author": "",
"dependencies": {
"mongodb": "^3.3.2"
}
}
Агора, Вамос Кребер Ума Макамада: поделился E Doctro Dela Vamos Cril o Arquivo: Mongo.js Отказ Эстратура делает Projeto Agora Ficará Д.А. Сегинте Манера:
Vamos Agora alterar o Arquivo Mongo.js Отказ Para Isso, inclua o bloco de código abaixo:
- Arquivo: Shared/mongo.js
/**
* Arquivo: mongo.js
* Data: 10/11/2019
* Descrição: arquivo responsável por tratar a conexão da Base de Dados localmente
* Author: Glaucia Lemos
*/
const { MongoClient } = require("mongodb");
const config = {
url: "mongodb://localhost:27017/crud-serverless-mongodb",
dbName: "crud-serverless-mongodb"
};
async function createConnection() {
const connection = await MongoClient.connect(config.url, {
useNewUrlParser: true
});
const db = connection.db(config.dbName);
return {
connection,
db
};
}
module.exports = createConnection;
Aqui Estamos Criando Nossa Conexão Local Com O MongoDB! Muito Parecido COM O Que Já fazemos Нет Back-End Com O Node.js, Não Mesmo?!
E Vamos Também alterar o Arquivo local.settings.json Отказ Esse Arquivo é Responsevel Por ‘Grawsar’ Todas в качестве ключей Que Não Queremos Que Estejam Expostas Na Hora de Realizar o. Notem Que Esse Arquivo Está Na Lista de Arquivos нет .gitignore. .
Аврам О Аркиво local.settings.json E Façam как Seguintes Alterações:
- Arquivo: local.settings.json.
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "node",
"AzureWebJobsStorage": "{AzureWebJobsStorage}"
},
"Host": {
"LocalHttpPort": 7071,
"CORS": "*"
}
}
Notem Нет Bloco de Código Acima Que Já Estamos Habilitando O Рост . POIS SEM ELE, NãO Conseguimos Realizar As Operações de Crud без фронта! SE Desejarem entender rum pouco mais sobre or cors recomendo leitura Акхи Отказ
BOM, PAMEIRA PARTE JAESTA PRONTA! Agora Vamos Crar O Nosso Crud Нет функций Azure!
Criando Bunção ‘Createfuncionario’
Para Crar Uma Nova Função Bastam Digitar O Seguinte Comando:
func new
Ao Digitar Esse Comando Elea Dará Várias Opções de Шаблоны Que o Azure Functions Nos Disponibiliza. No nosso caso, conforme já mencionado acima, vamos escolher o Шаблон: Httptrigger. . Sigam OS Passos Делай GIF Abaixo:
Облюдание в очередь, фои Criado Uma Pasta Createfuncionario E DOI ARQUIVOS:
function.json : AQUI IREMOS DEFIR, как ROTAS E OS MÉTODOS DO NOSSO EndPoint.
index.json. : Aqui Iremos desenvolver a Lógica inerente Ao конечная точка.
Vamos Cateçar Альтерразрядки Arquivos. Começando Pelo функция .json.json
- Arquivo: Createfuncionario/function.json.
{
"bindings": [{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["post"],
"route": "funcionarios"
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
Agora Vamos alterar o Arquivo index.js :
- Arquivo: Createfuncionario/index.js.
/**
* Arquivo: CreateFuncionario/index.js
* Data: 10/11/2019
* Descrição: arquivo responsável por criar um novo 'Funcionário'
* Author: Glaucia Lemos
*/
const createMongoClient = require('../shared/mongo')
module.exports = async function (context, req) {
const funcionario = req.body || {}
if (funcionario) {
context.res = {
status: 400,
body: 'Os dados do(a) Funcionário(a) é obrigatório!'
}
}
const { db, connection } = await createMongoClient()
const Funcionarios = db.collection('funcionarios')
try {
const funcionarios = await Funcionarios.insert(funcionario)
connection.close()
context.res = {
status: 201,
body: funcionarios.ops[0]
}
} catch (error) {
context.res = {
status: 500,
body: 'Error ao criar um novo Funcionário(a)'
}
}
}
Aqui Estamos Praticamente Firedindo Rota DO Пост E Desenvolvendo Lógica do КРИАР Бм Ново Функциониорио Отказ
Вамос Executar Esse конечная точка?! Para Executar. , Бастам Дигитар О Seguinte Comando:
> func host start
E ELE IRA LISTAR O NOSSO ENDPOINT CRIADO! Vejam No Gif:
ELE LISTA PARA Nós o Seguinte Конечная точка: [Post] http://localhost: 7071/API/Funcionario
Порта 7071 é Портативный по умолчанию делает функции Azure. E É Justamente ELA QUE IREMOS PRECAR PARA COLOCAR NO NOSSO Front-End!
BOM, Vamos Agora Pegar Essa Rota E AdiCionar Нет интерфейса! Para Isso, Precisamos Realizar Algumas Alterações Нет Projeto Спереди Отказ Vão Até Pasta фронт Эм: Фронт -> SRC -> Приложение -> Funcionario.service.ts E ALTEREM O. Seguinte Arquivo funcionario.service.ts.
- Arquivo: Funcionario.service.ts.
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class FuncionarioService {
// ==> Uri da api (Back-End)
uri = 'http://localhost:7071/api';
constructor(private http: HttpClient) { }
(...)
SO Precisamos alterar A URI DefiDiDa Нет сервиса не угловых.
Nesse Momento, Precisaremos Executar O Mongo Compass E o. Обмен No Gif Como Persistirá o Novo Funcionário E Que Não Precisaremos Mais Da Pasta API Сделай договор!
(Клика na image abaixo para visisionizar o gif)
Персистиу Леди! 😍
Agora, Vamos Fazer O Lessar!
Крианердо бегунка ‘GetFuncionarios’
É Mesma Premissa Que Foi Feita Acima, Vamos Crar uma Nova Função Com O Comando: Func New Domear a Função de Getfuncionarios E ALTERAR OS ARQUIVOS: function.json е index.js.
(Клика na image abaixo para visisionizar o gif)
- Getfuncionarios/function.json.
{
"bindings": [{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["get"],
"route": "funcionarios"
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
- Getfuncionarios/index.js.
/**
* Arquivo: GetFuncionarios/index.js
* Data: 10/11/2019
* Descrição: arquivo responsável por listar todos os 'Funcionários'
* Author: Glaucia Lemos
*/
const createMongoClient = require('../shared/mongo')
module.exports = async context => {
const { db, connection } = await createMongoClient()
const Funcionarios = db.collection('funcionarios')
const res = await Funcionarios.find({})
const body = await res.toArray()
connection.close()
context.res = {
status: 200,
body
}
}
Vamos Testar Novamente! Vejam Novamente o Gif Abaixo!
Novamente Está Funcionando Perfeiteamente. Já Survearam Que É Fácil Crar Um Crud Com O Azure Functions, Não é Mesmo?! Агора é só seguir os mesmos passos para criar как próximas funções!
Criando a Função ‘GetFuncionariobyId
Agora Que Já ficou Muito Claro Ados Aqui Como é Fácil Crar Crud Como O Azure Crud Com O Azure Crud Com O Azure, Vou Carizar A Acelerar O Processo de Criação E SO Unitear O Que Foi Alteralado Nos Arquivos function.json е index.js.
- Getfuncionariobyid/index.js.
{
"bindings": [{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["get"],
"route": "funcionarios/{id}"
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
- Getfuncionariobyid/function.json.
// @ts-nocheck
/**
* Arquivo: GetFuncionarioById/index.js
* Data: 10/11/2019
* Descrição: arquivo responsável por listar Funcionário pelo Id
* Author: Glaucia Lemos
*/
const { ObjectID } = require('mongodb')
const createMongoClient = require('../shared/mongo')
module.exports = async function (context, req) {
const { id } = req.params
if (!id) {
context.res = {
status: 400,
body: 'Por favor, passe o número correto do Id do Funcionário!'
}
return
}
const { db, connection } = await createMongoClient()
const Funcionarios = db.collection('funcionarios')
try {
const body = await Funcionarios.findOne({ _id: ObjectID(id) })
connection.close()
context.res = {
status: 200,
body
}
} catch (error) {
context.res = {
status: 500,
body: 'Erro ao listar o Funcionário pelo Id.'
}
}
}
NãO Vamos Testar Agora. Vamos desenvolver как duas últimas funções: Обновление е Удалить Отказ
Criando a Função: «UpdateFuncionario»
Novamente, Vamos Crar Uma Nova Função E alterar Os Arquivos function.json е index.js :
- Updatefuncionario/index.js.
{
"bindings": [{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["put"],
"route": "funcionarios/{id}"
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
- Updatefuncionario/index.js.
// @ts-nocheck
/**
* Arquivo: UpdateFuncionario/index.js
* Data: 10/11/2019
* Descrição: arquivo responsável por atualizar 'Funcionário' por Id
* Author: Glaucia Lemos
*/
const { ObjectID } = require('mongodb')
const createMongoClient = require('../shared/mongo')
module.exports = async function (context, req) {
const { id } = req.params
const funcionario = req.body || {}
if (!id || !funcionario) {
context.res = {
status: 400,
body: 'Os campos são obrigatórios'
}
return
}
const { db, connection } = await createMongoClient()
const Funcionarios = db.collection('funcionarios')
try {
const funcionarios = await Funcionarios.findOneAndUpdate(
{ _id: ObjectID(id) },
{ set: funcionario }
)
connection.close()
context.res = {
status: 200,
body: funcionarios
}
} catch (error) {
context.res = {
status: 500,
body: 'Erro ao atualizar o Funcionário'
}
}
}
Показывать! Agora vamos desenvolver a nossa última função: Удалить Действительно
Criando a Função: «Deletefuncionario»
Novamente, Бастам К.ruar Uma Nova Função, Escolher a Opção: Httptrigger Domear a Função de Deletefuncionario E ALTERAR OS ARQUIVOS function.json е index.js. :
- Deletefuncionario/function.json.
{
"bindings": [{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["delete"],
"route": "funcionarios/{id}"
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
- Deletefuncionario/index.js.
// @ts-nocheck
/**
* Arquivo: DeleteFuncionario/index.js
* Data: 10/11/2019
* Descrição: arquivo responsável excluir um 'Funcionário' pelo Id
* Author: Glaucia Lemos
*/
const { ObjectID } = require('mongodb')
const createMongoClient = require('../shared/mongo')
module.exports = async function (context, req) {
const { id } = req.params
if (!id) {
context.res = {
status: 400,
body: 'Os campos são obrigatórios!'
}
return
}
const { db, connection } = await createMongoClient()
const Funcionarios = db.collection('funcionarios')
try {
await Funcionarios.findOneAndDelete({ _id: ObjectID(id) })
connection.close()
context.res = {
status: 204,
body: 'Funcionário excluído com sucesso!'
}
} catch (error) {
context.res = {
status: 500,
body: 'Erro ao excluir Funcionário' + id
}
}
}
ESTA PRONTO O NOSSO CRUD! Вамос Testar ToDos OS Конечные точки?! Vejam o gif abaixo!
(Клика na image abaixo para visisionizar o gif)
CoiSa Mais Linda, Não É Mesmo?! Notem Mais Uma Vez Que, Aquela Pasta API. Onde Há inúmeros Arquivos, Não Terá Mais Windidade! PodeMos Praticamente Dealetar Aquela Pasta Inteira !!!
ToDo O Código Fonte Desenvolvido Estão Aqui:
Палавры Финаис
Hoje Armendemos A Realizar Migração de UMA Applicação Среднее значение Para o Azure Functions, Porém Persistindo Esses Msses Dados Localmente E Executando Essas Funções Localmente. E SE Porventura Precisarmos Hospedar Essa Applicação Na Nuvem? E O Nosso Back-End Como Ficaria?
Нет Proximo Post, Estarei Exprickando A Como Realizar Migração сделать монгодб пункт о COSMOSDB E COMO REVALIZAR O Развертывание DESSAS Funções Usando UMA Extensão Do Azure Tools No Próprio Visual Studio Code.
SE VOCêS DESEJAM SABER MAIS DECALHES SOBRE AZURE Функции Recomendo Ados Vockos OS Seguintes Cursos Toventmente GratuitoS de Serverless & Azure Functions E Alguns Automos Recursos Ваневы:
✅ Cursos Grátis – функции Azure
✅ Azure Para Devs JavaScript и Node.js
✅ Криандо Sua Primeira Função Нет Visual Studio Code
✅ Extensão VS код – Функции Azure
✅ Электронная книга Grátis – Azure Serverless вычислительная кулинарная книга
E, Para Ficarem Por Doctro Das últimas Atualizações Não Deixem De Me Seguir No Twitter! 😃
Até Próxima Pessoal! ❤️ ❤️ ❤️
Оригинал: “https://dev.to/azure/migrando-uma-aplicacao-mean-para-arquitetura-serverless-azure-functions-1dp7”