终端软件架构说

news2024/11/26 2:54:18

目录

零:前言

一,基于服务的架构

二,基于多进程多线程的架构

三,以数据为中心的架构

四,类Android的分层架构设计

五,总结


零:前言

谈到架构,可能大家的第一感觉是信息系统的架构,比如搞Web、Java相关的系统。其实不然,架构存在于计算机相关系统的各个部分,不论是底层还是上层,不论是单机程序还是联网系统,都涉及架构,只不过大家关注的重点不同而已。比如,CPU内部实现我们多认为是硬件设计,但其实是涉及架构的,而且架构很重要。本质上将,架构是很多决策的组合。做一件事,为什么选择这种策略方案,而放弃另外一种方案,这就是架构师要做的事情。

虽然架构是一个比较宽泛的概念,但是,架构师却是具体的。要成为一位合格的架构师,需要掌握不少的专业技能,这是不争的事实。架构师需要对自己面对的领域,在一定的抽象层次上,要有足够的大局观,并具有全局的掌控能力。

上面说的都有点虚,这里我们缩小范围,主要说说终端设备上的软件架构。

博主最近离职了,于是有点时间整理之前的资料。回顾做终端开发这十几年,发现每一款产品都采用了不同的架构。更发现每一种架构,都似乎比较契合当时的产品特点(至少回过头来看,个人感觉是符合的)。这里整理一下,做个总结。

在正式上架构图之前,补充两点。终端软件,尤其是涉及嵌入式开发,往往既涉及硬件又涉及软件。特别是功能比较多的嵌入式产品。极端点,像Android,就是这样一个典型代表。较多的硬件关联还比较好理解,这里强调的软件,意义何为?其实,主要是说,这类设备上的软件开发,跟桌面和服务器端的软件开发,差别并不大。操作系统、数据库、网络、多媒体的掌握,可能一样都不能少,另外呢,对建模方法、设计模式的应用上,跟x86上的开发,也并没有太大差别。之前博主在谈论架构时,提到的相关技术,就这里所提场景而言,是都需要掌握的。

参见:剑指架构师--不是前驱还是后驱的问题,你需要四驱_龙赤子的博客-CSDN博客

做Java类开发的人员,看了这些,可能很难想象,做嵌入式开发,也需要掌握这些技能。

好了,回归主题,下面博主就说说自己做过的四款产品的架构情况。

一,基于服务的架构

整理的框图如下:

 这是一款家庭网关产品。因为涉及很多网络服务,所以是基于开源路由器DDWRT(现在流行的分支是OpenWRT)开发的。整个系统有一个大的控制模块,类似状态机管理,然后有很多的小服务,许多功能就是这些服务的组合。状态机接收用户功能请求,决定关闭或启动哪些服务,来实现功能要求。服务本身也做了封装,提供了启动、停止、重启等基本接口。

基本我们也能感受到,在这种具有很多网络相关功能的产品中,采用服务化的架构,整体而言,还是比较贴合的。很多开源软件被简单二次封装后,就可以直接发挥作用,减少了开发量。

二,基于多进程多线程的架构

同样,先上图:

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

三,以数据为中心的架构

这是一个家庭媒体网关类产品。同样是网关产品,但是跟之前的家庭网关产品差别较大。之前的网关产品,网络功能本身占比比较大,额外的提供了一个独立的媒体功能。但是,这款产品,媒体占据了主要功能,网络部分则只是正常的通信基础。这里媒体网关的意思是媒体资源的集散地,用户可以通过各种手段,从该设备上获取媒体。比如,使用手机通过该产品看电影(电影在该媒体网关上,手机只是充当了屏幕)。另外,也可以将屏幕转移到电视、电脑。

简单了解产品后,我们来看其架构。这里采用了以数据为中心的架构。这里的数据,主要指媒体资源。数据从哪里来,经过哪些路径,到哪里去,是架构主要关注的点。所以,架构中,根据不同的场景,设计了数据流程图,然后围绕数据流,做相关的辅助设计。在整个数据流中,需要什么支持,就增加什么模块。比如编解码等。

这个跟很多媒体处理类产品的通用思路是一致的。

四,类Android的分层架构设计

类似Android,提供硬件抽象、框架、服务等层次,这款富媒体功能产品,也采用了分层的架构。对各种开源协议和软件,都是二次封装后,提供平台层供业务层来使用。相比之前的产品,封装层次更深。这是为了更好的应对不同硬件平台,不同的业务而做出的决策。

因为产品本身的功能特点跟Android类似,虽然不是以一个一个APP的表现形式来提供功能,但是内置的一个一个的功能点,就像Android上的APP,多而杂。这种情况,使用上述的分层架构更合适,对于功能的扩展的支持,也会更加有力。

五,总结

从上面几种架构的介绍,我们可以看出,没有什么通用的、最好的架构,只有最合适的架构。架构是一组决策,它的构成,不仅取决于产品本身的特点,还受组织结构的影响(人员构成、技术特点等)。能够灵活运用基础知识,因地制宜的做出选择,这样形成的架构才是好架构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年三月份图形化三级打卡试题

活动时间 从2023年3月1日至3月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…

Vue 3第三章:模板语法及指令介绍

文章目录1. 插值表达式1.1. 声明变量可直接在模板中使用,采用{{变量名称}}的方式1.2. 模板语法支持三元表达式1.3. 模板语法支持运算1.4. 模板语法支持方法调用2. 指令2.1. v-bind:用于绑定属性或动态绑定对象的值到元素上。2.2. v-if、v-else-if、v-els…

C#学习记录——接口的实现

一小部分知识精英依旧直面核心困难,努力地进行深度钻研,生产内容;而大多数信息受众始终在享受轻度学习,消费内容。如果我们真的希望在时代潮流中占据一席之地,那就应该尽早抛弃轻松学习的幻想,锤炼深度学习…

Burp Suite 常用模块简介

Burp Suite 常用模块分为 目标站点(target)模块 代理(proxy)模块 攻击(Intruder)模块 重放(Repeater) 模块 Target模块是对站点资源的收集,与站点各资源包发出和相应包的记录 Proxy模块是核心模块,可以拦截数据包发送往浏览器,进行修改后再…

网络协议分析(2)判断两个ip数据包是不是同一个数据包分片

一个节点收到两个IP包的首部如下:(1)45 00 05 dc 18 56 20 00 40 01 bb 12 c0 a8 00 01 c0 a8 00 67(2)45 00 00 15 18 56 00 b9 49 01 e0 20 c0 a8 00 01 c0 a8 00 67分析并判断这两个IP包是不是同一个数据报的分片&a…

Android JetPack之启动优化StartUp初始化组件的详解和使用

一、背景 先看一下Android系统架构图 在Android设备中,设备先通电(PowerManager),然后加载内核层,内核走完,开始检查硬件,以及为硬件提供的公开接口,然后进入到库的加载。库挂载后开…

Winform控件开发(16)——Timer(史上最全)

前言: Timer控件的作用是按用户定义的时间间隔引发事件的计时器,说的直白点就是,他就像一个定时炸弹一样到了一定时间就爆炸一次,区别在于定时炸弹炸完了就不会再次爆炸了,但是Timer这个计时器到了下一个固定时间还会触发一次,上面那张图片就是一个典型的计时器,该定时器…

【Java】Spring Boot 配置文件

文章目录SpringBoot 配置文件1. 配置文件的作用2. 配置文件的格式3. properties配置文件说明3.1 properties基本语法3.2 读取配置文件3.3 properties缺点分析4. yml配置文件说明4.1 yml基本语法4.2 yml使用进阶4.2.1 yml配置不同的数据类型及null4.2.1 yml配置的读取4.2.2 配置…

Python蓝桥杯训练:基本数据结构 [哈希表]

Python蓝桥杯训练:基本数据结构 [哈希表] 文章目录Python蓝桥杯训练:基本数据结构 [哈希表]一、哈希表理论基础知识1、开放寻址法2、链式法二、有关哈希表的一些常见操作三、力扣上面一些有关哈希表的题目练习1、[有效的字母异位词](https://leetcode.cn…

0101基础概念-图-数据结构和算法(Java)

文章目录1 图1.1 定义1.2 4种图模型2 无向图2.1 定义2.2 术语后记1 图 1.1 定义 图是一种非线性的数据结构,表示多对多的关系。 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E)&#xf…

ecology9-谷歌浏览器下-pdf.js在渲染时部分发票丢失文字 问题定位及解决

问题 问题描述 : 在谷歌浏览器下,pdf.js在渲染时部分发票丢失文字;360浏览器兼容模式不存在此问题 排查思路:1、对比谷歌浏览器的css样式和360浏览器兼容模式下的样式,没有发现关键差别 2、✔使用Fiddler修改网页js D…

什么是线程死锁?如何解决死锁问题

死锁,一组互相竞争的资源的线程之间相互等待,导致永久阻塞的现象。 如下图所示: 与死锁对应的,还有活锁,是指线程没有出现阻塞,但是无限循环。 有一个经典的银行转账例子如下: 我们有个账户类…

操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权

系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!! 基于白名单AutoElevate绕过…

2-MATLAB APP Design-下拉菜单栏的使用

一、APP 界面设计展示 1.新建一个空白的APP,在此次的学习中,我们会用到编辑字段(文本框)、下拉菜单栏、坐标区,首先在界面中拖入一个编辑字段(文本框),在文本框中输入内容:下拉菜单栏的使用,调整背景颜色,字体的颜色为黑色,字体的大小调为26. 2.在左侧组件库常用栏…

Qt音视频开发17-vlc内核回调拿图片进行绘制

一、前言 在众多播放器中,支持的种类格式众多,并支持DVD影音光盘,VCD影音光盘及各类流式协议,提供了sdk进行开发,这点是至关重要的,尽管很多优秀的播放器很牛逼,由于没有提供sdk第三方开发&…

【网络编程套接字(一)】

网络编程套接字(一)理解源IP地址和目的IP地址理解源MAC地址和目的MAC地址理解源端口号和目的端口号PORT VS PID认识TCP协议和UDP协议网络字节序socket编程接口socket常见APIsockaddr结构简单的UDP网络程序服务端创建套接字服务端绑定字符串IP VS 整数IP客…

面试官: 你知道 JWT、JWE、JWS 、JWK嘛?

想起了 之前做过的 很多 登录授权 的项目 它相比原先的session、cookie来说,更快更安全,跨域也不再是问题,更关键的是更加优雅 ,所以今天总结了一篇文章来介绍他 JWT 指JSON Web Token,如果在项目中通过 jjwt 来支持 J…

Springboot整合 Thymeleaf增删改查一篇就够了

很早之前写过Thymeleaf的文章,所以重新温习一下,非前后端分离,仅仅只是学习 官网: https://www.thymeleaf.org/ SpringBoot可以快速生成Spring应用,简化配置,自动装配,开箱即用。 JavaConfigur…

【java基础】枚举类(enum)

文章目录基本介绍快速使用字段、方法、构造器枚举类方法toString方法valueOf方法values方法ordinal方法基本介绍 在java中有一种特殊的类型就是枚举类,对于一个有限的有固定值的集合,我们就可以考虑使用枚举类来进行表示,例如服装的大小为 小…

linux shell 入门学习笔记15 shell 条件测试

概念 shell的条件测试目的是得出真和假。 shell 提供的条件测试语法 test 命令 [] 中括号命令 语法*: test条件测试 test命令用来评估一个表达式,他的结果是真,还是假,如果条件为真,那么命令执行状态结果就为0&…