Cómo compilar una aplicación para dispositivos móviles con Google Compute Engine y REST.

Ejecutar el backend para dispositivos móviles en Compute Engine y usar REST como el protocolo de comunicación entre la aplicación para dispositivos móviles y el servidor de backend tiene muchas ventajas:

  • Es la forma más rápida de mover un servicio existente, que se ejecuta en una máquina local o virtual, a Google Cloud Platform (GCP).
  • Ofrece control total de la máquina virtual y la configuración del servidor.
  • Puedes usar bibliotecas de terceros.
  • Puedes configurar un escalador automático para escalar la cantidad de máquinas virtuales a fin de satisfacer la demanda.

La desventaja de ejecutar el servicio en Compute Engine es que deberás mantener y actualizar el servidor.

En este instructivo, se explica cómo compilar una aplicación para dispositivos móviles de ejemplo llamada Stickynotes. Esta aplicación de ejemplo usa REST para conectarse a un servicio de backend que se ejecuta en Compute Engine.

La aplicación de ejemplo, Stickynotes, incluye un código de una aplicación para dispositivos móviles de frontend y servicio de backend, que trabajan juntos en el siguiente flujo de trabajo:

  1. La aplicación para dispositivos móviles te permite ingresar un mensaje en un campo de texto.
  2. La aplicación envía tu mensaje a un extremo de REST en el servicio de backend.
  3. El servicio de backend crea una imagen que contiene el mensaje de texto mediante la biblioteca draw2d.
  4. El servicio de backend le muestra la imagen a la aplicación para dispositivos móviles.
  5. La aplicación para dispositivos móviles muestra la imagen con tu mensaje incorporado.

La aplicación cliente es una aplicación para iOS, y el servicio de backend está escrito en el lenguaje de programación Go.

Objetivos

En este instructivo, aprenderás a completar los siguientes pasos:

  • Crear una aplicación para dispositivos móviles de iOS que se conecte con un extremo de REST en el servicio de backend
  • Configurar y ejecutar un servicio de backend de REST en Compute Engine

Costos

En este instructivo, se utilizan componentes facturables de Google Cloud Platform, incluidos los siguientes:

  • Compute Engine

Usa la Calculadora de precios a fin de generar una estimación de los costos, según el uso previsto. Los usuarios nuevos de GCP pueden optar por una prueba gratuita.

Antes de comenzar

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. Select or create a Google Cloud Platform project.

    Go to the Manage resources page

  3. Asegúrate de tener habilitada la facturación para tu proyecto.

    Aprende a habilitar la facturación

Instala el siguiente software:

Clona el código de muestra

Ejecuta el siguiente comando a fin de clonar el código de muestra:

git clone https://github.com/GoogleCloudPlatform/ios-docs-samples.git

A continuación, navega al directorio /solutions/stickynoteapi/REST a fin de encontrar el código de muestra para esta solución.

Ejecuta el servidor de manera local

En el directorio /stickynoteapi/REST/Go, ejecuta el siguiente comando:

sh SETUP

El comando muestra el siguiente resultado:

1. Set gopath and search path
2. Get the server and client dependencies
3. Build the server and client
4. Stop any previously-running instances of the server
5. Start the server
6. Run the client
2016/03/02 11:34:48 OK: message.png
7. Open the image in message.png

La configuración también ejecuta un cliente local para probar el servidor con la frase “Remember the milk” (No olvides la leche). El servidor genera un archivo message.png que contiene la imagen correspondiente.

Remember the milk (No olvides la leche).

Para generar imágenes basadas en tus propios mensajes con el cliente de línea de comandos, ejecuta el siguiente comando.

./client "This is a test..."

El archivo /stickynoteapi/REST/Go/go/src/server/server.go contiene el código que ejecuta el servidor REST. La función principal define un controlador para el directorio de nivel de raíz y escucha en búsqueda de tráfico en el puerto 8080.

func main() {
	http.HandleFunc("/stickynote", handler)
	http.ListenAndServe(":8080", nil)
	//http.ListenAndServeTLS(":443", "ssl.crt", "ssl.key", nil)
}

El servidor enruta las solicitudes entrantes a la función handler, que realiza las siguientes acciones:

  1. Extrae el mensaje de texto de la solicitud REST.
  2. Utiliza las funciones definidas en sticky.go para compilar una imagen basada en el mensaje de texto.
  3. Muestra una imagen al cliente en una respuesta REST.
func handler(w http.ResponseWriter, r *http.Request) {
	var sticky Sticky
	sticky.Message = r.FormValue("message")
	sticky.Centered = false
	stickyBytes, err := sticky.DrawPNG(512, 512)
	if err == nil {
		w.Write(*stickyBytes)
	}
}

Deja el servidor local ejecutándose a fin de poder usarlo para probar la aplicación cliente en la próxima sección.

Ejecuta el cliente de iOS con el servidor local

  1. En el directorio stickynoteapi/REST/Objective-C/, abre stickynotes.xcodeproj en Xcode.
  2. Selecciona Producto > Ejecutar para compilar y, luego, iniciar la aplicación cliente.
  3. Ingresa un mensaje en el campo de texto y presiona Intro.

Aparecerá una imagen con una nota adhesiva amarilla con tu mensaje debajo del campo de texto.

This is a test... (Esta es una prueba…)

La aplicación cliente establece la ubicación del servicio de backend en el archivo StickyNotesViewController.m. Para fines de prueba, esto se establece inicialmente en localhost, en el puerto 8080.

static NSString * const kHostAddress = @"localhost:8080";

Cuando presionas Intro una vez que ingresaste tu mensaje en el campo de texto, la aplicación codifica el mensaje en una cadena de consulta y la envía al servidor en una solicitud de REST. La aplicación recibe la respuesta de REST, extrae la imagen generada y la muestra en una vista de imagen. El siguiente código muestra la acción que controla estas tareas:

- (IBAction) textFieldDidEndEditing:(UITextField *)textField
{
  NSString *queryString = [NSString stringWithFormat:@"http://%@/stickynote?message=%@",
                           kHostAddress,
                           [textField.text urlencode]];
  NSURL *URL = [NSURL URLWithString:queryString];
  _request = [NSMutableURLRequest requestWithURL:URL];

  NSURLSession *session = [NSURLSession sharedSession];
  _task = [session dataTaskWithRequest:_request
                     completionHandler:
           ^(NSData *data, NSURLResponse *response, NSError *error) {
             UIImage *image = [UIImage imageWithData:data];
             dispatch_async(dispatch_get_main_queue(), ^{
                              self.imageView.image = image;
                            });
           }];
  [_task resume];
}

Cómo ejecutar el servidor en Compute Engine

  1. Ve a la página Create an instance (Crear una instancia) en Google Cloud Platform Console. mobile/mobile-compute-engine-rest Ir a la página Crear una instancia

    1. Establece Name (Nombre) como sticky-rest.
    2. Selecciona Allow HTTP traffic (Permitir el tráfico HTTP) y Allow HTTPS traffic (Permitir el tráfico HTTPS).
    3. Selecciona Create (Crear).

    Cree una instancia

  2. Ve a la página Reglas de Firewall en GCP Console.

    Ir a la página Reglas de firewall

  3. En la página Crear una regla de firewall, ingresa la siguiente información:

    • Nombre: sticky-rest
    • Etiquetas de destino: http-server
    • Rangos de IP de origen: 0.0.0.0/0
    • Protocolo y puertos: tcp:8080
  4. Haz clic en Crear.

  5. Ve a la página Ver las instancias de VM en GCP Console.

    Ir a la página Ver las instancias de VM

    1. Anota el valor del campo External IP (IP externa) al lado de sticky-rest.
    2. Selecciona SSH.

    Selecciona SSH

  6. En la sesión de SSH, ejecuta los siguientes comandos a fin de instalar Git en la instancia:

    sudo apt update
    sudo apt install git
    
  7. Instala las herramientas de Go; para ello, ejecuta los siguientes comandos:

    sudo wget https://storage.googleapis.com/golang/go1.10.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.10.linux-amd64.tar.gz
    export PATH="/usr/local/go/bin:${PATH}"
    
  8. Clona el código del servidor de Stickynotes.

    git clone https://github.com/GoogleCloudPlatform/ios-docs-samples.git
    
  9. Inicia el servidor de Stickynotes en la instancia. En el directorio /solutions/stickynoteapi/REST/Go, ejecuta el siguiente comando.

    sh SETUP
    
  10. En Xcode, edita StickyNotesViewController.m para cambiar el localhost al valor del campo IP externa en tu instancia de Compute Engine anotada en un paso previo.

    // static NSString \* const kHostAddress = @"localhost:8080";
    static NSString \* const kHostAddress = @"[YOUR-INSTANCE-EXTERNAL-IP]:8080";
    
  11. Selecciona Archivo > Guardar para guardar tus cambios.

  12. Selecciona Producto > Ejecutar para compilar y, luego, iniciar la aplicación cliente.

  13. Ingresa un mensaje en el campo de texto y presiona Intro.

Una imagen de una nota adhesiva amarilla con tu mensaje reemplazará el fondo gris.

Testing on remote server... (Pruebas en un servidor remoto…)

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

Cómo borrar el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. In the GCP Console, go to the Projects page.

    Go to the Projects page

  2. In the project list, select the project you want to delete and click Delete delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Borrar instancias

Para borrar una instancia de Compute Engine:

  1. In the GCP Console, go to the VM Instances page.

    Go to the VM Instances page

  2. Click the checkbox next to the instance you want to delete.
  3. Click Delete delete at the top of the page to delete the instance.

Borrar las reglas de firewall para la red predeterminada

Para borrar una regla de firewall:

  1. In the GCP Console, go to the Firewall Rules page.

    Go to the Firewall Rules page

  2. Click the checkbox next to the firewall rule you want to delete.
  3. Click Delete delete at the top of the page to delete the firewall rule.

¿Qué sigue?

En este ejemplo, se muestran los conceptos básicos de cómo conectar una aplicación para dispositivos móviles al código que se ejecuta en Compute Engine mediante REST. A fin de ampliar este ejemplo en una aplicación real, considera agregar las siguientes mejoras:

  • Agrega una dirección IP externa estática al servidor: de forma predeterminada, la dirección externa asociada con una instancia de Compute Engine es transitoria. En una aplicación de producción, adjunta una dirección IP externa a tu instancia. Si deseas obtener más información, consulta Cómo configurar una dirección IP de la instancia.

  • Utiliza credenciales para conectarte a un servidor HTTPS: asegúrate de que solo tu aplicación para dispositivos móviles pueda llamar a tu servicio de backend; para ello, solicita que la aplicación utilice credenciales a fin de autenticarse frente al servidor. Protege la privacidad de los datos que envían tus usuarios al servidor; para ello, utiliza el protocolo HTTPS encriptado en vez de HTTP. A fin de hacer esto, puedes ejecutar un servidor NGINX como un Proxy SSL en tu instancia o ejecutar tu servidor de backend en el entorno flexible de App Engine. Si deseas obtener más información, consulta Cómo conectarse a instancias de VM de forma segura.

  • Agrega balanceo de cargas y ajuste de escala automático: controla los picos de tráfico fácilmente; para ello, debes configurar un balanceador de cargas y escalador automático a fin de iniciar instancias adicionales cuando crezca la demanda y enrutar el tráfico de manera uniforme a través de estas instancias. Si deseas obtener más información, consulta Cómo configurar el balanceo de cargas HTTP(s) y Ajuste de escala automático de grupos de instancias.

  • Analiza la posibilidad de utilizar un protocolo gRPC en vez de REST: gRPC es un marco de trabajo que le permite a una aplicación para dispositivos móviles llamar métodos en un servicio de backend de forma directa como si fuera un objeto local. Puedes usar gRPC con el objetivo de que tu aplicación para dispositivos móviles tenga un ancho de banda más eficiente y reducir la latencia entre la aplicación y el servicio de backend que se ejecuta en GCP. Para obtener un ejemplo sobre cómo utilizar gRPC en la muestra de Stickynotes, consulta Compilar una aplicación para dispositivos móviles mediante Google Compute Engine y gRPC.

  • Considera otras opciones de hosting para el servicio de backend: Compute Engine te ofrece un mayor nivel de control de la máquina virtual, pero deberás actualizar y administrar tu instancia de forma manual. Si deseas conocer otras maneras de alojar un servicio de backend en Cloud Platform, consulta Cómo compilar aplicaciones para dispositivos móviles con Google Cloud Platform.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…