Клонировать это хранилище
Установите репозиторий и запустите эту команду, чтобы установить зависимости
make setup
make run
localhost:8080 После запуска сервера откройте клиент WebSocket. Если у вас их нет, попробуйте расширение Websocket King для Chrome.
Подключитесь к ws://localhost:8080/socket , вас будет встречен сервером.
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"
}
Вы можете спросить: «Зачем мне использовать WebSocket вместо API REST»?
REST API использует HTTP, который может отправлять ответ только один раз на запрос.
Между тем, WebSocket может использоваться для постоянной двунаправленной связи без необходимости восстановления соединения каждый раз.
Это может быть полезно в некотором сценарии, например, в чате или пабе.
Вот диаграмма для визуализации разницы между HTTP и WebSocket.

Эта блок -схема описывает, как работает этот сервер. 
cmd
└── main
└── main.go
internal
└── websocket
└── handler.go
└── model.go
└── server.go
main.go : основной файл, который будет выполнен.
handler.go : обрабатывает подключение/закрыть соединение и передайте сообщение на сервер.
model.go : хранит модели, используемые сервером.
Server.go : запускает конкретное действие в соответствии с клиентским сообщением, также содержит функции, которые необходимы серверу для правильной работы в качестве сервера WebSocket.
Этот репозиторий далеко не идеален. Это просто доказательство концепции.
В то время как этот репозиторий близок к пабскому подчинению, его все еще можно использовать для сервера чата.
Например, мы можем добавить функцию в подключенную к сокету, чтобы клиент был автоматически подписаться на свой идентификатор в качестве темы. Затем другие клиенты будут использовать идентификатор этого пользователя в качестве темы для публикации сообщения.
Я попытался создать такое решение в сочетании с авторизацией, чтобы не допустить подписки на идентификатор других, и оно работает.
Этот репозиторий вдохновлен Golang-Pubsub от @tabvn