终端软件架构说
目录
零:前言
一,基于服务的架构
二,基于多进程多线程的架构
三,以数据为中心的架构
四,类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类: 一个类即对一类拥有相同属性的对象的…...
常见前端基础面试题(HTML,CSS,JS)(七)
同源策略 浏览器有一个重要的安全策略,称之为同源策略 其中,协议、端口号、域名必须一致,,称之为同源,两个源不同,称之为跨源或跨域 同源策略是指,若页面的源和页面运行过程中加载的源不一致…...
产业链金风控基本逻辑
产业链金风控基本逻辑 产业链金融平台作为一个助贷平台,很大程度上是为银行等金融机构进 行引流,贷款的审批本质上还是依赖金融机构的风控。那么,产业链金融 平台是否还有必要建设自己的风控模型呢?笔者给出的答案是肯定的。 一方面&#x…...
Java高级点的知识
Java 集合框架 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。 对一个集合的扩展和适应…...
MyBatis - 05 - 封装SqlSessionUtil工具类(用于获取SqlSession对象)并测试功能
文章目录1.新建SqlSessionUtils工具类2.编写静态方法3.项目结构及代码项目结构数据库和表pom.xmlParameterMapper接口:User类:ParameterMapper.xmljdbc.propertieslog4j.xml:mybatis-config.xml:ParameterMapperTest测试类:测试结果1.新建Sql…...
Java中BIO、NIO和AIO的区别和应用场景
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信&#…...
Python安装教程(附带安装包)
首先,打开python安装包的下载地址,https://www.python.org/downloads/,会有些慢 点击downloads中的windows 左侧是稳定的版本,我这边下的是3.8的,不想去官网下载的可以直接用我下载的这个3.8版本,https://…...
华为OD机试用Python实现 -【信号发射和接收】(2023-Q1 新题)
华为OD机试题 华为OD机试300题大纲信号发射和接收题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明Python 代码实现代码运行结果代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为…...
Springboot整合 Thymeleaf增删改查一篇就够了
很早之前写过Thymeleaf的文章,所以重新温习一下,非前后端分离,仅仅只是学习 官网: https://www.thymeleaf.org/ SpringBoot可以快速生成Spring应用,简化配置,自动装配,开箱即用。 JavaConfigur…...
BigScience bloom模型
简介项目叫 BigScience,模型叫 BLOOM,BLOOM 的英文全名代表着大科学、大型、开放科学、开源的多语言语言模型。拥有 1760 亿个参数的模型.BLOOM 是去年由 1000 多名志愿研究人员,学者 在一个名为“大科学 BigScience”的项目中创建的.BLOOM 和今天其他可用大型语言模型存在的一…...
Squid服务的缓存概念
Squid缓存概念 squid是一个缓存服务器的守护进程 之前涉及的缓存服务:redis 2-8原则:80%的访问就是从20%的数据提供的;因此把20%的数据给到缓存–>完美解决等待时间; nginx是没有缓存的服务的;那么专业的事情就…...
建设网站项目概述/怎么去推广自己的网站
javaweb新建jsp文件第一行报错 原因 缺少包 解决 1.右击项目名,选择build path,如图。 2.选择导入外包,如图。 3.在 Tomcat的安装路径里,在lib文件夹下找见servlet-api.jar导进去,应用并关闭,如图。 …...
免费空间网站怎么做的/网络营销策划内容
1、效果图: 2、在项目utils目录下创建index.js 然后创建如下拷贝方法 export function copyText(copytext) {const text document.createElement(input); // 创建节点text.setAttribute(readonly, readonly);text.value copytext; // 赋值document.body.appendCh…...
网站建设基础教学设计/东莞网站公司哪家好
while 1:try:_ = input()nums = list(map(int, input().split()))w = int(input(...
dwcs3如何做网站/宝塔没有域名直接做网站怎么弄
我在任何地方都找不到。我从返回标准JSON日期的API中获取了一些JSON。您可以通过在JavaScript控制台中运行以下代码来查看格式:> new Date().toJSON();"2010-10-27T11:58:22.973Z"好吧,实际上,我正在使用的API不会返回毫秒部分&…...
网站建设与管理教程/chrome浏览器官网入口
阿里巴巴有2大核心的分布式技术,一个是OceanBase,另一个就是RocketMQ。在实际项目中已经领教过RocketMQ的强大,RocketMQ实战系列,将涵盖RocketMQ的简介,环境搭建,初步使用、API详解、架构分析、管理员集群操…...
平谷区住房城乡建设委官方网站/餐饮营销引流都有什么方法
一、准备工作 Eureka通过运行多个实例,使其更具有高可用性。事实上,这是它默认的熟性,你需要做的就是给对等的实例一个合法的关联serviceurl 二、改造工作 在eureka-server工程中resources文件夹下,创建配置文件application-pe…...