De maneira simplista é uma maneira de escrever um software que busca separar as preocupações e promover a modularidade em um sistema. Na sua configuração básica, a arquitetura é composta por um núcleo central, representando a lógica de negócios, cercado por portas que definem as interfaces de entrada e saída. Essas portas são conectadas a adaptadores, que são responsáveis por traduzir as operações do núcleo para o formato esperado pelos componentes externos, como interfaces de usuário, bancos de dados ou serviços externos.
flowchart TD
subgraph Núcleo Central
App[App]
Int1(Interface - Port In)
Int2(Interface - Port Out)
Int1 --> App
Int2 --> App
end
Http[Adapter - Http]
Cli[Adapter - CLI]
Db[Adapter - DB]
Log[Adapter - Log]
Cache[Adapter - Cache]
Http --> Int1
Cli --> Int1
Db --> Int2
Log --> Int2
Cache --> Int2
Essa abordagem facilita a testabilidade, manutenção e evolução do software, uma vez que as dependências externas são isoladas, permitindo a substituição fácil de componentes sem afetar o núcleo da aplicação, com isso a aplicação se paga ao longo do tempo.
Complexidade no geral, principalmente em inicio de projeto pode exigir mais esforço e planejamento do que abordagens mais simples, além de, quando seguido as a risca as boas práticas, pode levar a certa quantidade de overhead.
Existem vários conceitos que podemos vincular a arquitetura hexagonal, porém o que eu bato o olho e vejo claramente "necessário" é a aplicação de DDD e SOLID. Onde o conceito principal do DDD, a forma de desenvolvimento do software voltado ao core da aplicação, se enquadra perfeitamente e referente ao SOLID destacamos o D, Dependency Inversion Principle, onde modulos de baixo nivel não devem depender dos modulos de alto nivel e sempre trabalhar com abstrações (Interfaces).
A priori este repositório tem o intuito de servir como demonstração prática dos princípios da arquitetura hexagonal utilizando a linguagem Go. O core da aplicação é simples, um sistema para criar, consultar, habilitar e desabilitar um produto, com 3 adaptadores, web (usando http com o auxilio da lib Gorilla mux), CLI (com o auxilio da lib Cobra) e DB usando SQL.
- Para executar via CLI:
go run main.go cli --help
Apresentará as flags:
Flags:
-a, --action string Enable / Disable a product (default "enable")
-h, --help help for cli
-i, --id string ProductId
-p, --price float Product name
-n, --product string Product name
- via http (porta 9000) :
go run main.go http
Subirá o servidor e fornecerá a mensagem
Webserver has been started