软件开发人员从0到1实现物联网项目:项目架构的思考
文章目录
- 前言
- 单体应用足矣
- 摒弃传统的微信对接
- 后期的维护投入
- 上真正的“云”:云托管
- 0服务器免运维
- 免费的CDN和DDoS防护
- 技术架构
- 小结
前言
因为种种原因,《软件开发人员从0到1实现物联网项目》这个项目的进度停滞了将近一个月。
鉴于该项目的前期开发和后期的维护就我一人,为避免开发效率低下和后期维护中的潜在问题。我针对项目架构进行了初步的思考,从开发模式到后期维护进行了全面的梳理。基于这些思考,最后整理出了一份简单的技术架构图。有什么不足之处还请各位大佬不吝赐教,欢迎提出宝贵的意见和建议。
单体应用足矣
前两年的市场绝对是微服务的天下,开发个什么系统,动不动就是微服务,几乎已经成为每个项目的标配。
在我看来,微服务只适合业务规模大、团队规模庞大的项目。主要是一个大项目在单体应用下确实会存在很多问题,就像2007年的淘宝网一样:
整个淘宝网是一个几百兆字节的WAR包,大大小小的功能模块超过200个。几百人维护一个WAR包就会带来很多问题:
- 项目团队间协同成本太高,业务响应越来越慢。
- 应用复杂度超出负载认知,没有一个人能完全清除每一个功能和业务流程。
- 数据库连接能力很难扩展,数据库的连接数量会随着应用实例的增加而捉襟见肘。
- 错误难于隔离,任何一个小的问题都会造成整个实例崩溃。
- 应用扩展成本高,通常出现业务瓶颈时都是某几个功能模块影响的,但是需要增加一个完整的应用实例,带来的是额外的资源消耗。
每一次的功能升级都要牵一发而动全身,这种情况下就不得不拆分系统。
自助棋牌室系统或者说是无人看守门店系统,一个小小的项目,功能并不多。所以,单体架构,足矣。否则,带来的只有繁琐的开发部署流程以及高昂的运维成本。
摒弃传统的微信对接
本项目的用户终端主要包含微信小程序和后台管理Web端。其中小程序服务于用户和商家,Web端则为商家和后期维护人员提供管理工作。
App一开始就没在考虑范围。( App 下载门槛高,打开率低)
在小程序与后端服务的交互方式,我决定使用云调用,主要是为了简化代码开发流程和规避不必要的风险。
以登录功能为例,使用传统的微信对接方式,需要涉及复杂的步骤。如下图

虽然有很多SDK可以简化和微信平台的对接流程,但还是消除不了相关的工作和潜在的风险。毕竟,每增加一个处理环节,都可能会增加潜在的风险。
而在小程序端如果通过云调用向云托管服务发起请求时,后端服务会在header中获得该请求用户的全部信息,比如openid、unionid等。上图的 wx.login 获取code置换登录的流程就没有存在的必要了,也不用维护再微信接口调用凭据、token。
后期的维护投入
虽说是单体应用,但也是可以具备高可用、高并发能力的。除了程序自身的性能外,还需引入很多机制来辅助。例如实施负载均衡、实现数据库的读写分离以及确保应用实例的弹性扩缩容等。
但是,这些机制的引入会消耗自身的一些精力,尤其是后期复杂的维护工作。鉴于该系统后期的维护就我一人,为了降低维护成本果断上“云”。
上真正的“云”:云托管
在了解小程序开发期间,我发现了云开发和云托管这两个强大的工具。如果说云开发是专为小程序开发量身打造的,那在我看来,云托管可以算是真正的“云”了。
简单来讲,云托管就是:把你的程序交给云管理,免去人工运维。
0服务器免运维
云托管的免运维具体体现在以下几点:
- 自带功能:云托管自带监控告警、日志服务等后期运维所需功能。
(实现哪个功能不需要工作量?) - 自动扩缩容:根据流量多少和自身承载消耗动态的进行扩缩容,从而保证服务高可用、高稳定,也无需为闲置资源付费。
(既不用自己管理计算节点又可以避免额外的资源成本,而且,高可用和高并发是不是解决了?) - DevOps自动化: 提供流水线能力,可以实现从代码仓库到服务发布的全自动流程。还提供灰度发布、版本回滚这样的部署能力。
(不用自己打包部署或者自己搭建DevOps环境)
就是说,单单这三点能为我省去多少工作量。如果应用部署到云服务器上,哪一个工作量不够我喝上一壶?我还用担心半夜的服务监控告警吗?
当然,云托管不只是对应用程序的托管,还提供了Serverless形态的Mysql,也可自动扩缩容,避免产生瓶颈。
(又省了Mysql的运维工作)
不过,这都不是重点,重点是云托管还提供了免费的CDN和DDoS防护。
免费的CDN和DDoS防护
CDN和DDoS防护都非常重要,我对此深有体会。在我的职业生涯中被CDN和DDoS上过一课。一次是在新产品上线后,遭到竞争对手的恶意攻击引起的系统崩溃。另一次是因为抢购功能的上线,带宽被刷爆,导致页面加载不出来流失了大量用户。
得亏老板有钱,一个月几万元的DDoS的高防套餐说买就买。像我这样的情况或者一些初创公司是承担不起的。
但是,把程序交给云托管就不一样了,借助云厂商的资源,DDoS攻击者打不起、也打不挂。重要的是开发者不用为此付费。
这么看来,云托管的性价比是非常高的。
技术架构
项目依托微信云托管,所以整体的复杂度会小很多。
除了必要的MySQL外,只需引入Redis,主要是要做一个无状态服务,以便横向扩展。
在物联网方面,还是考虑接入物联网开发平台。真得会减少很多工作量和后期的维护,而且像国内的这几个云厂商都是有公共免费的额度可以使用,所以在开发阶段不会投入成本。
下面是基于云托管的技术架构图

小结
对于独立开发者和初创公司而言,微信云托管绝对算是一个得力助手。不仅简化了微信API的接入,还省了买服务器的钱。像灰度发布、监控实例、服务器规格调整这些头疼的事儿,统统都不用费心。还有那种一个月要几万块才能搞定的DDoS防护,不用理会。美哉!
(不是广告)
准备进入开发阶段…
相关文章:
软件开发人员从0到1实现物联网项目:项目架构的思考
文章目录 前言单体应用足矣摒弃传统的微信对接后期的维护投入上真正的“云”:云托管0服务器免运维免费的CDN和DDoS防护 技术架构小结 前言 因为种种原因,《软件开发人员从0到1实现物联网项目》这个项目的进度停滞了将近一个月。 鉴于该项目的前期开发和…...
Java--集合进阶 Collection,迭代器,lambda表达式
集合体系结构 Collection:单列集合 LIst系列集合:添加的元素是有序、可重复、有索引 Set系列集合:添加的元素是无序、不重复、无索引 Collection集合常用方法 | 方法名 | 说明 || :---…...
STM32G474之DAC
STM32G474分别使用CORDIC硬件和“math.h”的正弦值,从DAC1和DAC2输出。 1、DAC特点 PA4的附加功能为DAC1_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。 PA6的附加功能为DAC2_OUT1,无需映射,直接将…...
哈希表的底层实现(2)---C++版
目录 链地址法Separate Chaining——哈希桶的模拟实现 超大重点分析: 两种方法对比 由于在上次的哈希表的底层实现(1)---C版已经详细的阐述了相关的结构和原理,哈希表的实现方法主要分为链地址法和开放定址法。开放定址法上次已经实现过了,…...
算法知识点————【LRU算法】
思想:淘汰最久没有使用的 应用场景:手机清后台的时候先清最久没有使用的应用 设计一种数据结构:接收一个 capacity 参数作为缓存的最大容量,然后实现两个 API,一个是 put(key, val) 方法存入键值对,另一个是…...
记一次MySQL视图查询优化的经验
背景:库房系统项目迁移,两个版本的结构发生了很大变化,新版本的库存系统在开发阶段由于数据量小,根据看不出查询的性能问题,还沾沾自喜的想新版本多好。但是在做同步之后(规则变更,需要插入很多…...
Cloudways搭建WordPress外贸独立站完整教程(1)
验证邮件发送完成后,就等待Cloudways的回复邮件,一般24小时之内就会收到激活的邮件。 Cloudways账号升级 激活成功后还需要账户升级,Cloudways提供了为期3天的免费试用体验。如果在试用期结束之前未绑定信用卡以升级账户,试用期…...
Delphi5数据控制组件——查询
文章目录 效果图参考查询Free方法Close方法总结通俗理解 完整代码 效果图 参考 本文是在上一篇的基础上,将查询页面重新写一次。 查询 {点击查询} procedure TForm2.Button1Click(Sender: TObject); vartj,tj1,tj2,tj3,tj4,tj5,tj6,tj7:string; begin//按照工号查…...
git pull之后发现项目错误,如何回到之前的版本方法
目录 首先我们打开小程序的cmd的黑窗口,git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已经返回了之前的6daaa2e的版本了 首先我们打开小程序的cmd的黑窗口,git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已…...
防跌倒识别摄像机
防跌倒识别摄像机 是一种结合了人工智能技术和监控摄像技术的先进设备,旨在通过实时监测和分析监控画面中的行为动作,及时发现并预防跌倒事件的发生。这种摄像机在医疗、养老院、家庭等场所有着广泛的应用前景。 防跌倒识别摄像机在医疗领域具有重要意义…...
MyQql性能诊断与实践
获取更多免费资料,见下图...
有序序列判断
描述 输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据范围:3 < n< 50 序列中的值都满足 1< val < 100 输入描述: 第一行输入一个整数N…...
【Kubernetes知识点问答题】健康检查
目录 1. Kubernetes 对集群 Pod 和容器健康状态如何进行监控和检测的。 2. 解释 LivenessProbes 探针的作用及其适用场景。 3. 解释 ReadinessProbe 探针的作用及其适用场景。 4. 解释 StartupProbe 探针的作用及其适用场景。 5. 说明 K8s 中 Pod 级别的 Graceful Shutdown…...
【Prometheus】PromQL数据类型以及常用的计算函数用法详解
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
STM32高级定时器生成互补PWM的原理与代码实现
文章目录 前言一 CubeMx配置1.1 TIM1 Mode and Configuration1.2 Paramter Settings 二 程序代码三 仿真分析总结 前言 互补 PWM(Complementary PWM)是指一对逻辑状态互为反相的 PWM(脉冲宽度调制)信号。这种信号配置常见于电机控…...
双指针题总结
双指针题总结 hot100移动零盛水最多的容器三数之和接雨水最小覆盖子串 hot100 移动零 题目链接: 283.移动零 代码: class Solution {public void moveZeroes(int[] nums) {int slow 0;for (int fast 0; fast < nums.length; fast ){if (nums[fas…...
[数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8068 标注数量(xml文件个数):8068 标注数量(txt文件个数):8068 标注…...
JVM3-双亲委派机制
目录 概述 作用 如何指定加载类的类加载器? 面试题 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加载器 概述 由于Java虚拟机中有多个类加载器,双亲委派机制的核心是解决一个类到底由谁加载的问题 双亲委派机制ÿ…...
经典文献阅读之--DEviLOG(使用合成数据和真实世界数据的数据驱动占用网格映射基于Transformer的BEV方案量产方案)
0. 简介 在自动驾驶汽车(AV)的感知任务中,数据驱动的方法往往优于传统方法。这促使我们开发了一种基于数据的方法来从激光雷达测量中计算占用网格地图(OGM)。我们的方法扩展了之前的工作,使得估计的环境表…...
ssh之登录服务器后,自动进入目录(四十七)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
