Cómo implementar una aplicación de Golang

Go (Golang) es un lenguaje de programación desarrollado por Google en 2009 para abordar problemas comunes en el desarrollo de sistemas a gran escala, como la compilación lenta y la necesidad de programación simultánea.

El lenguaje fue diseñado para ser simple, eficiente y fácil de usar con una sintaxis similar a C. Además, Go está compilado, lo que lo hace más rápido que los lenguajes interpretados.

Una de las características clave de Go es su compatibilidad con la concurrencia, que le permite ejecutar múltiples tareas simultáneamente a través de subprocesos livianos llamados Goroutines.

Go también es conocido por su fuerte apoyo a las redes y el desarrollo web. La biblioteca estándar de Go alberga paquetes para HTTP, TCP/IP y otros protocolos de red, lo que facilita la creación de aplicaciones en red.

En este artículo, explorará los beneficios, las limitaciones y las opciones de implementación de las aplicaciones Go. Además, creará, dockerizará e implementará una aplicación Go utilizando el servicio de contenedorización de Back4app de forma gratuita.

Continue leyendo para descubrir cómo implementar una aplicación Go.

Ventajas de Golang en el Desarrollo Web

La creciente popularidad de Go no es aleatoria. Hay muchas ventajas que puede obtener y aprovechar al usar Go para sus aplicaciones.

Alto rendimiento

El alto rendimiento es una de las principales razones por las que empresas como Dropbox y Uber utilizan Go. Go está diseñado para tiempos de ejecución rápidos, lo que convierte al lenguaje en una opción ideal para aplicaciones que requieren un alto rendimiento.

Go emplea un recolector de basura que reduce la administración de memoria general, lo que permite tiempos de ejecución más rápidos. Además, puede usar el soporte de concurrencia integrado de Go para aumentar el rendimiento de su aplicación.

Escalabilidad

Go es una excelente opción para crear aplicaciones escalables. Con Concurrencia, puede crear programas que pueden manejar muchas tareas, lo que hace que Go sea adecuado para aplicaciones que manejan cargas de alto tráfico que necesitan escalar rápidamente.

Go también tiene un excelente soporte para sistemas distribuidos, lo que lo convierte en una opción ideal para crear aplicaciones a gran escala que necesitan ejecutarse en varias máquinas.

Go está probado para la batalla

Muchas empresas populares utilizan Go para crear aplicaciones a gran escala, incluidas las que utilizan Google, Uber y Dropbox. Esto implica que se ha probado que Go es confiable y estable para crear aplicaciones complejas para grandes bases de usuarios.

Go se enfoca fuertemente en la compatibilidad con versiones anteriores, y las aplicaciones escritas en Golang seguirán funcionando incluso a medida que el lenguaje evolucione.

Gran apoyo de la comunidad

Desde su lanzamiento, Go ha sido uno de los lenguajes de más rápido crecimiento en términos de adopción, creando así una comunidad grande y activa. El hecho de que Go tenga una gran comunidad activa significa que puede encontrar fácilmente recursos y respuestas a sus preguntas.

Go alberga muchas bibliotecas y herramientas de código abierto que puede usar para acelerar el tiempo de desarrollo. Las herramientas de compilación populares como Kubernetes, Docker y Hugo usan paquetes como Cobra en sus herramientas CLI.

Limitaciones de Golang

Si bien Golang es un lenguaje de programación escalable y de alto rendimiento, Go tiene sus limitaciones que debe considerar antes de desarrollar con el lenguaje.

Mayor complejidad para ciertas tareas

Go puede ser fácil de aprender y leer, pero las tareas específicas son más fáciles en otros lenguajes que en Go.

Crear una interfaz de usuario interactiva con Go puede ser un desafío porque Go necesita un conjunto de herramientas de GUI integrado y los paquetes de terceros aportan complejidad a su proyecto.

El modelo de concurrencia de Go puede ser un desafío para los principiantes

El modelo de concurrencia de Go puede ser un desafío para que los principiantes lo entiendan y lo usen de manera efectiva.

Go usa rutinas y canales para la concurrencia, que son herramientas poderosas, pero pueden ser difíciles de entender. Debe aprender a usar los canales de manera efectiva para evitar puntos muertos o condiciones de carrera.

El modelo de concurrencia de Go también requiere que piense de manera diferente sobre la estructura y el diseño del código. Encontrará esto difícil si lo demandan los modelos de programación secuencial.

Ecosistema de biblioteca menos maduro en comparación con otros lenguajes

Si bien la biblioteca estándar de Golang es completa y tiene la mayoría de las funcionalidades que necesitará para crear aplicaciones de Go, es menos madura que las bibliotecas en lenguajes como Java o Python.

Golang es un lenguaje de programación relativamente nuevo; algunas bibliotecas populares aún no están disponibles. Esto puede ser una limitación para proyectos específicos, especialmente aquellos que requieren una funcionalidad más especializada.

Además, las bibliotecas de terceros para Golang están menos extendidas que las disponibles para otros lenguajes, y es posible que deba implementar algunas funcionalidades usted mismo, lo que puede llevar mucho tiempo.

Opciones de implementación de Golang

Después de crear aplicaciones en Go, tiene varias opciones de implementación, cada una con sus ventajas e inconvenientes.

Tiene una amplia gama de opciones desde servicios IaaS como AWS, servicios PaaS como Heroku, servicios BaaS como Back4app y Google Firebase, y servicios CaaS como Back4App Containers.

Infraestructura como servicio (IaaS) como AWS

Los proveedores de infraestructura como servicio (IaaS) como Amazon Web Services (AWS) brindan funcionalidad para implementar y administrar máquinas virtuales propias en la nube.

Con AWS, puede usar servicios como Elastic Compute Cloud (EC2) para implementar su aplicación Golang en una máquina virtual que ejecuta Linux o Windows. También puede usar servicios como Elastic Container Service (ECS) para implementar su aplicación en un contenedor.

Una ventaja de usar un servicio IaaS como AWS es que tiene control total sobre la infraestructura subyacente. Puede configurar la máquina virtual para cumplir con sus requisitos específicos. Sin embargo, usted es responsable de administrar y mantener la máquina virtual, lo que puede ser técnico y de tareas.

Otras plataformas IaaS incluyen:

  • Linode
  • Microsoft Azure
  • Rackspace
  • Amazon Web Services (AWS)
  • DigitalOcean
  • Google Compute Engine (GCE)

Plataforma como servicio (PaaS) como Heroku

Los proveedores de plataforma como servicio (PaaS) como Heroku proporcionan una plataforma para implementar aplicaciones Golang sin afectar la infraestructura subyacente.

Heroku proporciona una interfaz de línea de comandos simple para implementar su aplicación con solo unos pocos comandos. Heroku también es compatible con el escalado automático y el equilibrio de carga, lo que facilita el manejo de un alto tráfico para su aplicación.

Una ventaja de usar un servicio PaaS como Heroku es que puede concentrarse en desarrollar su aplicación sin preocuparse por la infraestructura. Heroku maneja toda la administración y el mantenimiento de la infraestructura, lo que le permite ahorrar tiempo y recursos.

Sin embargo, esto también significa que tiene menos control sobre la infraestructura y tendrá que trabajar dentro de las limitaciones de la plataforma.

Otros proveedores de PaaS incluyen:

  • Render
  • AWS Elastic Beanstalk
  • Microsoft Azure App Service
  • DigitalOcean App Platform
  • The Fly Platform

Backend como servicio (BaaS) como Back4app

Los proveedores de backend como servicio (BaaS) como Google Firebase y Back4app brindan la solución de backend completa para su aplicación, incluida una base de datos, autenticación y alojamiento.

Firebase admite varios lenguajes de programación, incluido Golang, y proporciona una API simple que puede usar para acceder a sus servicios.

Una ventaja de usar un servicio BaaS como Firebase es que puede configurar rápida y fácilmente un backend para su aplicación sin administrar ninguna infraestructura.

Firebase proporciona una variedad de funciones y servicios; sin embargo, necesita más control sobre la infraestructura.

Otras plataformas BaaS incluyen:

  • AWS Amplify
  • Cloudkit
  • Backendless
  • Back4App
  • Pocketbase

Contenedorización como un servicio como los Back4app Containers

La contenedorización es popular para implementar aplicaciones. Con la creación de contenedores, puede empaquetar su aplicación y sus dependencias en un contenedor que puede implementar rápidamente en cualquier plataforma que admita la tecnología de contenedores.

Back4App es la creación de contenedores como un proveedor de servicios que puede usar para implementar y administrar su aplicación Golang en un contenedor.

Una de las ventajas de utilizar contenedores como proveedor de servicios como Back4App es que puede implementar su aplicación en cualquier plataforma que admita contenedores sin preocuparse por la infraestructura subyacente.

El proveedor de CaaS maneja toda la gestión y el mantenimiento de los contenedores, ahorrándole tiempo y recursos. Sin embargo, es posible que deba trabajar dentro de las limitaciones de la plataforma de contenedores sin acceso a la infraestructura.

Otras plataformas CaaS incluyen:

  • AWS Container Service
  • Azure Container Service
  • Docker Enterprise
  • Google Container Engine
  • IBM Kubernetes Service
  • Oracle Container Service

Proceso de implementación de Golang

Aquí, aprenderá cómo implementar su aplicación Golang en la plataforma CaaS de Back4app.

¿Qué es Back4app?

Back4app es una oferta en la nube que puede usar para crear e implementar servicios de backend para sus aplicaciones móviles y web.

Puede usar la función CaaS de Back4app para implementar y ejecutar contenedores personalizados en los servidores backend de Back4app. Puede agregar lógica personalizada a su aplicación utilizando las imágenes de su contenedor sin tener que administrar la infraestructura de su servidor.

En esta sección, aprenderá a crear una API RESTful CRUD simple en Go, organizar programas Go en contenedores e implementar el contenedor en Back4app.

Configuración de su entorno de desarrollo

Una vez que haya instalado Go en su máquina desde la página de descargas, puede crear un nuevo directorio e inicializar un nuevo proyecto Go para su aplicación Go.

Ejecute el siguiente comando para crear un nuevo directorio para su proyecto.

mkdir deployAPI && cd deployAPI

Ejecute el comando mod init para inicializar un nuevo proyecto en su directorio de trabajo actual con la herramienta Go.

Al igual que:

go mod init

Construirá la API RESTful con el paquete Gorilla Mux.

Ejecute el siguiente comando para instalar el paquete Gorilla Mux como una dependencia para su proyecto.

go get -u github.com/gorilla/mux

El siguiente paso es construir la API RESTful. El primer paso para crear una API RESTful con Gorilla Mux es importar los paquetes necesarios en su archivo Go.

Aquí está la lista de importaciones que necesita para el proyecto.

import (
	"encoding/json"
	"log"
	"net/http"
	"strconv"

	"github.com/gorilla/mux"
)

Después de enumerar sus importaciones, deberá configurar una base de datos para su aplicación. Para simplificar, usaremos un mapa para almacenar y recuperar datos.

Puede agregar el mapa a su aplicación de la siguiente manera:

var users = map[int]string{}

Dado que el mapa está vacío, deberá ingresar datos con una solicitud POST.

La función del controlador de solicitudes POST

Su solicitud POST debe recibir datos del cliente, analizarlos y guardarlos en el almacén de datos del mapa.

Agregue el bloque de código a su aplicación para implementar el controlador de solicitudes POST:

func createUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	var data map[string]string

	err = json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	users[id] = data["name"]

	w.WriteHeader(http.StatusCreated)
}

La función del controlador createUserHandler toma los datos del cliente (JSON), analiza el JSON y guarda los datos en el mapa. Cuando el controlador agrega correctamente los datos al mapa, escribe el código de éxito StatusCreated en el cliente.

La solicitud GET

Leerá los datos del almacén de datos con una solicitud GET. Su función de controlador de solicitud GET recuperará una ID del cliente, buscará y devolverá los datos al cliente.

Agregue el bloque de código a su aplicación para implementar el controlador de solicitudes GET:

func readUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	name, ok := users[id]
	if !ok {
		w.WriteHeader(http.StatusNotFound)
		return
	}

	data := map[string]string{"name": name}

	jsonData, err := json.Marshal(data)
	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusOK)
	w.Write(jsonData)
}

La función readUserHandler recupera el ID con la función Vars del paquete mux y busca los datos en el mapa antes de devolver los datos como JSON al cliente, junto con un código de éxito StatusOk. 

La función de controlador de solicitud PUT

Actualizará los datos en su almacén de datos con una solicitud PUT. Su controlador de solicitud PUT aceptará la ID y un campo JSON para el proceso de actualización.

func updateUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	var data map[string]string

	err = json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	users[id] = data["name"]

	w.WriteHeader(http.StatusOK)
}

La función updateUserHandler toma el ID con la variable vars, descodifica el JSON del cuerpo de la solicitud y actualiza el campo o el ID con los datos JSON del cuerpo de la solicitud.

La función del controlador de solicitudes DELETE

Su función de controlador de solicitud ELIMINAR tomará el ID de campo de la solicitud y eliminará el campo del almacén de datos.

Agregue el bloque de código a su aplicación para implementar el controlador de solicitudes DELETE:

func deleteUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	delete(users, id)

	w.WriteHeader(http.StatusOK)
}

La función deleteUserHandler elimina el campo con la función delete que toma el nombre del mapa y la ID y devuelve el código StatusOk al cliente.

Montaje de las funciones del controlador en las rutas

Después de definir los puntos finales de su aplicación, debe asignar las funciones del controlador a las rutas. Las rutas son la interfaz pública de su API.

func main() {
	r := mux.NewRouter()

	r.HandleFunc("/users/{id}", createUserHandler).Methods(http.MethodPost)
	r.HandleFunc("/users/{id}", readUserHandler).Methods(http.MethodGet)
	r.HandleFunc("/users/{id}", updateUserHandler).Methods(http.MethodPut)
	r.HandleFunc("/users/{id}", deleteUserHandler).Methods(http.MethodDelete)

	log.Fatal(http.ListenAndServe(":8080", r))
}

En la función main, r es una instancia de un nuevo enrutador mux, y el método HandleFunc toma una ruta y una función de controlador. La función Methods especifica los métodos HTTP en las rutas.

Contenerización de aplicaciones Go con Docker

Docker es una de las tecnologías de contenedorización más populares. Docker se creó con Go, y puede contener sus aplicaciones Go para portabilidad con Docker.

Deberá crear un nuevo dockerfile donde especificará las instrucciones de compilación.

Ejecute el siguiente comando para crear un Dockerfile en el directorio de trabajo de su proyecto.

touch Dockerfile

Abra el Dockerfile y pegue estas instrucciones de compilación para contener su aplicación Go con Docker.

# Use an official Golang runtime as a parent image
FROM golang:latest

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Download and install any required dependencies
RUN go mod download

# Build the Go app
RUN go build -o main .

# Expose port 8080 for incoming traffic
EXPOSE 8080

# Define the command to run the app when the container starts
CMD ["/app/main"]

Las instrucciones de compilación en el dockerfile especifican la versión de Go para el proyecto, el directorio de trabajo, los archivos para la aplicación y las instrucciones de compilación para el dockerfile.

Aquí hay un desglose del Dockerfile:

  • El archivo comienza con FROM golang: latest, que especifica que desea usar la última versión de la imagen oficial de Golang como imagen base para su contenedor Docker.
  • La línea WORKDIR /app establece el directorio de trabajo de su contenedor en el directorio /app.
  • La COPY . /app copia el contenido de su directorio actual en el directorio /app del contenedor.
  • La RUN go mod download descarga las dependencias requeridas de su aplicación.
  • El RUN go build -o main . compila su aplicación Go y crea un archivo ejecutable llamado main en el directorio /app.
  • La línea EXPOSE 8080 le dice a Docker que exponga el puerto 8080; el puerto en el que su aplicación Go escucha las solicitudes entrantes.
  • La línea CMD [“/app/main”] especifica el comando que se ejecutará cuando se inicie el contenedor (en este caso, el ejecutable main).

Al ejecutar el dockerfile, Docker crea la imagen de la aplicación y expone la aplicación en el puerto 8080.

El comando inicia el contenedor y asigna el puerto 8080 en la máquina host al puerto 8080 en el contenedor, y debería poder acceder a la API en [http://localhost:8080](http://localhost:8080).

Implementación del contenedor en Back4app

Deberá crear una cuenta en Back4app (si no tiene una) para implementar contenedores.

Estos son los pasos para crear una cuenta en Back4app.

  1. Diríjase al sitio web de Back4app.
  2. Haga clic en el botón Registrarse en la esquina superior derecha de la página de inicio para crear una nueva cuenta.
  3. Finalmente, complete el formulario de registro y envíelo.

Después de crear su cuenta Back4app, inicie sesión en su cuenta y haga clic en el botón NUEVA APLICACIÓN en la esquina superior derecha de la interfaz de usuario.

El botón NUEVA APLICACIÓN lo llevará a una página donde puede elegir cómo implementar su aplicación. Dado que está implementando un contenedor, seleccione la opción Contenedores como servicio.

Create new CaaS app on Back4app

A continuación, conecte su cuenta de GitHub a su cuenta de Back4app. Puede elegir dar acceso a Back4app al código fuente de todos los repositorios en su cuenta o a un directorio de proyecto específico.

Back4app containers- Import GitHub repository.

Elija la aplicación que desea implementar, en este caso, la aplicación que creó en este tutorial y luego haga clic en Seleccionar.

Back4app containers- Select a git repository

Al hacer clic en el botón de selección, accederá a una página donde completará la información sobre su aplicación, desde el nombre hasta la rama, el directorio raíz y las variables ambientales.

Asegúrese de completar todas las variables ambientales que requiere su aplicación. Una vez que haya completado los detalles requeridos, haga clic en Crear aplicación.

Al hacer clic en este botón, se inicia el proceso de implementación de su aplicación Go, como se muestra en la imagen a continuación.

Back4app container deployment page

Conclusión

Ha aprendido a implementar una aplicación Go en contenedores en Back4app. Siguiendo los pasos de este tutorial, debería tener una API Go ejecutándose en Back4app.

La implementación de sus aplicaciones en Back4app es una excelente manera de simplificar la administración de la infraestructura de backend. Back4App proporciona herramientas poderosas para administrar sus datos, escalar su aplicación y monitorear su rendimiento.

Es una excelente opción para los desarrolladores que buscan crear excelentes aplicaciones en lugar de administrar servidores.

Preguntas frecuentes

¿Qué es Back4App y por qué es una buena plataforma para implementar mi aplicación?

Back4App es una plataforma BaaS en la que puede crear, alojar y escalar sus aplicaciones con una arquitectura sin servidor. Back4app también ofrece servicios de contenedorización que le permiten administrar e implementar contenedores de software sin tener que preocuparse por administrar la infraestructura subyacente.

¿Puedo implementar otros lenguajes como Rust en Back4app con contenedores?

Sí, puede implementar Rust en Back4App utilizando tecnologías de contenedorización como Docker. Back4App admite contenedores Docker que puede usar para implementar aplicaciones escritas en varios lenguajes de programación, incluido Rust.

¿Puedo escalar mi aplicación en contenedores en Back4App?

Sí, puede escalar su aplicación en contenedores en Back4App con la función de escalado automático incorporada. La función de escalado automático escala automáticamente la cantidad de instancias de su aplicación en función de la demanda, lo que garantiza que su aplicación pueda manejar un mayor tráfico y carga de trabajo.


Leave a reply

Your email address will not be published.