Despliegue - santig005/Distributed-Systems-gRPC GitHub Wiki

Despliegue de su proyecto en AWS

Esta guía proporciona un proceso detallado paso a paso para implementar su proyecto en AWS, alojando el API Gateway, los microservicios y RabbitMQ en instancias EC2 separadas.

Suposiciones

  • Tiene una cuenta de AWS y está familiarizado con la consola de administración de AWS.
  • Tiene conocimientos básicos de la interfaz de línea de comandos de Linux.
  • Ha configurado su CLI de AWS con las credenciales necesarias.
  • Ha elegido una región de AWS en la que desea realizar el despliegue.
  • Utilizará Ubuntu Server 20.04 LTS (o una distribución de Linux similar) para sus instancias EC2. Ajuste los comandos en consecuencia para otras distribuciones.
  • Utilizará Grupos de Seguridad para controlar el tráfico de red entre sus instancias.

Arquitectura de alto nivel

  1. Instancia de puerta de enlace de API: Ejecuta la aplicación de puerta de enlace de API de Spring Boot.
  2. Instancias de Microservicios:
    • Instancia de Servicio de Pedidos: Ejecuta el servicio de pedidos Node.js.
    • Instancia de Servicio de Producto: Ejecuta el servicio de producto Node.js.
    • Instancia de servicio de usuario: Ejecuta el servicio de usuario Go (probablemente usando gRPC).
  3. Instancia RabbitMQ: Aloja el broker de mensajes RabbitMQ.
  4. Grupos de Seguridad: Controlan el tráfico de red.

Paso 1: Lanzamiento de Instancias EC2

1.1. Lanzamiento de la instancia de API Gateway

  • Navegue hasta EC2 en la consola de administración de AWS.
  • Haga clic en «Launch Instance».
  • AMI: Elija una AMI Linux adecuada (por ejemplo, Ubuntu Server 20.04 LTS).
  • Tipo de Instancia: Seleccione un tipo de instancia apropiado (por ejemplo, t2.medium).
  • Configurar detalles de la instancia:
    • Red: Elija su VPC.
    • Subred: Elija una subred adecuada (pública o privada con NLB).
    • Auto-assign Public IP: Activar (para subred pública y acceso directo) o desactivar.
  • Añadir Almacenamiento: Configurar el tamaño del volumen raíz.
  • Configurar grupo de seguridad:
    • Crear un nuevo grupo de seguridad:** api-gateway-sg.
    • Reglas de entrada:
      • Tipo: HTTP, Rango de puertos: 80, Origen: 0.0.0.0/0
      • Tipo: HTTPS, Rango de puertos: 443, Fuente: 0.0.0.0/0 (opcional)
      • Tipo: SSH, Rango de Puertos: 22, Fuente: Su rango de direcciones IP
    • Reglas de salida: Permitir todo inicialmente.
  • Revisar y lanzar: Elija un par de claves existente o cree uno nuevo. Descargue el archivo .pem.
  • Etiqueta: Nombre la instancia api-gateway-instance.

1.2. Lanzamiento de las Instancias de Microservicios (Pedido, Producto, Usuario)

Repita el proceso de lanzamiento para cada microservicio:

  • AMI:** La misma AMI de Linux.
  • Tipo de Instancia: Elegir en función de la carga (por ejemplo, t2.small).
  • Configurar detalles de la instancia:
    • Red:** Misma VPC.
    • Subred: Se recomiendan subredes privadas.
    • Auto-assign Public IP: Desactivar.
  • Agregar almacenamiento: Configurar según sea necesario.
  • Configurar grupo de seguridad:**
    • order-service-sg: SSH (22 desde su IP), TCP personalizado (por ejemplo, 3001) desde api-gateway-sg.
    • servicio-producto-sg: SSH (22 desde su IP), TCP personalizado (por ejemplo, 3002) desde api-gateway-sg`.
    • user-service-sg: SSH (22 desde su IP), TCP personalizado (por ejemplo, 50051) desde api-gateway-sg`.
    • Salientes: Permitir todo inicialmente.
  • Revisar y lanzar: Usar el mismo par de claves.
  • Tag: order-service-instance, product-service-instance, user-service-instance.

1.3. Lanzamiento de la Instancia RabbitMQ

  • AMI:** La misma AMI de Linux.
  • Tipo de Instancia: Elegir en función del volumen de mensajes (por ejemplo, t2.small).
  • Configurar detalles de la instancia:
    • Red:** Misma VPC.
    • Subred:** Se recomienda una subred privada.
    • Auto-assign Public IP: Desactivar.
  • Agregar Almacenamiento: Configurar según sea necesario.
  • Configurar Grupo de Seguridad:**
    • rabbitmq-sg:
      • Entrante: SSH (22 desde tu IP).
      • Entrada: TCP personalizado (5672 - AMQP) desde todos los SG de servicio.
      • Entrada: HTTP (15672 - Management UI) desde fuentes restringidas.
    • Salientes: Permitir todo inicialmente.
  • Revisión y Lanzamiento: Usar el mismo par de claves.
  • Etiqueta: rabbitmq-instance.

Paso 2: Configurar la Instancia RabbitMQ

chmod 400 <su_clave-privada.pem>
ssh -i <su_clave-privada.pem> ubuntu@<public-ip-rabbitmq>
sudo apt update
sudo apt install -y rabbitmq-server
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl status rabbitmq-server

Habilitar el plugin de gestión:

sudo rabbitmq-plugins enable rabbitmq_management

Configure los usuarios (¡asegure esto!):

sudo rabbitmqctl add_user <tu_nombre_de_usuario> <tu_contraseña>
sudo rabbitmqctl set_user_tags <tu_nombre_de_usuario> administrator
sudo rabbitmqctl set_permissions -p / <nombre_usuario> «.*» «.*» «.*»
sudo rabbitmqctl delete_user invitado

Paso 3: Configurar las Instancias de Microservicios

3.1. Ordenar Servicio

chmod 400 <tu-clave-privada.pem>
ssh -i <su_clave-privada.pem> ubuntu@<public-ip-order-service>

Instala Node.js:

sudo apt update
sudo apt install -y nodejs npm

Transferir y configurar:

scp -r -i <su_clave-privada.pem> /ruta/a/tu/proyecto/microservicios/servicio-de-pedidos ubuntu@<servicio-de-pedidos-ip-publico>:/home/ubuntu/
cd /home/ubuntu/servicio_pedidos
npm install

Crear .env:

``bash nano .env


```env
RABBITMQ_HOST=<ip-privado-rabbitmq>
RABBITMQ_PORT=5672

Inicie el servicio:

``bash npm start


Usando `pm2`:

```bash
sudo npm install -g pm2
pm2 start server.js --name «order-service»
pm2 startup systemd
pm2 save

3.2. Servicio de productos

Igual que el servicio de pedidos. Sustituya order_service por product_service.

3.3. Servicio al usuario (Go)

chmod 400 <tu-clave-privada.pem>
ssh -i <su_clave-privada.pem> ubuntu@<public-ip-user-service>
sudo apt update
sudo apt install -y golang-go

Transferencia y configuración:

scp -r -i <su_clave-privada.pem> /ruta/a/tu/proyecto/microservicios/servicio-usuario ubuntu@<servicio-público-ip-usuario>:/home/ubuntu/
cd /home/ubuntu/servicio_usuario
ir mod tidy

Ejecuta el servicio:

go build -o servicio-usuario .
nohup ./servicio-usuario &

Paso 4: Configuración de la Instancia de Pasarela API

chmod 400 <su_clave-privada.pem>
ssh -i <su_clave-privada.pem> ubuntu@<public-ip-api-gateway>

Instalar Java y Maven:

sudo apt update
sudo apt install -y openjdk-11-jdk maven

Transferir y construir:

scp -r -i <su_clave-privada.pem> /ruta/a/tu/proyecto/api-gateway ubuntu@<public-ip-api-gateway>:/home/ubuntu/
cd /home/ubuntu/api-gateway

Configurar application.properties:

``propiedades server.port=8080 spring.rabbitmq.host= spring.rabbitmq.port=5672 spring.rabbitmq.username=su_nombre_de_usuario_rabbitmq spring.rabbitmq.password=su_contraseña_rabbitmq


Configura `GatewayConfig.java`:

```java
@Configuración
public class GatewayConfig {

    @Bean
    public OrderServiceClient orderServiceClient() {
        return new OrderServiceClient(«<private-ip-order-service>:<grpc-port>»);
    }

    @Bean
    public ProductServiceClient productServiceClient() {
        return new ProductServiceClient(«<private-ip-product-service>:<grpc-port>»);
    }

    @Bean
    public UserServiceClient userServiceClient() {
        return new UserServiceClient(«<private-ip-user-service>:<grpc-port>»);
    }
}

Construir y ejecutar:

./mvnw clean install
java -jar target/api-gateway-0.0.1-SNAPSHOT.jar &

O:

nohup java -jar target/api-gateway-0.0.1-SNAPSHOT.jar &

Paso 5: Comunicación entre servicios y RabbitMQ

  • Verifique que todas las IPs y puertos son correctos en .env, Java config, y Go code.
  • Asegúrese de que las credenciales de RabbitMQ coinciden en cada servicio.

Paso 6: Monitorización y Logging

  • Use CloudWatch para EC2 y los logs de la aplicación.
  • Usar RabbitMQ Management UI para monitorizar las colas.
  • Implementar comprobaciones de salud a nivel de aplicación.

Paso 7: Equilibrio de carga y escalado automático (opcional)

  • Utilizar NLB/ALB para API Gateway.
  • Usar ASGs para escalar microservicios.

Consideraciones Importantes

  • Seguridad: Utilizar grupos de seguridad, aislamiento VPC y credenciales encriptadas.
  • Automatización: Usar herramientas como Ansible o CI/CD pipelines.
  • Observabilidad: Añadir registros estructurados y métricas.
  • Fiabilidad: Implementar reintentos, interruptores automáticos y sondas de salud.

⚠️ **GitHub.com Fallback** ⚠️