使用阿里云 mqtt serverless 版本超低成本快速实现 webscoket 长链接服务器

本文涉及的产品
简介: 使用阿里云 MQTT Serverless 可轻松实现弹性伸缩的 WebSocket 服务,每日成本低至几元。适用于小程序消息推送的 MQTT P2P 模式。前端需注意安全,避免 AK 泄露,采用一机一密方案。后端通过调用 `RegisterDeviceCredential` API 发送消息。示例代码包括 JavaScript 前端连接和 Java 后端发送。

实现一个 websocket 服务并不难,但是要做到弹性伸缩,而且长期空转实属有点亏。用阿里云 mqtt serverless 来开发就非常方便。每天成本几块钱即可。

我的业务场景是这样:给网页客户端推送一个消息,那么比较适用的就是 mqtt p2p 模式。

前端

注意千万别用官方文档里面的demo,因为会造成 ak 泄漏,需要使用 一机一密方案

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Aliyun Mqtt Websockets</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js" type="text/javascript"></script>
    <script type="text/javascript">
        instanceId = 'post-cn-x0r3oqq4d04';//实例 ID,购买后从控制台获取
        host = 'post-cn-x0r3oqq4d04.mqtt.aliyuncs.com';// 设置当前用户的接入点域名,接入点获取方法请参考接入准备章节文档,先在控制台创建实例
        port = 80;//WebSocket 协议服务端口,如果是走 HTTPS,设置443端口
        topic = 'demo';//需要操作的 Topic,第一级父级 topic 需要在控制台申请
        useTLS = false;//是否走加密 HTTPS,如果走 HTTPS,设置为 true
        accessKey = 'DC.xxx';
        //账号的的 SecretKey,在阿里云控制台查看
        secretKey = 'DC.xxx';
        cleansession = true;
        groupId = 'GID_test';//MQTT GroupID,创建实例后从 MQTT 控制台创建
        clientId = groupId + '@@@1002';//GroupId@@@DeviceId,由控制台创建的 Group ID 和自己指定的 Device ID 组合构成
        var mqtt;
        var reconnectTimeout = 2000;
        var username = 'DeviceCredential|' + accessKey + '|' + instanceId;
        var password = CryptoJS.HmacSHA1(clientId, secretKey).toString(CryptoJS.enc.Base64);

        function MQTTconnect() {
    
            mqtt = new Paho.MQTT.Client(
                host,//MQTT 域名
                port,//WebSocket 端口,如果使用 HTTPS 加密则配置为443,否则配置80
                clientId//客户端 ClientId
            );
            var options = {
    
                timeout: 3,
                onSuccess: onConnect,
                mqttVersion: 4,
                cleanSession: cleansession,
                onFailure: function (message) {
    
                    setTimeout(MQTTconnect, reconnectTimeout);
                }
            };
            mqtt.onConnectionLost = onConnectionLost;
            mqtt.onMessageArrived = onMessageArrived;
            if (username != null) {
    
                options.userName = username;
                options.password = password;
                options.useSSL = useTLS;//如果使用 HTTPS 加密则配置为 true
            }
            mqtt.connect(options);
        }

        function onConnect() {
    
            console.log("连接成功");
        }

        function onConnectionLost(response) {
    
            setTimeout(MQTTconnect, reconnectTimeout);
        };

        function onMessageArrived(message) {
    
            var topic = message.destinationName;
            var payload = message.payloadString;
            console.log("recv msg : " + topic + "   " + payload);
        };
        MQTTconnect();
    </script>
</head>
</html>

这里的 accessKey 和 secretKey 的生成,依赖自己的后端服务返回,原理在 https://help.aliyun.com/zh/apsaramq-for-mqtt/developer-reference/overview-of-unique-certificate-per-device-authentication

后端调用 RegisterDeviceCredential - 为某个设备注册访问凭证 支持在线调试,非常方便。

后端代码

String receiverId = "GID_test@@@1002";
final String p2pSendTopic = parentTopic + "/p2p/" + receiverId;
MqttMessage message = new MqttMessage("hello mq4Iot p2p msg".getBytes());
message.setQos(qosLevel);
mqttClient.publish(p2pSendTopic, message);

完整代码:https://github.com/AliwareMQ/mqtt-demo/blob/main/lmq-java-demo/src/main/java/com/aliyun/openservices/lmq/example/demo/MQ4IoTProducerDemo.java

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
3天前
|
NoSQL 关系型数据库 MySQL
涉及rocketMQ,jemeter等性能测试服务器的安装记录
涉及rocketMQ,jemeter等性能测试服务器的安装记录
16 1
|
14天前
|
网络协议 Windows
Windows Server 各版本搭建 DNS 服务器实现域名正反向解析
Windows Server 各版本搭建 DNS 服务器实现域名正反向解析
|
15天前
|
运维 监控 Serverless
【专栏】无服务器架构,一种云计算模型,让开发者专注编写代码而不必管理服务器(Serverless)
【4月更文挑战第28天】无服务器架构,一种云计算模型,让开发者专注编写代码而不必管理服务器。它基于事件驱动,自动扩展资源并按需计费。优势包括缩短开发周期、优化资源利用、降低成本、提高可用性及简化维护。然而,冷启动延迟、调试困难、性能监控、安全性和学习曲线等挑战仍需解决。随着技术进步,无服务器架构将在科技发展中发挥更大作用。
|
15天前
|
运维 Serverless 文件存储
Serverless 应用引擎产品使用之阿里函数计算中stable. diffusion应用的服务器可以使用那种99元100G一年的道用型nas如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
24 0
|
16天前
|
网络协议 Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之在阿里云函数计算中,服务器调用FC函数时出现 "[Errno -3] Temporary failure in name resolution)" 错误如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
164 4
|
27天前
|
Cloud Native Serverless API
Serverless 成本再优化:Knative 支持抢占式实例
Knative 是一款云原生、跨平台的开源 Serverless 应用编排框架,而抢占式实例是公有云中性价比较高的资源。Knative 与抢占式实例的结合可以进一步降低用户资源使用成本。本文介绍如何在 Knative 中使用抢占式实例。
92678 2
|
1月前
|
网络协议 Java 物联网
阿里云服务器上搭建 MQTT服务
阿里云服务器上搭建 MQTT服务
|
1月前
|
Linux
centos 查看服务器信息 版本cpu
centos 查看服务器信息 版本cpu
20 0
|
3天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
22 0
|
22小时前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
http://www.vxiaotou.com