Como estruturar WebApi em GoLang

Rafael Costa
3 min readMay 30, 2021

--

Ref[1]

GoLang nasceu tendo como premissa ser uma linguagem de programação simples e fácil de aprender. Porém não é pelo fato de ser uma linguagem simples que não nos devemos nos ater a forma em que estruturamos nossas aplicações em Go.

Quando pensamos em criar uma software para resolver algum determinado problema, além de nos atentarmos para os requisitos funcionais pelo qual descreve a necessidade da existência do software, temos também que nos atentar para como iremos estruturar nossa solução para que ela possa atender tais requisitos e possamos conseguir expressar o que o “negócio” demanda da solução por meio do nosso sistema a ser desenvolvido.

Estruturar uma aplicação pode ser comparado a uma arte, não existe uma forma correta de como fazer e muito menos uma única forma que atenda para todos os cenários. Com base nesta pequena introdução quero deixar aqui meu disclaimer. O intuito deste artigo é apenas apresentar uma simples proposta de como podemos estruturar uma aplicação GoLang utilizando alguns princípios de arquitetura de software para manter nossa solução com um baixo acoplamento e viabilizar a escrita de testes unitários.

Caso queiram conferir a implementação desta proposta podem acessar o Repositório.

Figura 1 — Diagrama de dependências

O diagrama apresentado acima ilustra de uma forma geral a segregação das camadas da aplicação.

A camada Application é responsável pela regra de negócio de nossa aplicação, nesta camada é onde realizamos todas as operações para performar nossos casos de usos. Logo abaixo temos a camada Handlers essa camada é responsável por receber a requisição HTTP tratar o Body da requisição e aplicar as regras de negócio apropriadas para a requisição em questão. Na camada Presenter configura-se todas as regras de apresentação da nossa aplicação, neste caso a apresentação da nossa solução são rotas HTTP. E por fim a camada Infrastructure sendo responsável por manter nossa aplicação isolada de dependências externas. Na figura abaixo é apresentada uma possível implementação.

Figura 2 — Arvore de arquivos

CMD

A pasta de CMD é um padrão da comunidade Go onde nela contém a configuração de startup de todos os processos do nosso projeto. Em alguns contextos podemos ter no mesmo projeto uma WebApi e uma processo batch que realiza um processamento em background, como por exemplo envio de emails. Desta forma o package CMD fica responsável por viabilizar a inicialização de todos estes processos.

PKG

A pasta PKG é um outro padrão da comunidade Go onde é inserido todos os pacotes que compõem nossa aplicação.

Considerações

Desenhar uma solução vai muito além de seguir a literatura à risca, para chegar em um melhor modelo para a solução deve ser levado em consideração vários requisitos funcionais e não funcionais mapeados através dos stakeholders. No repositório indicado acima resolvi não seguir à risca a proposta da Clean Architecture em alguns quesitos, um deles é de apenas a cama de Infrastructure deve conhecer os frameworks e bibliotecas externas. No projeto apresentado eu optei em acoplar a solução ao framework Gin, que hoje na atualidade é o framework mais utilizado para criação de WebApi, desta forma eu aceitei este acoplamento sabendo que os benefícios obtidos na simplificação do código foram muitos maior do que o acoplamento gerado.

Conclusão

GoLang é uma linguagem extremamente poderosa tendo uma sintaxe muito simples e uma compilação muito rápida, porém por estes benefícios facilmente podemos nos descuidar e criarmos soluções de forma desordenada e sem nenhum cuidado na estrutura da mesma. Atentar-se para a estruturação do projeto desde o início é uma boa prática que deve ser seguida sempre que possível juntamente com uma o princípio de arquitetura evolutiva.

Espero que tenha gostado deste rapido e simples artigo, estou a disposição para quaisquer dúvidas e também para receber criticas construtivas =)

LinkedIn

GitHub

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Rafael Costa
Rafael Costa

Written by Rafael Costa

Backend Engineer— [GoLang] [Rust] [IoT] [IIoT] [NodeJs]

No responses yet

Write a response