Go é uma linguagem de programação de código aberto e uso geral. Foi inspirada pela produtividade do Python ao mesmo tempo em que oferece a capacidade do C. Foi originalmente desenvolvida pelo Google para lidar com problemas que eles enfrentavam em sua base de código (complexidade de código e longo tempo de compilação). Como qualquer outra linguagem de programação moderna, o Go é adequado para todos os tipos de propósitos. Por exemplo, pode ser utilizado para desenvolvimento web, scripts de linha de comando, aplicativos de servidor de rede, desenvolvimento front-end, etc.
Neste guia, nós vamos orientá-lo pelas etapas de implantação de uma aplicação web simples em Go no Ubuntu 22.04 LTS. Também implementaremos um proxy reverso Nginx para lidar com a carga de tráfego.
Pré-requisitos
Para realizar as etapas demonstradas neste guia, você precisará dos seguintes componentes pré-configurados:
- Um devidamente configurado Ubuntu Saiba mais sobre configurar seu próprio servidor Ubuntu na CloudSigma.
- Ambiente de programação Go com as variáveis de ambiente necessárias ( $GOROOT e $GOPATH). Confira o guia sobre configurar o ambiente de programação Go no Ubuntu.
- Nginx para proxy reverso. Este guia detalha a instalação e configuração do Nginx no Ubuntu.
- Um editor de texto adequado para trabalhar com o código Go, por exemplo, Atom, Sublime Text, Brackets, VS Code, Vim, etc. Para este guia, o VS Code será o nosso editor de texto de escolha.
Se o serviço deve ser acessível por um nome de domínio, você deve ter um FQDN apontado para o servidor. Nesse caso, é recomendável proteger o Nginx com SSL. Você pode aprender mais sobre proteger o Nginx com Let’s Encrypt no Ubuntu a partir do nosso tutorial.
Passo 1 – Criando um App Web em Go
Vamos construir um aplicativo web simples em Go que imprimirá “Hello World” na tela ao acessar o domínio. Além disso, o aplicativo saudará o usuário ao acessar <domain>/greet/<username>.
Comece criando um novo projeto sob $GOPATH. Crie o diretório do projeto:
|
1 |
mkdir -pv $GOPATH/go-web |

Altere o diretório atual:
|
1 |
cd $GOPATH/go-web |

Em seguida, inicie um projeto:
|
1 |
go mod init <package_name> |

Em seguida, crie main.go que servirá como a raiz da nossa aplicação Go. Ele hospedará o código-fonte do nosso aplicativo web:
|
1 |
touch main.go |
Abra o projeto no VS Code:
|
1 |
code . |
Cole o seguinte código no arquivo main.go:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name:= r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) }) http.ListenAndServe(":9990", nil) } |

Vamos fazer uma rápida análise do programa Go que acabamos de criar:
- O termo package main serve como o ponto de entrada para a nossa aplicação. Ele também instrui o compilador Go a compilar o arquivo como um executável em vez de uma biblioteca compartilhada.
- A instrução import importa todos os módulos adicionais necessários para o funcionamento do programa. Aqui, importamos os pacotes fmt (para imprimir textos) e net/http (para aplicações de servidor web).
- Usando a função
http.HandleFunc, estabelecemos duas rotas:
- A primeira rota / serve como a rota pai dentro de func main.
- A segunda rota
/greet/ aceita um parâmetro de URL (uma string, neste caso). A string é então exibida acompanhada pela mensagem de saudação.
- URL Path é usado para armazenar o valor após /greet/. O valor é então passado como o name do parâmetro de URL.
- A http.ListenAndServe inicia o servidor web. Aqui, ela está escutando na porta 9990.
Agora que o nosso programa está pronto, compile o arquivo em um executável:
|
1 |
go build main.go |
O compilador Go criará um executável com o mesmo nome do arquivo. Confira a saída:
|
1 |
ls -lh |
Passo 2 – Configurando um Arquivo de Unidade do systemd para Execução em Segundo Plano
Até agora, se o usuário atual fizer logout do sistema, o aplicativo web Go parará de funcionar. Isso é um design ruim para um servidor web. Para resolver esse problema, criaremos um arquivo de unidade do systemd para mantê-lo rodando em segundo plano, mesmo quando o usuário fizer logout do servidor. Isso deixa a configuração um passo mais próxima de uma implantação de nível de produção.
Crie um arquivo systemd dedicado goweb.service sob /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Adicione o seguinte trecho no arquivo de unidade:
|
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/<username>/go/go-web/main [Install] WantedBy=multi-user.target |

Aqui,
- A variável ExecStart indica o ponto de entrada para o serviço através do executável principal localizado no diretório do nosso projeto ( $GOPATH/go-web). Observe que, em vez de mencionar $GOPATH, digitamos o caminho completo para o arquivo executável. Isso ocorre porque a $GOPATH variável só é visível para o usuário.
- A variável Restart diz ao systemd o que fazer no caso de o programa parar de funcionar. O valor always diz ao systemd para reiniciar o programa toda vez que ele parar de ser executado.
- A variável RestartSec diz ao systemd para aguardar uma quantidade específica de tempo antes de tentar reiniciar o programa. Aqui, o valor está definido como 5s (5 segundos).
- A instrução WantedBy=multi-user.target especifica em qual estado o systemd ativará o serviço.
Salve o arquivo e feche o editor. Inicie o serviço:
|
1 |
sudo service goweb start |

Verifique se o serviço está ativo e em execução:
|
1 |
sudo service goweb status |

Como a saída sugere, o aplicativo está ativo e em execução. Agora estamos prontos para usar o Nginx como proxy reverso.
Passo 3 – Configurando o Nginx como um Proxy Reverso
Agora, criaremos um bloco de servidor para o Nginx agir como um proxy reverso. O aplicativo web será exposto à internet através do proxy reverso (para desempenho e segurança adicionais).
Altere o diretório ativo atual para sites-available:
|
1 |
cd /etc/nginx/sites-available |

Agora, crie um arquivo com o nome de domínio que você deseja expor seu aplicativo. Para demonstração, usaremos example.com:
|
1 |
sudo nano example.com |
Insira o seguinte código no arquivo de bloco:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Aqui, estamos usando proxy_pass para servir o aplicativo web Go no endereço IP do servidor (localhost) na porta 9990.
Para habilitar o bloco do Nginx, crie um symlink (também conhecido como link simbólico) do arquivo para a pasta sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Recarregue a configuração do Nginx para que as alterações entrem em vigor:
|
1 |
sudo nginx -s reload |
Passo 4 – Verificação
Se tudo ocorreu como esperado, então a aplicação web deve agora estar acessível em localhost:9990 e o domínio que configuramos. Abra a URL em um navegador web:
|
1 |
localhost:9990 |

Como esperado, a aplicação está exibindo “Hello World” na tela. Esse é o papel da rota primária. Em seguida, teste a segunda rota visitando a seguinte URL:
|
1 |
localhost:9990/greet/<name> |

A aplicação está retornando com sucesso a mensagem simples de saudação com o nome a partir do parâmetro recebido da URL.
Voilà! Implantamos com sucesso uma aplicação web Go em nosso servidor local!
Considerações Finais
Neste guia, demonstramos a implantação de uma aplicação web Go simples com a ajuda das bibliotecas padrão do Go. Também implantamos um proxy reverso usando o Nginx. Embora a demonstração tenha sido realizada em um servidor local, para um servidor público, é altamente recomendável implementar um certificado SSL para uma exposição segura à internet. Para mais programação em Go, você pode conferir nosso tutorial sobre Compilando e Instalando Programas Go.
Boa computação!


Comentários
Nenhum comentário ainda. Seja o primeiro.