1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xxssyyyyssxx-websocket-springboot-starter

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Websocket-springboot-starter

Проект представляет собой

Websocket-springboot-starter для разработки websocket.

Проект в основном подходит для серверных сценариев, где данные изменяются и требуется активно уведомлять клиента, например, веб-чаты, уведомления об изменениях данных на веб-странице и т. д. Он решает проблему двусторонней связи между сервером и клиентом и может заменить технологию опроса ajax. В сценарии активного уведомления сервера он может значительно снизить сложность архитектуры.

При разработке WebSocket обычно возникают две проблемы:

  1. Как хранить Session?
  2. Как реализовать кластеризацию?

Обычно мы используем Map для хранения Session, вы увидите что-то вроде этого в классе @ServerEndPoint:

public static final Map<String , Session> sessions = new ConcurrentHashMap<>();

Но это может быть не очень удобно расширять. Исходя из этого, этот проект рассматривает обработку кода Session как интерфейс WebSocketManager, который реализует одноузловую и кластерную версии, так что использование в двух сценариях полностью одинаково.

public interface WebSocketManager {
    /**
     * Имя в контейнере
     */
    String WEBSOCKET_MANAGER_NAME  = "webSocketManager";
    /**
    * Получить websocket session по идентификатору
    * @param identifier Идентификатор
    * @return WebSocket
    */
    WebSocket get(String identifier);

    /**
    * Поместить websocket session
    * @param identifier Идентификатор
    * @param webSocket websocket
    */
    void put(String identifier, WebSocket webSocket);

    /**
    * Удалить
    * @param identifier Идентификатор
    */
    void remove(String identifier);

    /**
    * Получить все сохраненные WebSocket на текущем компьютере
    * @return Карта WebSocket
    */
    Map<String , WebSocket> localWebSocketMap();

    /**
    * Подсчитать общее количество онлайн-пользователей
    * @return Общее количество онлайн-пользователей
    */
    default int size(){
        return localWebSocketMap().size();
    }

    /**
    * Отправить сообщение определенному человеку
    * @param identifier Идентификатор
    * @param message Сообщение
    */
    void sendMessage(String identifier, String message);

    /**
    * Широковещательное сообщение
    * @param message Сообщение
    */
    void broadcast(String message);

    /**
    * Вызов функции при получении сообщения от WebSocket
    * @param identifier Идентификатор
    * @param message Содержание сообщения
    */
    void onMessage(String identifier , String message);

    /**
    * Определить, является ли сообщение в OnMessage сообщением ping в сообщении от клиента
    * @param identifier Идентификатор
    * @param message Сообщение
    * @return Является ли это сообщением ping
    */
    default boolean isPing(String identifier , String message){
        return "ping".equalsIgnoreCase(message);
    }

    /**
    * Вернуть сообщение pong
    * @param identifier Идентификатор
    * @param message Сообщение
    * @return Сообщение pong
    */
    default String pong(String identifier , String message){
        return "pong";
    }
}

Кластерная версия основана на функции публикации и подписки Redis, почему она такая сложная? Нельзя ли просто сохранить его в Redis, как HttpSession? Нет, потому что WebSocket Session нельзя сериализовать. java.io.NotSerializableException.

Используйте интерфейс WebSocketManager при использовании, поддерживающий одноузловые (на основе памяти) и кластерные (на основе публикации и подписки Redis) версии.

Архитектура программного обеспечения

  1. Настраивается на основе springboot websocket, основная функция заключается в управлении состоянием WebSocket session, с одноузловой и кластерной возможностями.
  2. Можно настроить собственный ServerEndPoint и WebSocketManager.

JFinal или другие веб-архитектуры для разработки WebSocket см. https://gitee.com/xxssyyyyssxx/jfinal-websocket.

Инструкция по установке

  1. Версия 8.2.4 и ниже использует репозиторий maven
compile 'top.jfunc.websocket:websocket-springboot-starter:1.8.2.4'
  1. После версии 8.4 используйте jitpack для управления
maven { url 'https://jitpack.io' }
compile 'com.gitee.xxssyyyyssxx:websocket-springboot-starter:1.8.4'

Использование см. https://gitee.com/xxssyyyyssxx/websocket-demo.

Инструкции по использованию

/**
* 1. Расширить top.jfunc.websocket.BaseWebSocketEndpoint
* 2. Отметить @Component @ServerEndpoint
* @author xiongshiyan
*/
@Component
@ServerEndpoint(value ="/websocket/connect/{identifier}")
public class WebSocketEndpoint extends top.jfunc.websocket.BaseWebSocketEndpoint{
}
@EnableMemWebSocketManager для одноузлового управления
или
@EnableRedisWebSocketManager использовать механизм кластера Redis для реализации кластеризации
@Configuration
public class WebSocketConfig {
/**
 * См. https://www.cnblogs.com/betterboyz/p/8669879.html
 * Сначала необходимо внедрить ServerEndpointExporter, этот bean автоматически зарегистрирует Websocket endpoint, объявленный с помощью аннотации @ServerEndpoint.
 * Обратите внимание, что если вы используете независимый контейнер сервлетов, а не встроенный контейнер springboot напрямую, не вводите ServerEndpointExporter,
 * потому что он будет предоставлен и управляется контейнером, иначе будет сообщено о повторяющейся ошибке endpoint.
 */
@ConditionalOnProperty(prefix = "server.websocket.exporter" ,
                                name = "enable" ,havingValue = "true")
@Bean
public ServerEndpointExporter serverEndpointExporter() {
    return new ServerEndpointExporter();
}


/**
 * Можно использовать свой собственный WebSocketManager, обратите внимание на фиксированное имя
 */
/*@Bean(WebSocketManager.WEBSOCKET_MANAGER_NAME)
public WebSocketManager webSocketManager(){
``` Если используется **Nginx** в качестве балансировщика нагрузки, то необходимо добавить в конфигурацию:

Nginx обратный прокси должен поддерживать WebSocket, для этого нужно настроить несколько заголовков, иначе при подключении будет ошибка 404. proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s; //при небольшом времени легко разорвать соединение


Что касается мониторинга сердцебиения, можно настроить его самостоятельно, имитируя `top.jfunc.websocket.config.WebSocketSchedulingConfig`. Добавьте три параметра конфигурации для включения мониторинга сердцебиения:
- webSocket.heartCheck.enabled=true
- webSocket.heartCheck.timeSpan=1000
- webSocket.heartCheck.errorToleration=30

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

1. На основе Springboot WebSocket выполнено индивидуальное оформление, основная функция которого — управление состоянием WebSocket-сессии с поддержкой работы на одном сервере и в кластере. 2. Можно настроить собственные ServerEndpoint и WebSocketManager. При использовании нужно обращаться к интерфейсу WebSocketManager, который поддерживает рабо... Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/xxssyyyyssxx-websocket-springboot-starter.git
git@api.gitlife.ru:oschina-mirror/xxssyyyyssxx-websocket-springboot-starter.git
oschina-mirror
xxssyyyyssxx-websocket-springboot-starter
xxssyyyyssxx-websocket-springboot-starter
master