Primeiros passos com framework Echo

O desenvolvimento de APIs em Go tem se tornado cada vez mais popular graças à simplicidade e eficiência que a linguagem oferece. Atualmente, existem diversos packages e frameworks que facilitam a construção de APIs robustas e performáticas.

Neste post, vamos explorar o que é o framework Echo, como ele se compara com outros packages e frameworks populares, e como implementar um CRUD completo utilizando essa poderosa ferramenta.

O que é o Echo Framework

Como o próprio nome já diz, Echo framework é um framework web extensível para a construção de APIs em Go. Criada com foco em simplicidade e eficiência, ele permite que desenvolvedores construam APIs RESTful de maneira rápida e com um código limpo.

Principais características do Echo

  • Roteamento eficiente: O Echo utiliza um sistema de roteamento otimizado, permitindo que as requisições sejam tratadas com baixa latência.
  • Suporte nativo a middleware: Echo facilita a criação e o uso de middlewares, como autenticação, logging e compressão de respostas.
  • Manipulação de erros: O framework oferece um sistema simples e robusto para lidar com erros.
  • Suporte a WebSocket: Echo também possui suporte integrado para WebSockets, permitindo aplicações em tempo real.

Comparativo: Echo x Gin x Chi x Fiber

PackageDesempenhoFacilidade de UsoExtensibilidadeGitHub Stars
EchoAltaFácilAlta30.7k
GinAltaFácilMédia80.9k
ChiMédiaMédiaAlta19.3k
FiberAltíssimaMuito FácilAlta35.5k

O Echo se destaca por oferecer um ótimo equilíbrio entre desempenho, facilidade de uso e extensibilidade. Embora o Gin seja o framework mais popular, o Echo oferece funcionalidades extras, como suporte a WebSocket, que podem ser úteis em determinadas aplicações.

O Chi, que não chega a ser um framework, é mais indicado para projetos que precisam de uma API altamente modular, enquanto o Fiber foca em ser extremamente rápido, inspirado no framework Express do Node.js.

Para saber mais sobre o Fiber, convido a ler o post APIs de alta performance com Fiber.

Implementando uma API com Echo

Agora vamos criar uma API RESTful completa utilizando o Echo. Essa API será um CRUD para gerenciar os usuários de uma aplicação.

Iniciando o projeto

Antes de qualquer outro passo, vamos iniciar um novo projeto com o seguinte comando.

go mod init github.com/aprendagolang/echoapp

Na sequência, utilizando o comando abaixo, adicionaremos o Echo como dependência ao nosso projeto.

go get -u github.com/labstack/echo/v4

Estruturando o Projeto

Para esse “Hello World” diferenciado, vamos criar uma estrutura de pastas bem básica.

project/
├── main.go
├── handlers/
│   └── user.go
└── models/
    └── user.go

Criando o Modelo User

Na pasta models/, crie o arquivo user.go com o seguinte conteúdo:

package models

type User struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

Implementando o Handler

Agora, na pasta handlers/, crie o arquivo user.go. Nele, vamos definir a lógica para cada tipo de request do CRUD.

package handlers

import (
    "fmt"
    "net/http"
    "github.com/labstack/echo/v4"
    "github.com/aprendagolang/echoapp/models"
)

var users = []models.User{}

// Cria um novo usuário
func CreateUser(c echo.Context) error {
    user := new(models.User)
    if err := c.Bind(user); err != nil {
        return err
    }
    user.ID = len(users) + 1
    users = append(users, *user)
    return c.JSON(http.StatusCreated, user)
}

// Retorna todos os usuários
func GetUsers(c echo.Context) error {
    return c.JSON(http.StatusOK, users)
}

// Retorna somente 1 usuário
func GetUser(c echo.Context) error {
    id := c.Param("id")
    for _, user := range users {
        if fmt.Sprintf("%d", user.ID) == id {
            return c.JSON(http.StatusOK, user)
        }
    }
    return c.JSON(http.StatusNotFound, map[string]string{"message": "User not found"})
}

// Atualiza um usuário
func UpdateUser(c echo.Context) error {
    id := c.Param("id")
    updatedUser := new(models.User)
    if err := c.Bind(updatedUser); err != nil {
        return err
    }
    for i, user := range users {
        if fmt.Sprintf("%d", user.ID) == id {
            users[i] = *updatedUser
            return c.JSON(http.StatusOK, updatedUser)
        }
    }
    return c.JSON(http.StatusNotFound, map[string]string{"message": "User not found"})
}

// Deleta um usuário
func DeleteUser(c echo.Context) error {
    id := c.Param("id")
    for i, user := range users {
        if fmt.Sprintf("%d", user.ID) == id {
            users = append(users[:i], users[i+1:]...)
            return c.JSON(http.StatusOK, map[string]string{"message": "User deleted"})
        }
    }
    return c.JSON(http.StatusNotFound, map[string]string{"message": "User not found"})
}

Note que, para facilitar o exemplo, o “banco de dados” escolhido é um simples slice.

Configurando o main.go

Por fim, crie o arquivo main.go na raiz do projeto. Nele, vamos iniciar o servidor do ECHO e configurar cada uma das rotas.

package main

import (
    "github.com/labstack/echo/v4"
    "github.com/aprendagolang/echoapp/handlers"
)

func main() {
    e := echo.New()

    e.POST("/users", handlers.CreateUser)
    e.GET("/users", handlers.GetUsers)
    e.GET("/users/:id", handlers.GetUser)
    e.PUT("/users/:id", handlers.UpdateUser)
    e.DELETE("/users/:id", handlers.DeleteUser)

    e.Start(":8080")
}

Antes de executar o programa, faça um go mod tidy para atualizar os arquivos go.mod e go.sum. Feito isso, execute o comando go run main.go para iniciar a API.

Prós e Contras

Assim como em qualquer decisão técnica, antes de bater o martelo na utilização do Echo, vale verificar todos os prós e contras de se utilizar determinado framework.

Abaixo listo alguns para o Echo:

Prós

  • Simplicidade e facilidade de uso
  • Suporte a middlewares
  • Roteamento eficiente
  • Suporte a WebSocket
  • Comunidade ativa

Contras

  • Mais funcionalidades podem significar uma curva de aprendizado maior
  • Pode ser considerado “overkill” para projetos pequenos
  • Menor controle granular se comparado ao net/http
  • Assinatura dos métodos não segue o padrão oficial do net/http

Além disso, também é muito importante entender a dimensão e complexidade do projeto onde ele será aplicado. Muitas vezes, o que é bom para um projeto pode ser péssimo para outro.

Conclusão

O framework Echo é uma excelente escolha para quem busca construir APIs robustas em Go. Com uma API simples e poderosa, ela permite criar aplicações escaláveis rapidamente.

No entanto, é sempre bom pesar os prós e contras antes de tomar a decisão de qual framework, caso deseje utilizar, será utilizado na construção de uma API. Mesmo que seja investido 2 ou 3 semanas em testes e pesquisas, COM CERTEZA é um tempo muito pequeno quando comparado a refatoração de uma decisão errônea do passado.

Gostou do conteúdo?

  • Inscreva-se na nossa newsletter para receber mais dicas práticas sobre Go, Kubernetes e desenvolvimento de software diretamente no seu e-mail!
  • 🚀 Torne-se um assinante pago do blog e tenha acesso a conteúdos exclusivos, como tutoriais avançados, estudos de caso e muito mais!

Faça parte da comunidade!

Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.

Livros Recomendados

Abaixo listei alguns dos melhores livros que já li sobre GO.

Um comentário sobre “Primeiros passos com framework Echo

Deixe uma resposta