Introdução aos Microsserviços em Go
A arquitetura de microsserviços tornou-se o padrão de facto para a construção de sistemas distribuídos modernos. A linguagem Go (Golang), com suas goroutines leves, alta performance e simplicidade de implantação, é ideal para a implementação de microsserviços. Neste artigo, vamos analisar a arquitetura de microsserviços em Go, do conceito à implementação prática com exemplos de código.
Go oferece suporte nativo à concorrência, inicialização rápida e tamanho pequeno dos arquivos binários — tudo isso é crucial para microsserviços. Veremos como projetar um serviço, implementar uma REST API, adicionar middleware e preparar a aplicação para conteinerização.
Arquitetura de Microsserviço em Go
1. Estrutura do Projeto
A organização correta do código é a base de um microsserviço sustentável. Estrutura recomendada:
myservice/├── cmd/│ └── server/│ └── main.go # Ponto de entrada├── internal/│ ├── handler/ # Manipuladores HTTP│ ├── service/ # Lógica de negócios│ ├── repository/ # Operações com dados│ └── middleware/ # Middleware├── pkg/│ └── models/ # Modelos de dados comuns├── config/│ └── config.go # Configuração├── go.mod└── DockerfileEssa estrutura segue os princípios da Clean Architecture: handler → service → repository. Isso permite testar cada camada de forma independente.
2. Configuração e Inicialização
Vamos começar com um servidor HTTP simples usando a biblioteca padrão net/http:
// cmd/server/main.gopackage main
import ( "fmt" "log" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, `{"status": "ok"}`) })
log.Printf("Server starting on :%s", port) log.Fatal(http.ListenAndServe(":"+port, nil))}Este é um microsserviço mínimo. Para produção, use um roteador com suporte a middleware, como gorilla/mux ou chi.
Implementação Prática de um Microsserviço
3. REST API com gorilla/mux
Vamos instalar o gorilla/mux e implementar um CRUD para a entidade "Usuário":
// go.modmodule github.com/seuusuario/userservice
go 1.21
require github.com/gorilla/mux v1.8.1// internal/handler/user.gopackage handler
import ( "encoding/json" "net/http" "github.com/gorilla/mux")
type User struct { ID string `json:"id"` Name string `json:"name"` Age int `json:"age"`}
var users = []User{ {ID: "1", Name: "Alice", Age: 30},}
func GetUsers(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(users)}
func CreateUser(w http.ResponseWriter, r *http.Request) { var newUser User if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } users = append(users, newUser) w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newUser)}// cmd/server/main.go (continuação)package main
import ( "log" "net/http" "github.com/gorilla/mux" "seuprojeto/internal/handler")
func main() { r := mux.NewRouter() r.HandleFunc("/users", handler.GetUsers).Methods("GET") r.HandleFunc("/users", handler.CreateUser).Methods("POST")
log.Println("Server started on :8080") log.Fatal(http.ListenAndServe(":8080", r))}4. Middleware: Logging e Autenticação
Middleware é uma parte essencial dos microsserviços.