Luis Enrique Camaños Rebollo
Esta WebApp es un proyecto que permite a los usuarios de esta aplicación a consultar el clima en una determinada ciudad, tomando dos elementos en cuenta, el nombre de la ciudad y el idioma de la respuesta.
Los elementos que comprenden esta aplicación son los siguientes:
- Frontend
- Ofrece una interfaz de usuario sencilla, en la que se puede ingresar el nombre de la ciudad, el idioma y se puede visualizar el historial de consultas que se han hecho
- Desarrollado en HTML, CSS y JS
- Mediante el fetch hace peticiones al servidor
- Muestra el resultado en un formato agradable y actualiza el historial de consultas al instante
- Backend
- Se utilizó Go como lenguaje principal, con las librerías net/http y gorilla/mux para el enrutamiento
- POST /api/weather: recibe la ciudad y el idioma, consulta API externa de clima, guarda consulta y responde con la información solicitada
- GET /api/weather/history: devuelve el historial de las consultas registradas en la base de datos
- API Externa
- Se utilizó la API https://www.weatherapi.com, de la cual se obtiene la información requerida, se hace un parseo de la respuesta y se almacena en estructuras definidas
- Base de datos
- Utiliza MariaDB para almacenar los datos
- La tabla principal se llama weather_queries con los siguientes elementos:
- id: identificador autoincremental
- city: ciudad de la consulta
- temperature: temperatura registrada en la ciudad
- description: condición climática
- queried_at: timestamp de la petición
- ip_address: dirección ip del usuario
- Despliegue
- Se utilizó el servicio de EC2 AWS y se aprovisionó una instancia t2.micro con un Ubuntu Linux
- weather_app
- cmd
- main.go: orquestador
- config
- config.go: carga de parámetros
- .env
- internal
- api
- handlers.go: funciones que manejan las rutas HTTP
- helpers.go: funciones auxiliares
- routes.go: rutas para el frontend
- db
- db.go: paquete para interactuar con db real
- mockdb
- mockdb.go: simulador de interacción con db
- models
- models.go: estructuras definidas
- weather
- weather.go: consultas a API externa
- api
- web
- app.js
- index.html
- styles.css
- cmd
-
Descomprime el archivo .zip y mueve la carpeta al directorio home
-
Instala los recursos necesarios para la correr la aplicación
- Go
sudo apt update sudo apt install golang-go -y go version
- Mariadb
sudo apt update sudo apt install mariadb-server mariadb-client -y sudo systemctl start mariadb sudo systemctl enable mariadb- Si no has configurado una contraseña, puedes entrar con:
sudo mysql
-
Crea un nuevo usuario con las siguientes características
- Nombre: weatheruser
- Contraseña: safeinthebox
CREATE USER 'weatheruser'@'%' IDENTIFIED BY 'safeinthebox'; GRANT ALL PRIVILEGES ON weatherdb.* TO 'weatheruser'@'%'; FLUSH PRIVILEGES;
-
Crea la tabla que almacenará los datos
CREATE DATABASE weatherdb;
- Ejecuta el comando para asignar los valores correspondientes
USE weatherdb; CREATE TABLE IF NOT EXISTS weather_queries ( id INT AUTO_INCREMENT PRIMARY KEY, city VARCHAR(255) NOT NULL, temperature FLOAT NOT NULL, description VARCHAR(255) NOT NULL, queried_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ip_address VARCHAR(45) );
-
Revisa que las variables guardadas en el archivo .env son las correctas
WEATHER_API_KEY=""
WEATHER_BASE_URL="http://api.weatherapi.com/v1"
PORT="8080"
DB_USER="weatheruser"
DB_PASS="safeinthebox"
DB_HOST="localhost"
DB_NAME="weatherdb"- Entra al archivo main.go y cambia la dirección del archivo .env si es el caso
func initEnv(){
err := godotenv.Load("/home/ubuntu/weather_app/config/.env")
if err != nil{
log.Println("weather_app - config: ",err)
}
}- Compila el archivo dentro del directorio weather_app con el siguiente comando
go build -o weatherapp ./cmd/main.go- Para disponibilizar la aplicación y que sea persistente, mueve el archivo weatherapp.service a la carpeta donde se almacenan los demonios de Linux con el siguiente comando
sudo mv weatherapp.service /etc/systemd/system- Inicializa el servicio con los siguientes comandos
sudo systemctl daemon-reload
sudo systemclt enable weatherapp.service
sudo systemctl start weatherapp.service- Verifica el estado del servicio ejecutando
sudo systemctl status weatherapp.service- Consulta los logs de la Web app con el siguiente comando
journalctl --unit weatherapp.service -f- Verifica que la app esté corriendo visitando la dirección donde se disponibilizó la app
- Verifica que se estén guardando las peticiones accediendo a mariadb
mysql -u weatheruser -p weatherdbSELECT * FROM weather_queries;Para escalar esta webapp y soportar un mayor volumen de usuarios se recomienda lo siguiente:
- Robustecimiento de infraestructura: Implementación de una VPC personalizada para la EC2 con el objetivo de aislar y proteger la red interna de la EC2
- Balanceo de carga: configuración de un LoadBalancer para repartir peticiones entre múltiples instancias de la aplicación, de esta forma se mejorará la disponibilidad y se reducirán los cuellos de botella
- Escalado automático: implementar la configuración de Auto Scaling para aumentar o disminuir instancias de acuerdo a la demanda de tráfico del sitio
- HTTPS: implementar https en los headers para mayor seguridad
- Replicación de base de datos: implementar replicas de lectura de la base de datos en caso de consultas masivas y que no dependan de un solo nodo



