¿Cómo crear un archivo para una base de datos remota?
Para empezar, es crucial crear un sistema que sea lo más genérico y reutilizable posible para poder conectar diferentes bases de datos a través de microservicios. Esto nos permitirá no exponer la base de datos directamente, manteniendo así la seguridad y modularidad del sistema.
¿Qué es un constructor de base de datos remotas?
La clave está en desarrollar un "constructor de base de datos remotas" que nos permita generar nuestra base de datos de manera remota y utilizarla con las mismas funciones, sin necesidad de modificar nuestro código continuamente. Este patrón es escalable y nos permite trabajar con múltiples bases de datos o microservicios.
¿Cómo configurar la base de datos remota?
Primero, debemos asegurarnos de que tenemos nuestra base de datos bien configurada y abierta para seguir trabajando con ella. Seguidamente:
Crear un archivo, por ejemplo, Remote.js, para gestionar la conexión remota.
Importar un módulo llamado request para simplificar las peticiones HTTP.
const request =require('request');
Definir la URL base que usaremos para hacer las peticiones HTTP al microservicio:
const baseURL =`${host}:${port}`;
¿Cómo implementar las funciones de acceso remoto?
Implementar funciones que manejen las operaciones comunes de la base de datos, como listar, agregar, modificar, y eliminar datos.
Finalmente, integrémoslo al componente de usuarios para verificar su correcto funcionamiento:
En el index del componente, importa y utiliza Remote.js:
const remote =require('./remote');// Verificar funcionalidad de listar usuariosremote.list('users').then(data=>console.log(data));
Ejecutar los servicios con nodemon para facilitar el desarrollo en ambos terminales:
nodemon mysql/index.js
nodemon api/index.js
¿Notas cómo la abstracción nos permite trabajar a nivel de API sin preocuparnos por detalles de implementación de base de datos? Este modelo no solo simplifica el manejo de bases de datos múltiples, sino que también mejora la escalabilidad y seguridad de tu aplicación al encapsular y aislar cada servicio individualmente.
Recuerda, la modularidad y reutilización son principios fundamentales cuando trabajamos en proyectos de software a gran escala. ¡Aprende, experimenta y sigue creciendo en el mundo del desarrollo!
Excelente, lo que quiere decir que nuestra API se convierte en cliente con respecto al server que sirve el servicio de nuestra BD.
La verdad creo que esta clase deberia añadir el hacer la comunicación con HTTP2 con gRPC o un message broker (Apache Kafka); que es la manera en que se maneja la comunicación entre microservicios en lo laboral
Sabes de algún curso o documento donde podamos seguir con esos temas luego de este curso ?
Si usamos typescript podemos definir una interfaz para la definición de métodos en los archivos dentro del store :)
Excelente clase muchas gracias a toda la gente de platzi !!
remote.js
const request =require('request');let urlRemote;functionreq(method, table, data =null){let url =`${urlRemote}/${table}`;let body ='';if(data && method ==='GET'){ url +=`/${id}`;}elseif(data){ body =JSON.stringify(data);}returnnewPromise((resolve, reject)=>{request({ url, method, body,headers:{'content-type':'application/json'}},(error, req, result)=>{if(error){console.error('Error en la base de datos', error);returnreject(error.message);}const res =JSON.parse(result);returnresolve(res.body);});});}functioninsert(table, data){returnreq('POST', table, data);}functionupdate(table, data){returnreq('PUT', table, data);}module.exports=classRemoteStore{constructor(host, port){ urlRemote =`http://${host}:${port}`}list(table){returnreq('GET', table);}get(table, id){returnreq('GET', table, id);}upsert(table, data){if(data.id){returnupdate(table, data);}returninsert(table, data);}}
muy buen aporte!
:thumbsup:
A que se refiere al final con "irían por ejemplo clusterizados"?
Esto quiere decir que lo que haces es montar mas de una instancia del mismo servicio. De tal forma que cada proceso es independiente del otro. Lo que te permite que en caso que alguno de estos procesos quede bloqueado otro de ellos entre a tomar su lugar para la proxima peticion.
Gracias Sergio!
Ok, sera necesario volverlo a ver
Ayuda, en el archivo remote-mysql porque se utiliza la palabra new para utilizar a remote?
Ni idea, a mi no me corre lo mejor es en lugar de crear una función, crear una clase, hacer unas pequeñas correcciones en las funciones internas (list, req) para adecuarlo a la clase además de la palabra reservada this utilizada en este caso para llamar una funcion dentro de la misma clase.
Porque la idea aqui es utilizar el remote como un constructor de bases de datos remotas, y cada BD remota sería una instancia de remote.
Hola, en la respuesta del json me la esta devolviendo de esta forma, alguien me puede ayudar por favor
Hola, ¿Cuál es la razón por la que has usado axios?, recientemente me di cuenta que request en npm esta marcado como obsoleto, ¿Es esta la razón de tu cambio?. Saludos
Hola Eric, utilizo axios porque se puede usar en node y en la web, también es muy fácil de usar y tiene una buena documentación, otra razón es porque puedes hacer cosas personalizadas como interceptar la petición o la respuesta para agregar o quitar cosas como datos, etc. Saludos
a ver en "resumidas" palabras está haciendo peticiones desde un microservicio hacía otro desde http, lo anterior también se puede hacer con axios, está chévere este mundillo de los microservicios 😁
Si tenemos multiples instancias de un micro servicio, como balanceamos las cargas de solicitudes de cada una de ellas?
Eso será responsabilidad del balanceador. Puede ser PM2, kubernetes, now... En cada caso, hay una forma de hacerlo. Más adelante, veremos un par de ellas 😉
Si es que tienen problemas con errores internos, vayan al código de error.js
en
response.error(req,res,err,status)
Pongan err para ver el tipo de error. Ahora después de aquello si tienen este error.
[error]: connect ECONNREFUSED127.0.0.1:80
Deben arrancar los dos servicios de api/index.js y el de mysql/index.js en 2 terminales.
✌
AYUDA cuando hago leer users en insomnia me devuelve
un 500 en en consola me da este error
[error]: connect ECONNREFUSED 127.0.0.1:80
error en la DB remota Error: connect ECONNREFUSED 127.0.0.1:80
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1134:16) {
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 80
Prueba primero corriendo el microservicio de la base de datos y después el servidor de la API, necesitas dos terminales.
A mi lo que me pasaba es que tenia mal construida la URL.
Tenia
'http://localhost/:3001/<table>'
en vez de
'http:://localhost:3001/<table>'
¿Cómo es que sucede la conexión y autorización hacia la base de datos? Esta parte me dejo confundido, pues se cambia el archivo y ya no estamos manejando la conexión desde el remote-mysql
la conexion de remote se realiza por http al otro servicio que si se conecta a la BD (autorizacion se realiza al llamar store/mysql.js)
para que me funcionara he tenido que poner el http para el host :
http://localhost
Que diferencia hay entre module.exports = new remote(...)
y = remote(...)
al ser una función y no una clase que afectaría el new?