Implementar aplicaciones Node.js en Google App Engine

    Introducci贸n

    TL; DR; En este art铆culo vamos a implementar una aplicaci贸n Node.js en Google App Engine y en el proceso veremos c贸mo se hace.

    Esta ser谩 una demostraci贸n paso a paso desde la configuraci贸n de nuestro entorno de Google App Engine hasta la implementaci贸n.

    n贸tese bien: Este tutorial requiere un conocimiento b谩sico de JavaScript, Node.js, MongoDB, NPM y Express.js.

    Puede obtener el c贸digo fuente de la aplicaci贸n terminada aqu铆.

    驴Qu茅 es Google App Engine?

    Google App Engine, una plataforma de computaci贸n en la nube (PaaS) lanzada por Google el 7 de abril de 2008, est谩 escrita en C ++, PHP, Node.js y Python.

    Google App Engine proporciona un entorno ideal para que los desarrolladores y las organizaciones alojen sus aplicaciones sin tener que pensar en la infraestructura, el tiempo de inactividad o la ampliaci贸n a mil millones de usuarios. Google App Engine proporciona todo esto y, en realidad, no debe preocuparse por el servidor, simplemente implemente y Google App Engine se encargar谩 de casi todo lo dem谩s. Google App Engine escalar谩 y asignar谩 autom谩ticamente m谩s recursos a su aplicaci贸n cuando las solicitudes y la demanda sean enormes.

    Google App Engine es un entorno de ejecuci贸n en la nube que le permite implementar y ejecutar f谩cilmente aplicaciones web est谩ndar. Proporciona las herramientas para monitorear, escalar y equilibrar la carga de la infraestructura, para que pueda concentrarse en crear sus aplicaciones web en lugar de los servidores que las ejecutan.

    Cree una instancia de Google App Engine (Instancia de 2.a generaci贸n)

    Para comenzar a usar Google App Engine, vamos a configurar un proyecto de Google Cloud Platform:

    • Registrarse a su cuenta de Google. Si a煤n no tiene uno, deber铆a Reg铆strate.
    • Ve a la App Engine sitio web
    • Puede parecer un di谩logo que exige el uso de la versi贸n de la aplicaci贸n de Google Cloud Console: “Usar la aplicaci贸n” o “Ahora no”. Depende de usted hacer su elecci贸n, pero preferiblemente, haga clic en “Ahora no” para continuar.
    • En la pantalla que aparece presentar谩 dos opciones: “Crear” o “Seleccionar”. Para este tutorial, estamos creando un nuevo proyecto, haga clic en el bot贸n “Crear”. Si super贸 el n煤mero m谩ximo de su cuota de proyectos de GCP, debe “Seleccionar” un proyecto.
    • Escribe el nombre de tu proyecto en el campo de texto “Nombre del proyecto”, debajo del campo de texto estar谩 tu ID de proyecto generado por GCP seg煤n el nombre de tu proyecto. haga clic en el bot贸n “Crear” cuando haya terminado.
    • Despu茅s de unos segundos, aparece una pantalla para “Seleccionar una ubicaci贸n”. En el widget desplegable “Seleccionar una regi贸n”, haga clic en 茅l para seleccionar su regi贸n preferida, luego haga clic en “Siguiente”.
    • La siguiente pantalla muestra “Habilitar facturaci贸n”. Haga clic en “Configurar facturaci贸n”.
    • Aparece un di谩logo modal, haga clic en “Crear cuenta de facturaci贸n”.
    • Escriba el nombre de su cuenta de facturaci贸n preferida en la siguiente ventana o puede ir con el nombre predeterminado.
    • Seleccione su pa铆s, USD ha sido seleccionado como moneda predeterminada, haga clic en el bot贸n “Confirmar”.
    • En la siguiente ventana, complete sus datos, tanto los datos personales como los de su cuenta bancaria
    • Haga clic en el bot贸n “Enviar y habilitar facturaci贸n”. Ahora, hemos creado un proyecto de Google Cloud con la facturaci贸n habilitada.

    隆Ya hemos terminado!

    Instalaci贸n de Google Cloud Tools (Cloud SDK)

    Las herramientas de Google Cloud son una bolsa llena de utilidades que son muy 煤tiles para configurar y acceder a los productos de Google Cloud: Google Kubernetes, Google App Engine, Google Big Query desde su terminal. Para comenzar a instalar el SDK de Cloud, vaya a SDK de Google Cloudy descargue el instalador del SDK para su sistema operativo.

    El SDK de Google Cloud contiene herramientas como gcloudy gsutil, pero usaremos el gcloud herramienta para inicializar e implementar nuestra aplicaci贸n.

    los gcloud La herramienta contiene varios comandos para permitir a los usuarios realizar diferentes acciones en un proyecto de Google Cloud:

    • informaci贸n de gcloud: Muestra informaci贸n sobre su SDK de Cloud, su sistema, el usuario que inici贸 sesi贸n y el proyecto actualmente activo.
    • lista de autenticaci贸n de gcloud: Muestra la lista de cuentas de Google activas en el SDK de Cloud.
    • gcloud init: inicializa un proyecto en la nube de Google.
    • ayuda de gcloud: Muestra los comandos disponibles en gcloud y su uso.
    • lista de configuraci贸n de gcloud Muestra la lista de gcloud configuraciones.

    Bien, hemos divagado un poco, volvamos a lo que tenemos entre manos, despu茅s de descargar el instalador del SDK de Cloud, inicie el instalador y siga las instrucciones, aseg煤rese de verificar las opciones relevantes presentadas. Una vez completada la instalaci贸n, el instalador iniciar谩 el comando gcloud init en una ventana de terminal.

    Este comando lo llevar谩 a trav茅s de una serie de configuraciones. Le presentar谩 una opci贸n para iniciar sesi贸n:

    You must log in to continue. Would you like to log in (Y/n)?
    

    Escriba “Y” y presione la tecla Enter. Lanzar谩 su navegador web predeterminado, donde seleccionar谩 su cuenta de Google preferida. Despu茅s de eso, se mostrar谩 en la lista de terminales de sus proyectos de Google:

    You are logged in as [YOUR_GOOGLE_ACCOUNT_EMAIL]:
    
    pick cloud project to use:
     [1] [YOUR_PROJECT_NAME]
     [2] Create a new project
    Please enter numeric choice or text value (must exactly match list item):
    

    n贸tese bien: gcloud seleccionar谩 autom谩ticamente, si solo tiene un proyecto.

    A continuaci贸n, se le solicita que elija una zona predeterminada de Compute Engine:

    Which Google Compute Engine zone would you like to use project default:
     [1] asia-east1-a
     ...
     [16] us-east1-b
     ...
     [25] Do not select default zone
    Please enter numeric choice or text value (must exactly match list item):
    

    Despu茅s de seleccionar su zona predeterminada, gcloud realiza una serie de comprobaciones e imprime:

    Your project default Compute Engine zone has been set to [YOUR_CHOICE_HERE]
    You can change it by running [gcloud config set compute/zone NAME]
    
    Your project default Compute Engine region has been set to [YOUR_CHOICE_HERE]
    You can change it by running [gcloud config set compute/region NAME]
    

    Su SDK de Google Cloud est谩 configurado y listo para usar.

    Configura nuestra aplicaci贸n Node.js

    Ahora, nuestro proyecto de Google Cloud se ha configurado. Configuremos nuestra aplicaci贸n Node.js. Vamos a crear una API RESTful para la pel铆cula Black Panther. Wooh !!! Esto ser谩 genial. El 16 de febrero de 2018, la primera pel铆cula de superh茅roes negros de Marvel se estren贸 en los cines de todo el mundo, obteniendo una enorme recaudaci贸n de $ 903 millones en taquilla, al momento de escribir este art铆culo, convirti茅ndola en la 45a pel铆cula m谩s taquillera de todos los tiempos y la pel铆cula m谩s taquillera. en 2018.

    Construyamos una API que devolver谩 los personajes de Black Panther.

    Punto final de API

    • Personaje – Este recurso trata sobre los personajes de Black Panther.
      • POST – / blackpanther / Crea una nueva instancia de Black Panther.
      • OBTENER – / blackpanthers / Devuelve todos los personajes de Black Panther.
      • OBTENER – / blackpanther /<id> Devuelve el ID de personaje de Black Panther especificado.
      • PUT – / blackpanther /<id> Actualiza los atributos de un personaje de Black Panther.
      • BORRAR – / blackpanther /<id> Elimina un personaje de Black Panther.

    Estructura del modelo de personaje de Black Panther

    {
        "alias": String,
        "occupation": String,
        "gender": String,
        "place_of_birth": String,
        "abilities": String,
        "played_by": String,
        "image_path": String
    }
    

    Cree puntos finales de API para la API de Black Panther

    Para comenzar, comencemos creando nuestra carpeta de proyecto, abra su terminal y ejecute el siguiente comando:

    $ mkdir _nodejs_gae
    

    Luego, mu茅vete a la carpeta:

    $ cd _nodejs_gae
    

    La aplicaci贸n Node.js se inicializa con la npm init mando. Ahora, estamos dentro de la carpeta de nuestro proyecto, ejecute el siguiente comando para crear una instancia de una aplicaci贸n Node.js:

    $ npm init -y
    

    Este comando crea una aplicaci贸n Node.js con sus credenciales preconfiguradas. A estas alturas, su carpeta se ver谩 as铆:

    |- _nodejs_gae
        |- package.json
    

    Para seguir las mejores pr谩cticas, vamos a dividir nuestra aplicaci贸n en controladores, modelos y rutas. S铆, s茅 que es excesivo para esta aplicaci贸n de demostraci贸n, pero siempre es bueno hacerlo bien.

    Vamos a crear nuestro index.js archivo (nuestro punto de entrada del servidor) – touch index.js

    Cree las siguientes carpetas:

    • mkdir routes
    • mkdir ctrls
    • mkdir models

    Ahora tenemos routes, ctrlsy models carpetas.

    • rutas: Contendr谩 todas las rutas definidas en nuestra API y llamar谩 a la funci贸n del controlador asignada a la solicitud HTTP correspondiente.
    • ctrls: Mantendr谩 la acci贸n para obtener los datos solicitados de los modelos.
    • modelos: Contendr谩 el modelo de base de datos de nuestra API.

    Vamos a tener una ruta, un modelo y un controlador asociado con nuestra API. Ejecute los siguientes comandos para crear los archivos:

    • touch routes/route.js
    • touch ctrls/ctrl.js
    • touch models/Character.js

    Nuestra estructura de carpetas deber铆a verse as铆 ahora:

    |- _nodejs_gae
        |- routes/
            |- route.js
        |- ctrls/
            |- ctrl.js
        |- models/
            |- Character.js
        |- index.js
        |- package.json
    

    OK, instalemos nuestras dependencias:

    • npm i express -S
    • npm i mongoose -S
    • npm i body-parser -S

    Ahora, abrimos nuestro Character.js y pega el siguiente c贸digo en 茅l:

    const mongoose = require('mongoose')
    
    let Character = new mongoose.Schema({
        alias: String,
        occupation: String,
        gender: String,
        place_of_birth: String,
        abilities: String,
        played_by: String,
        image_path: String
    })
    module.exports = mongoose.model('Character', Character)
    

    Aqu铆, declaramos nuestro esquema de modelo Character utilizando mongoose Clase de esquema. Nuestro modelo se export贸 para que podamos importar y usar el esquema en cualquier lugar de nuestra aplicaci贸n.

    Ok, agreguemos c贸digo a nuestro ctrl.js archivo:

    const Character = require('./../models/Character')
    
    module.exports = {
        getCharacter: (req, res, next) => {
            Character.findById(req.params.id, (err, Character) => {
                if (err)
                    res.send(err)
                else if (!Character)
                    res.send(404)
                else
                    res.send(Character)
                next()
            })
        },
        getAllCharacters: (req, res, next) => {
            Character.find((err, data) => {
                if (err) {
                    res.send(err)
                } else {
                    res.send(data)
                }
                next()
            })
        },
        deleteCharacter: (req, res, next) => {
            Character.findByIdAndRemove(req.params.id, (err) => {
                if (err)
                    res.send(err)
                else
                    res.sendStatus(204)
                next()
            })
        },
        addCharacter: (req, res, next) => {
            (new Character(req.body)).save((err, newCharacter) => {
                if (err)
                    res.send(err)
                else if (!newCharacter)
                    res.send(400)
                else
                    res.send(newCharacter)
                next()
            })
        },
        updateCharacter: (req, res, next) => {
            Character.findByIdAndUpdate(req.params.id, req.body, (err, updatedCharacter) => {
                if (err)
                    res.send(err)
                else if (!updatedCharacter)
                    res.send(400)
                else
                    res.send(req.body)
                next()
            })
        }
    }
    

    Aqu铆, declar贸 nuestro 4 CRUDy funciones: getCharacter, deleteCharacter, getAllCharacctersy updateCharacter. Como sus nombres implican, act煤an CREATE, READ, UPDATE y DELETE acciones en nuestra API de Black Panther.

    OK, abramos el route.js archivo y pegue el siguiente c贸digo en 茅l:

    const ctrl = require('./../ctrls/ctrl')
    
    module.exports = (router) => {
    
        /** get all Black Panther characters */
        router
            .route('/blackpanthers')
            .get(ctrl.getAllCharacters)
    
        /** save a Black Panther character */
        router
            .route('/blackpanther')
            .post(ctrl.addCharacter)
    
        /** get a Black Panther character */
        router
            .route('/blackpanther/:id')
            .get(ctrl.getCharacter)
    
        /** delete a Black Panther character */
        router
            .route('/blackpanther/:id')
            .delete(ctrl.deleteCharacter)
    
        /** update a Black Panther character */
        router
            .route('/blackpanther/:id')
            .put(ctrl.updateCharacter)
    }
    

    Arriba hemos definido dos rutas b谩sicas (/blackpanthery /blackpanther/:id) con diferentes m茅todos.

    Como podemos ver, requerimos el controlador para que cada uno de los m茅todos de rutas pueda llamar a su funci贸n de controlador respectiva.

    Finalmente, abrimos nuestro archivo index.js. Aqu铆, unimos los componentes en uno. Importamos la funci贸n de rutas que se nos expone en routes/route.jsy pasamos express.Router() como argumento a nuestro routes funci贸n. A continuaci贸n, nos conectamos a un MongoDB instancia y, a continuaci贸n, llame al app.listen() m茅todo para iniciar el servidor.

    const express = require('express')
    const mongoose = require('mongoose')
    const bodyParser = require('body-parser')
    
    const app = express()
    const router = express.Router()
    const routes = require('./routes/route')
    
    const url = process.env.MONGODB_URI || "mongodb://localhost:27017/blackpanther"
    
    mongoose.connect(url, {
        //useMongoClient: true
    })
    
    routes(router)
    app.use(bodyParser.json())
    app.use('/api/v1', router)
    
    const port = process.env.PORT || 1000
    
    app.listen(port, () => {
        console.log(`Black Panther API v1: ${port}`)
    })
    

    Agregue mLab Datastore a nuestros puntos finales de API

    Todo este tiempo hemos estado usando una instancia local del almac茅n de datos de MongoDB. Implementaremos y accederemos a nuestra aplicaci贸n en una infraestructura de computaci贸n en la nube, por lo que no habr谩 un almac茅n de datos local presente. Para conservar nuestros datos, elegiremos una plataforma de datos como servicio (DaaS), mLab.

    • Ir mLab
    • Cree una cuenta, si a煤n no tiene una
    • Vaya a su tablero, cree una nueva base de datos
    • Copie la URL de conexi贸n de la base de datos

    Ahora que tenemos nuestra cadena de URL de conexi贸n mLab, modificaremos index.js archivo:

    ...
    const url = process.env.MONGODB_URI || "mongodb://<DB_USER>:<DB_PASSWORD>@<MLAB_URL>.mlab.com:<MLAB_PORT>/<DB_NAME>"
    ...
    

    Pruebe nuestra aplicaci贸n localmente a trav茅s de cURL

    Para probar nuestra aplicaci贸n en nuestra m谩quina local. Ejecute el siguiente comando para iniciar el servidor:

    $ node .
    

    Mostrar谩 algo como esto en su terminal:

    $ node .
    Black Panther API v1: 1000
    

    Bien, ahora que nuestra API de Black Panther est谩 en funcionamiento, podemos usar cURL para probar las API. Aqu铆 publicaremos en la API para crear un nuevo personaje de Black Panther:

    curl --request POST 
      --url http://localhost:1000/api/v1/blackpanther 
      --header 'content-type: application/json' 
      --data '{"alias":"tchalla","occupation":"King of Wakanda","gender":"male","place_of_birth":"Wakanda","abilities":"enhanced strength","played_by":"Chadwick Boseman"}'
    

    Como tarea del lector, debe continuar y escribir rizo comandos para otros puntos finales de API tambi茅n.

    Implementa nuestra aplicaci贸n

    Ahora nuestro nodejs La aplicaci贸n est谩 lista para su implementaci贸n, pero antes de hacerlo, hay configuraciones que tenemos que modificar y agregar. Primero, vamos a crear un app.yaml archivo a nuestro proyecto.

    los app.yaml El archivo es una configuraci贸n de tiempo de ejecuci贸n para el entorno de App Engine. app.yaml nos permite configurar nuestro entorno de App Engine (ya sea Node.js, GO, PHP, Ruby, Python, .NET o Java Runtime) antes de la implementaci贸n.

    Con app.yaml archivo, podemos hacer lo siguiente:

    • Asignar recursos de disco y red
    • Seleccione el entorno flexible
    • Seleccione la cantidad de n煤cleos de CPU que se asignar谩n
    • Especifique el tama帽o de memory_gb (RAM)

    La lista es larga, puedes ir al recurso Configurando su aplicaci贸n con app.yaml para ver los ajustes de configuraci贸n completos seleccionados por Google.

    OK, creemos app.yaml archivo en nuestro proyecto:

    touch app.yaml
    

    Abre el app.yaml archivo y agregue el siguiente contenido:

    runtime: nodejs
    env: flex
    
    manual_scaling:
      instances: 1
    resources:
      cpu: 1
      memory_gb: 0.5
      disk_size_gb: 10
    

    Al observar la configuraci贸n anterior, le estamos diciendo a App Engine que nuestra aplicaci贸n se ejecutar谩 en el entorno de tiempo de ejecuci贸n de Node.js, tambi茅n el entorno debe configurarse como flexible.

    La ejecuci贸n en un entorno flexible genera costos, por lo que reducimos la escala para reducir los costos agregando:

    ...
    manual_scaling:
      instances: 1
    resources:
      cpu: 1
      memory_gb: 0.5
      disk_size_gb: 10
    

    Aqu铆, estamos especificando solo una instancia, un n煤cleo de CPU, 0.5G RAM y un tama帽o de disco de 10G.

    Esto es ideal para prop贸sitos de prueba y no para uso en producci贸n.

    A continuaci贸n, tenemos que agregar un start en el scripts secci贸n de nuestra package.json, esto lo usa el tiempo de ejecuci贸n de Node.js para iniciar nuestra aplicaci贸n cuando se implementa.

    Sin el start propiedad, el verificador de tiempo de ejecuci贸n de Node.js arrojar谩 el error “Error en la detecci贸n de la aplicaci贸n: Error: verificador de nodejs: no se encontr贸 el inicio en la secci贸n de scripts en el paquete.json ni server.js”

    Abramos el package.json y a帽adir start en el scripts llave:

    ...
        "scripts": {
            "start": "node .",
            "test": "echo "Error: no test specified" && exit 1"
        },
    ...
    

    Despu茅s de esto, ahora estamos listos para implementar. Para implementar nuestra aplicaci贸n, ejecute este comando:

    $ gcloud app deploy
    

    Probando nuestra aplicaci贸n implementada con cURL

    Para probar nuestra API de aplicaci贸n Node.js implementada, necesitaremos usar la URL de destino Google App Engine nos dio.

    curl --request POST 
      --url http://YOUR_TARGET_URL.appspot.com/api/v1/blackpanther 
      --header 'content-type: application/json' 
      --data '{"alias":"tchalla","occupation":"King of Wakanda","gender":"male","place_of_birth":"Wakanda","abilities":"enhanced strength","played_by":"Chadwick Boseman"}'
    

    Con rizo enviamos un POST solicitud y una carga 煤til de personaje de Black Panther en nuestra aplicaci贸n Node.js implementada, utilizando el URL de destino como el nuestro url par谩metro.

    Nuestro punto final de API ejecuta la funci贸n POST, guarda la carga 煤til en nuestro mLab base de datos y nos env铆a el resultado:

    {
        "alias":"tchalla",
        "occupation":"King of Wakanda",
        "gender":"male",
        "place_of_birth":"Wakanda",
        "abilities":"enhanced strength",
        "played_by":"Chadwick Boseman","_id":"5aa3a3905cd0a90010c3e1d9",
        "__v":0
    }
    

    隆Felicidades! Hemos implementado con 茅xito nuestra primera aplicaci贸n Node.js en Google App Engine.

    Conclusi贸n

    Hemos visto en este art铆culo lo f谩cil y sin estr茅s que Google App Engine hace de nuestras vidas. Adem谩s, c贸mo con solo unos pocos comandos configura un potente motor de tiempo de ejecuci贸n e implementa su aplicaci贸n en 茅l. No es necesario pensar en escalado, recursos, ancho de banda y el resto.

    App Engine piensa por ti.

    Para marcar las ventajas que nos ofrece Google App Engine:

    • Buen informe de errores
    • Simplifica la seguridad de la API
    • Fiabilidad y soporte
    • Cuotas de uso para aplicaciones gratuitas

    No dude en preguntar si tiene alguna pregunta o comentario en la secci贸n de comentarios.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *