终端软件架构说
目录
零:前言
一,基于服务的架构
二,基于多进程多线程的架构
三,以数据为中心的架构
四,类Android的分层架构设计
五,总结
零:前言
谈到架构,可能大家的第一感觉是信息系统的架构,比如搞Web、Java相关的系统。其实不然,架构存在于计算机相关系统的各个部分,不论是底层还是上层,不论是单机程序还是联网系统,都涉及架构,只不过大家关注的重点不同而已。比如,CPU内部实现我们多认为是硬件设计,但其实是涉及架构的,而且架构很重要。本质上将,架构是很多决策的组合。做一件事,为什么选择这种策略方案,而放弃另外一种方案,这就是架构师要做的事情。
虽然架构是一个比较宽泛的概念,但是,架构师却是具体的。要成为一位合格的架构师,需要掌握不少的专业技能,这是不争的事实。架构师需要对自己面对的领域,在一定的抽象层次上,要有足够的大局观,并具有全局的掌控能力。
上面说的都有点虚,这里我们缩小范围,主要说说终端设备上的软件架构。
博主最近离职了,于是有点时间整理之前的资料。回顾做终端开发这十几年,发现每一款产品都采用了不同的架构。更发现每一种架构,都似乎比较契合当时的产品特点(至少回过头来看,个人感觉是符合的)。这里整理一下,做个总结。
在正式上架构图之前,补充两点。终端软件,尤其是涉及嵌入式开发,往往既涉及硬件又涉及软件。特别是功能比较多的嵌入式产品。极端点,像Android,就是这样一个典型代表。较多的硬件关联还比较好理解,这里强调的软件,意义何为?其实,主要是说,这类设备上的软件开发,跟桌面和服务器端的软件开发,差别并不大。操作系统、数据库、网络、多媒体的掌握,可能一样都不能少,另外呢,对建模方法、设计模式的应用上,跟x86上的开发,也并没有太大差别。之前博主在谈论架构时,提到的相关技术,就这里所提场景而言,是都需要掌握的。
参见:剑指架构师--不是前驱还是后驱的问题,你需要四驱_龙赤子的博客-CSDN博客
做Java类开发的人员,看了这些,可能很难想象,做嵌入式开发,也需要掌握这些技能。
好了,回归主题,下面博主就说说自己做过的四款产品的架构情况。
一,基于服务的架构
整理的框图如下:

这是一款家庭网关产品。因为涉及很多网络服务,所以是基于开源路由器DDWRT(现在流行的分支是OpenWRT)开发的。整个系统有一个大的控制模块,类似状态机管理,然后有很多的小服务,许多功能就是这些服务的组合。状态机接收用户功能请求,决定关闭或启动哪些服务,来实现功能要求。服务本身也做了封装,提供了启动、停止、重启等基本接口。
基本我们也能感受到,在这种具有很多网络相关功能的产品中,采用服务化的架构,整体而言,还是比较贴合的。很多开源软件被简单二次封装后,就可以直接发挥作用,减少了开发量。
二,基于多进程多线程的架构
同样,先上图:

这是一款IPTV产品。不同于上面的网关产品,很多功能有标准化的感觉,这种产品,功能都是自家定义的。所以,开源的组件更多是做底层支撑,并不能直接用了面向用户,所以就做了二次封装。为了简化使用,产品提供了一个简单的框架化封装。大家基于该框架化封装,能够比较灵活的实现各自的功能模块,同时由于标准接口的存在,功能之间的通信,也比较方便。总体而言,是一个平衡复杂度和成本及周期的选择。博主也有文章专门介绍这块:基于多进程架构的嵌入式软件框架研究与实现_龙赤子的博客-CSDN博客_多进程软件架构
三,以数据为中心的架构

这是一个家庭媒体网关类产品。同样是网关产品,但是跟之前的家庭网关产品差别较大。之前的网关产品,网络功能本身占比比较大,额外的提供了一个独立的媒体功能。但是,这款产品,媒体占据了主要功能,网络部分则只是正常的通信基础。这里媒体网关的意思是媒体资源的集散地,用户可以通过各种手段,从该设备上获取媒体。比如,使用手机通过该产品看电影(电影在该媒体网关上,手机只是充当了屏幕)。另外,也可以将屏幕转移到电视、电脑。
简单了解产品后,我们来看其架构。这里采用了以数据为中心的架构。这里的数据,主要指媒体资源。数据从哪里来,经过哪些路径,到哪里去,是架构主要关注的点。所以,架构中,根据不同的场景,设计了数据流程图,然后围绕数据流,做相关的辅助设计。在整个数据流中,需要什么支持,就增加什么模块。比如编解码等。
这个跟很多媒体处理类产品的通用思路是一致的。
四,类Android的分层架构设计

类似Android,提供硬件抽象、框架、服务等层次,这款富媒体功能产品,也采用了分层的架构。对各种开源协议和软件,都是二次封装后,提供平台层供业务层来使用。相比之前的产品,封装层次更深。这是为了更好的应对不同硬件平台,不同的业务而做出的决策。
因为产品本身的功能特点跟Android类似,虽然不是以一个一个APP的表现形式来提供功能,但是内置的一个一个的功能点,就像Android上的APP,多而杂。这种情况,使用上述的分层架构更合适,对于功能的扩展的支持,也会更加有力。
五,总结
从上面几种架构的介绍,我们可以看出,没有什么通用的、最好的架构,只有最合适的架构。架构是一组决策,它的构成,不仅取决于产品本身的特点,还受组织结构的影响(人员构成、技术特点等)。能够灵活运用基础知识,因地制宜的做出选择,这样形成的架构才是好架构。
相关文章:
终端软件架构说
目录 零:前言 一,基于服务的架构 二,基于多进程多线程的架构 三,以数据为中心的架构 四,类Android的分层架构设计 五,总结 零:前言 谈到架构,可能大家的第一感觉是信息系统的…...
LearnOpenGL-入门-你好,三角形
本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网:https://learnopengl-cn.github.io/ 文章目录图形渲染管线基本介绍着色器…...
SOEM 源码解析 ecx_init_redundant
/* Initialise lib in redundant NIC mode* 在冗余网卡模式下初始化lib库* param[in] context context struct* 上下文结构体* param[in] redport pointer to redport, redundant port data* 指向冗余端口的指针ÿ…...
网页唤起 APP中Activity的实现原理
疑问的开端大家有没有想过一个问题:在浏览器里打开某个网页,网页上有一个按钮点击可以唤起App。这样的效果是怎么实现的呢?浏览器是一个app;为什么一个app可以调起其他app的页面?说到跨app的页面调用,大家是…...
【操作系统】概述
基本特征 1. 并发 并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。 并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。 操作系统通过引入进程和线程,使得程序能够并发运行 2. 共享 共享…...
Flume三种组件的选择对比
文章目录1.source2.channel3.sink1.source Source: 数据源:通过source组件可以指定让Flume读取哪里的数据,然后将数据传递给后面的 channel Flume内置支持读取很多种数据源,基于文件、基于目录、基于TCP\UDP端口、基于HTTP、Kafka的 等等、当然了&#x…...
响应性基础API
一.什么是proxy和懒代理?什么是proxy?proxy对象是用于定义基本操作的自定义行为(如:属性查找,赋值,枚举,函数调用等等)。什么是懒代理?懒代理:在初始化的时候不会进行全部代理,而是…...
剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 难度:easy\color{Green}{easy}easy 题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1->2->4, 1->3->4 输出:1…...
顿悟日记(一)
目录2023年1月顿悟日记:2023年2月24日顿悟日记:2023年2月25日顿悟日记:2023年2月26日顿悟日记:顿悟的经历是如此的奇妙,且让人亢奋的事情。 2023年1月顿悟日记: 1.我是面向对象还是面向过程? …...
前端卷算法系列(二)
前端卷算法系列(二) 回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样…...
网络应用之HTTP响应报文
HTTP响应报文学习目标能够知道HTTP响应报文的结构1. HTTP响应报文分析HTTP 响应报文效果图:响应报文说明:--- 响应行/状态行 --- HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述 --- 响应头 --- Server: Tengine # 服务器名称 Content-Type: text/html; charsetUTF-8 # 内容类…...
常见的CSS技巧
1.禁止长按图片弹出菜单 img {-webkit-touch-callout: none; // 主要用于禁止长按菜单。主针对webkit内核的浏览器; } /*或者 user-select , 是css3的新属性,用于设置用户是否能够选中文本*/ .img {-webkit-user-select: none;-khtml-user-select: none…...
算法进阶-动态规划
经典例题 大家肯定想用递归做 思路大概就是这样 递归到最后一行就是对应的D(i,j) 然后往上推 但是这样会超时,因为存在大量的重复计算 比如调用第一行MasSum(7)需要调用MaxSum(3)和MaxSum(8) 但是调用第二行MaxSum(3)还要调用3行的MaxSum(8)和3行的MaxSum(1) 第二行…...
python的读写操作
一、使用open函数,可以打开一个已经存在的文件,或着创建一个新文件 语法如下: open(name, mode, encoding) name: 要打开的目标文件的字符串(可以包含文件所在的具体路径) mode: 打开文件模式:只读(r)、写入(w)、追加(a)等 e…...
Mybatis中添加、查询、修改、删除
在Mybatis中添加数据的操作 编写相对应的SQL语句,并完成相关数据的对应关系 编写测试用例 需要提交事务 sqlSession commit() 这里需要注意的是mybatis是默认的是手动提交事务,如果不写的话会进行回滚,添加操作就不会被执行 或者在 如果…...
C++---线性dp---传纸条(每日一道算法2023.2.26)
注意事项: 本题dp思路与 “线性dp–方格取数” 一致,下方思路仅证明为什么使用方格取数的思路是正确的。 题目: 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。 一次素质拓展活动中,班上同学安排坐成…...
浅谈 C/C++ 的输入输出
更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录0. 叠甲,过1. 谈谈输入输出缓冲区1.1 基本概念输入输出流标准输入输出流文件输入输出流1.2 输入输出缓冲区什么是输入输出缓冲区?为什么要设置输入输出缓冲区?C/C 的…...
【计算机三级网络技术】 第二篇 中小型系统总体规划与设计
文章目录一、基于网络的信息系统基本结构二、划分网络系统组建工程阶段三、网络需求调研与系统设计原则四、网络用户调查与网络工程需求分析1.网络用户调查2.网络节点的地理位置分布3.应用概要分析4.网络需求详细分析五、网络总体设计基本方法1.网络工程建设总体目标与设计原则…...
Boosting Crowd Counting via Multifaceted Attention之人群密度估计实践
这周闲来无事,看到一篇前不久刚发表的文章,是做密集人群密度估计的,这块我之前虽然也做过,但是主要是基于检测的方式实现的,这里提出来的方法还是比较有意思的,就拿来实践一下。论文在这里,感兴…...
python之面向对象编程
1、面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2、 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
