Рубрики
Без рубрики

Добавьте режим реального времени в свое Java-приложение с помощью службы Azure SignalR

Как создать приложение для чата в реальном времени с помощью Spring Boot и службы Azure SignalR. С тегами java, azure, показать разработчика, веб-разработчика.

Azure SignalR – это полностью управляемый сервис, который позволяет легко добавлять масштабируемые сообщения в реальном времени в любое приложение с использованием веб-узлов и других протоколов. Служба сигналов имеет интеграции для ASP.NET и функции Azure. Другие серверные приложения могут использовать RESTful HTTP API службы.

В этой статье мы рассмотрим преимущества использования службы Azure SignalR для связи в режиме реального времени и способы ее интеграции с приложением чата Java Spring Boot с использованием HTTP API службы.

Лазурный сигнал Обзор услуг

Хотя многие библиотеки или фреймворки поддерживают WebSockets, правильное масштабирование приложения реального времени не является тривиальной задачей; обычно требуется настройка Redis или другой инфраструктуры в качестве объединительной платы. Лазурный сигнал Сервис выполняет всю работу по управлению клиентскими подключениями и масштабированию. Мы можем интегрироваться с ним, используя упрощенный API.

Служба сигналов использует протокол реального времени SignalR, который был популяризирован ASP.NET . Он обеспечивает модель программирования, которая абстрагирует базовые каналы связи. Вместо того, чтобы самостоятельно управлять отдельными подключениями к WebSocket, мы можем отправлять сообщения всем, одному пользователю или произвольным группам подключений с помощью одного вызова API.

Сигнал также согласовывает наилучший протокол для каждого соединения. Он предпочитает использовать WebSockets, но если он недоступен для данного соединения, он автоматически вернется к событиям, отправленным сервером, или к длительному опросу.

Существует множество клиентских пакетов SDK SignalR для подключения к Azure SignalR Услуга. Они доступны в .NET , JavaScript/Машинописный текст , и Ява . Существуют также сторонние клиенты с открытым исходным кодом для таких языков, как Swift и Python .

Лазурный сигнал Сервис RESTful HTTP API

Серверные приложения, такие как приложение Java Spring, могут использовать HTTP API для отправки сообщений из службы Signal подключенным клиентам. Существуют также API-интерфейсы для управления членством в группах; мы можем помещать пользователей в произвольные группы и отправлять сообщения группе подключений.

Документацию по API можно найти на GitHub . Мы будем использовать эти API-интерфейсы в остальной части этой статьи.

Интеграция службы сигналов с Java

Существует четыре основных шага для интеграции службы сигналов с приложением.

  • Создайте экземпляр службы Azure SignalR
  • Добавьте конечную точку API ( /согласование ) в наше Java-приложение для клиентов SignalR, чтобы получить токен для подключения к службе SignalR
  • Создайте соединение с SDK клиента SignalR (мы будем использовать приложение JavaScript в браузере).
  • Отправляйте сообщения из своего Java-приложения

Как это работает

  1. Пакет SDK клиента SignalR запрашивает URL-адрес службы сигналов и маркер доступа, используя конечную точку /согласования
  2. Клиентский SDK автоматически использует эту информацию для установления соединения с сервисом Signal
  3. Приложение Java использует API-интерфейсы RESTful службы SignalR для отправки сообщений подключенным клиентам

Создайте экземпляр службы сигналов

Мы можем создать бесплатный экземпляр службы Signal с помощью командной строки Azure или портала Azure. Для работы с REST API настройте его на использование бессерверного режима.

Для получения дополнительной информации о том, как создать экземпляр службы сигналов, ознакомьтесь с документы .

Добавьте конечную точку “согласования”

Сигнальная служба защищена ключом. Мы никогда не хотим раскрывать этот ключ нашим клиентам. Вместо этого в нашем внутреннем приложении мы генерируем веб-токен JSON (JWT), который подписывается этим ключом для каждого клиента, который хочет подключиться. Клиент SignalR отправляет запрос на конечную точку HTTP, которую мы определяем в нашем приложении, для получения этого JWT.

Это конечная точка согласования в нашем приложении Spring Boot. Он генерирует токен и возвращает его вызывающему. Мы можем (необязательно) встроить идентификатор пользователя в токен, чтобы отправлять сообщения, адресованные этому пользователю.

@PostMapping("/signalr/negotiate")
public SignalRConnectionInfo negotiate() {
    String hubUrl = signalRServiceBaseEndpoint + + hubName;
    String userId = "12345"; // optional
    String accessKey = generateJwt(hubUrl, userId);
    return new SignalRConnectionInfo(hubUrl, accessKey);
}

Обратите внимание, что маршрут заканчивается в /вести переговоры . Это требование, так как это соглашение, используемое клиентами Signal.

Метод генерации JWT использует библиотеку Java JWT (jwt) и подписывает ее служебным ключом Signal. Обратите внимание, что мы указываем аудитории URL-адрес концентратора.

Концентратор – это виртуальное пространство имен для наших сообщений. У нас может быть более одного концентратора в одной Службе передачи сигналов. Например, мы можем использовать концентратор для сообщений чата, а другой – для уведомлений.

private String generateJwt(String audience, String userId) {
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);

    long expMillis = nowMillis + (30 * 60 * 1000);
    Date exp = new Date(expMillis);

    byte[] apiKeySecretBytes = signalRServiceKey.getBytes(StandardCharsets.UTF_8);
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

    JwtBuilder builder = Jwts.builder()
        .setAudience(audience)
        .setIssuedAt(now)
        .setExpiration(exp)
        .signWith(signingKey);

    if (userId != null) {
        builder.claim("nameid", userId);
    }

    return builder.compact();
}

Создайте клиентское соединение

На нашей веб-странице мы вводим пакет SDK JavaScript SignalR и создаем соединение. Мы добавляем один или несколько прослушивателей событий, которые будут вызываться при получении сообщения с сервера. Наконец, мы начинаем подключение.


const connection = new signalR.HubConnectionBuilder()
  .withUrl(`/signalr`)
  .withAutomaticReconnect()
  .build()

connection.on('newMessage', function(message) {
  // do something with the message
})

connection.start()
  .then(() => data.ready = true)
  .catch(console.error)

Обратите внимание, что мы использовали URL-адрес для согласования без сегмента /negotiate . Клиент SDK SignalR автоматически пытается выполнить согласование, добавляя /согласовать с URL-адресом.

Когда мы запускаем приложение и открываем вашу веб-страницу, мы должны увидеть успешное соединение в консоли браузера.

Отправлять сообщения из приложения Java

Теперь, когда наши клиенты подключены к сервису Signal, мы можем отправлять им сообщения.

Наш образец представляет собой приложение для чата, поэтому у нас есть конечная точка, к которой наше внешнее приложение будет обращаться для отправки сообщений. Мы используем метод, аналогичный методу /переговоров конечная точка для создания JWT. На этот раз JWT используется в качестве токена на предъявителя в нашем HTTP-запросе к службе для отправки сообщения.

@PostMapping("/api/messages")
public void sendMessage(@RequestBody ChatMessage message) {
    String hubUrl = signalRServiceBaseEndpoint + "/api/v1/hubs/" + hubName;
    String accessKey = generateJwt(hubUrl, null);

    Unirest.post(hubUrl)
        .header("Content-Type", "application/json")
        .header("Authorization", "Bearer " + accessKey)
        .body(new SignalRMessage("newMessage", new Object[] { message }))
        .asEmpty();
}

И теперь наше приложение должно работать! Чтобы поддерживать сотни тысяч подключений, нам просто нужно зайти на портал Azure и увеличить количество подключений с помощью ползунка.

Ресурсы

Оригинал: “https://dev.to/azure/add-real-time-to-your-java-app-with-azure-signalr-service-3p8”