Clone este repositório
Monte o repositório e execute este comando para instalar dependências
make setup
make run
localhost:8080 Depois de executar o servidor, abra seu cliente WebSocket. Se você não tiver, tente Websocket King Extension for Chrome.
Conecte -se ao ws://localhost:8080/socket , você será recebido pelo servidor.
Server: Welcome! Your ID is f0ab664a-5af3-4f8d-8afe-eb93085267e4
{
"action": "subscribe",
"topic": "world"
}
{
"action": "publish",
"topic": "world",
"message": "Hello world!"
}
{
"action": "unsubscribe",
"topic": "world"
}
Você pode estar perguntando "Por que devo usar a Websocket em vez de REST API"?
O REST API usa HTTP, que só pode enviar resposta uma vez por solicitação.
Enquanto isso, o WebSocket pode ser usado para comunicação bidirecional persistente sem a necessidade de restabelecer a conexão sempre.
Isso pode ser útil em algum cenário, como bate-papo ou sub-sub-sub.
Aqui está o diagrama para visualizar a diferença entre HTTP e WebSocket.

Este fluxograma descreve como esse servidor funciona. 
cmd
└── main
└── main.go
internal
└── websocket
└── handler.go
└── model.go
└── server.go
Main.GO : o arquivo principal a ser executado.
Handler.Go : lida com a conexão aberta/fechada e passe a mensagem para o servidor.
Model.GO : armazena os modelos usados pelo servidor.
Server.GO : executa uma ação específica de acordo com a mensagem do cliente, também contém funções necessárias para o servidor para funcionar corretamente como um servidor WebSocket.
Este repositório está longe de ser o ideal. É apenas uma prova de conceito.
Embora esse repositório esteja próximo de um sub-sub-sub, ele ainda pode ser usado para um servidor de bate-papo.
Por exemplo, podemos adicionar uma função no soquete conectado para que o cliente seja automaticamente assinando seu próprio ID como um tópico. Outros clientes usarão o ID desse usuário como um tópico para publicar uma mensagem.
Tentei criar essa solução combinada com a autorização para impedir que outros usuários se inscrevam no ID de outros e funciona.
Este repositório é inspirado em Golang-Pubsub por @tabvn