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-приложения
Как это работает
- Пакет SDK клиента SignalR запрашивает URL-адрес службы сигналов и маркер доступа, используя конечную точку
/согласования
- Клиентский SDK автоматически использует эту информацию для установления соединения с сервисом Signal
- Приложение 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 и увеличить количество подключений с помощью ползунка.
Ресурсы
- Исходный код нашего приложения для чата
- Лазурный сигнал Обзор услуг
- Учебное пособие: API REST службы SignalR из консольного приложения на C#
Оригинал: “https://dev.to/azure/add-real-time-to-your-java-app-with-azure-signalr-service-3p8”