Despliegue - santig005/Distributed-Systems-gRPC GitHub Wiki
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
- Instancia de puerta de enlace de API: Ejecuta la aplicación de puerta de enlace de API de Spring Boot.
-
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).
- Instancia RabbitMQ: Aloja el broker de mensajes RabbitMQ.
- Grupos de Seguridad: Controlan el tráfico de red.
- 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.
- Crear un nuevo grupo de seguridad:**
-
Revisar y lanzar: Elija un par de claves existente o cree uno nuevo. Descargue el archivo
.pem
. -
Etiqueta: Nombre la instancia
api-gateway-instance
.
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) desdeapi-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
.
- 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
.
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
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
Igual que el servicio de pedidos. Sustituya order_service
por product_service
.
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 &
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 &
- 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.
- 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.
- Utilizar NLB/ALB para API Gateway.
- Usar ASGs para escalar microservicios.
- 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.