【cfeng-work】架构演进和漫谈

news2024/11/16 17:49:13

架构漫谈和入门

内容管理

    • intro
    • 分层架构
      • MVC模式
      • 分层架构
      • 大数据时代的复杂架构
    • 前端架构
    • 后端架构
    • 运维端
    • 架构持续演进变化


本文主要是自己接触架构的一些输出漫谈


cfeng 在work中某次负责了后端一个服务的上线,多个模块一起上,结果上线失败,幸运的是,没有对用户造成什么损失,但是这次失败也让cfeng 意识到可能不只是保证我们code准确无误,还需要站在整个宏观系统的角度去思量很多。

intro

cfeng现在对于架构的理解也是很模糊的,个人感觉架构不是具象的,而是抽象的一种方法论。从我们技术人员的角度来说,就是怎么样搭建我们这个系统才能让系统更高效稳定。

互联网的技术总是在不断变迁的,技术架构也是在不断变化。架构是个抽象的可大可小的一个概念,比如机器是单点还是集群,对于单体我们这个产品的模块如何划分,是分层还是其他的模式…

我们其实最容易接触的就是单体架构。这里的“单体” 说的是机器,相对单体,那么就有“分布式的架构”, 所以这里就是我们整体的机器的搭建的一种选择,流量大或小?流量小自然没必要去用分布式,因为分布式要考虑的问题也更多并且成本也更高。

分层架构

MVC模式

相信大家或多或少都听说过MVC和三层架构,这是计算机领域比较经典的架构,MVC是一种架构模式思想,而三层架构就是经典的分层架构。

MVC 架构模式:
MVC: Model  View Controller
View 视图: 负责页面的展示和用户的交互功能,从XX系统命令式交互到网页都是这个概念
Controller 控制器: 控制器就是接受视图传来的请求并选择一个Model模型进行处理,处理完之后再返回给视图。 【Spring的controller就更容易理解】
Model 模型 : 模型持有数据,状态和逻辑,接受数据进行处理返回最终的结果

分层架构

Layered Architecture 是互联网的经典架构。我们最熟知的计算机网络七层模型就是一种分层的思想。 分层体现了高内聚低耦合的概念,各层各司其职,围绕本层的职责范围做事,这样就将一个大问题进行了逐步的拆分。并且不容易出错。

在这里插入图片描述

像计算机网络分层模型一样,这里给出一个四层的分层架构模型【关键就是不同的layer】:

  • 表现层: 展示顾客的数据,至于数据如何获取就不用考虑
  • 业务层:只是获取持久层的数据并通过业务逻辑进行处理即可
  • 持久层: 只需要关心数据的持久化
  • 数据层: 只需要考虑数据的存储

应用在流量小的时候,只需要单体架构就可以达到效果。但是就算是在单体架构时,应用内部使用分层架构思想也能提升工作效率

大数据时代的复杂架构

随着时代发展,流量增加,简单使用单体架构就能完成功能变得很理想化。应用变得越来越复杂。 然后就出现了分布式微服务,将单个应用拆分成了多个应用,并且集群部署,通过网络通信将不同的应用组织起来。

应用数量的增加,也就需要出现分布式架构,一些分布式的组件,比如负载均衡,分布式缓存解决方案、分布式链路通信,分布式事务,分布式配置中心、注册中心等开始出现。we需要考虑的东西也越来越多 ----- 应用通信、服务治理、持续集成。

同时一个应用可能会分化成一些关键的模块: 比如XX呼叫中心、告警中心、监控中心…这些整体的技术和模块就像一块块积木,我们需要考虑如何去搭建这些积木才能让整个结构屹立不倒。

在这里插入图片描述

整体上讲,在如今前后端分离大流行的时代,整个架构技术可以分为前端【接入层】技术和后端【服务层】技术,同时在云技术盛行的当下,还有就是我们的运维端【技术保障层】

前端架构

cfeng之前的博客过了一遍Vue3并实现了一个简易的博客demo,前端也早已不是简单的html + css + JavaScript了,各种前端框架像Vue、React都是使用很广泛的。

并且前端是一个泛概念,不只是包含基础的PC前端,像移动OS、跨平台、小程序等和用户进行交互的都属于前台的概念范围。

cfeng在work发现官网的前台只适配了PC端,移动端打开不符合预期,需要泛【大】前端的概念

前端最核心就是保证用户的体验,不管说页面的响应速度还是页面的美观等。

由于cfeng 目前的重心还是在服务端,前端的理解不深,这部分都以后有就会再谈。

后端架构

服务端主要就是业务处理效率和准确。前端传入的数据后台要正确的进行相应的响应。很多时候数据抽象一下基本就是那么几种:任务、内容、订单。

数据通过接入层传递给后端之后,可能会激活很多不同的模块和相关中间件进行配合。后台就需要应对这些复杂性,同时要特别考虑使用中间件的配合和整个系统的可靠性。

对于现在的分布式架构,各种各样中间件层出不求,中间件为调用提供了很好的封装性,让使用变得容易,但是cfeng认为只有自己理解如何实现中间件我们才能更好的处理问题。 之前文章我们主要分享了Spring Cloud下面的相关的中间件解决方案,但是都是迅速的过了一遍,后续可能会对这些内容进行深耕。

后台的一个重要点就是事务,像交易系统或者任务系统都有大量的面向事务的存储场景,分布式环境下可能会出现分库分表,分库带来的就是分布式事务的考量。

运维端

接入层主要服务用户的交互体验,服务端主要支撑数据处理,运维端就需要保证产品能够稳定的为用户带来优质的体验。

随着单体架构向分布式架构演进,运维的复杂度也在迅速上升,这也是需要考虑的高可用,在高可用架构下,需要具有强大的监控能力和故障恢复能力。

运维端的常见技术就是Docker 、K8s等和云原生相关的技术,K8s把IaaS和PaaS融为一体,为应用治理提供了各种解决方案。

监控系统的关键在于及时发现问题,定位问题往往比解决问题更加困难。当然业内也有相关的解决方案:(cfeng之前work中是产品自己监控自己),像Hickwall用于指标监控,CAT可以监控调用链路,CLog可以管理日志,还有Zabbix、Prometheus…

还有就是网络的相关问题,比如网络阻塞,比如机房物理破坏…这些都需要做好相应的预警方案。

架构持续演进变化

架构本身就是一种方法论,在不同的业务阶段,不同的时代背景可能体现不同的架构方案。比如在数据量小的单体架构时代就不需要考虑三高问题。

后续在大流量时代,分布式架构下服务分层,各层服务进行隔离化和透明化,方便进行解耦和部署,同时拆分之后可以进行集群扩展; 集群就更好的配合高可用,各个业务系统通过SOA基于服务进行,快速进行系统的搭建。

分布式下需要考虑的问题: 高可用、高性能,高并发; 可扩展

在分布式架构下,我们可能就需要考虑很多问题:

  1. 如何保证高扩展性,比如业务快速扩张,如何灵活收缩。比如单体架构,本身就不具备集群,后期发展根本不适用
  2. 如何划分系统。 这个cfeng在work中也还有些茫, 一个重要的思想就是复用,我们要避免多个系统中冗余功能,把公共的大量使用的可聚合功能抽离成一个单独的子系统, 比如告警系统就可以抽离还有其他的比如支付平台、消息平台、物流平台、监控平台都是可以作为公共系统的
  3. 如何正确改造。系统review过程的改造可能很复杂,我们要正确的优化业务流程,明确目的,不能反向操作
  4. 分层体系的设计。微服务的拆分带来扩展性的同时也带来了复杂度,比如下单成功之后给用户加积分,如果是在一个系统,直接整个一个事务就可以了,但是现在可能拆分成不同的系统对应不同的dataBase,那么就需要有分布式事务的解决方案,比如一些补偿机制,状态机回调和消息队列的方式进行解耦保证最终状态一致性。

在大数据时代,同时出现的就是云原生架构,云原生之前的文章简述过,关键技术就是容器化、微服务、快速交付和Dev&ops,同时随着人工智能的快速发展,产品或多或少都集成AI进行赋能。像精准化营销,个性化推荐,人工智能机器人。【we 需要不断的去拥抱变化】

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

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

相关文章

GWAS全基因组关联分析实战——基于Plink转换vcf数据为二进制

vcf数据是保存变异信息的主要数据格式,plink是进行全基因组关联分析(GWAs)分析的常用工具包,同时提供一系列数据转换、裁剪和遗传统计量计算工具。本文以实际数据提供基因组关联分析方法。 1 数据准备 首先,使用plin…

微信小程序_02

能够使用WXML模版语法渲染页面结构 数据绑定 1、数据绑定的基本原则 在data中定义数据在WXML中使用数据 2、在data中定义页面的数据 ​ 在页面对应的.js文件中,把数据定义到data对象中即可: Page({data:{//字符串类型的数据info:init data,//数组类…

EXTI (2)

增强版实验简介 EXTI5和EXTI9共享一个中断源 下面的类似 EXTI0到4各自拥有一个中断源 改变引脚 PA0和PA1改变为PA5 和PA6 EXTI的重映射 之前是把PA0映射到EXTI0 PA1映射到EXTI1上 现在是要把PA5和PA6分别映射到EXTI5和6上 EXTI进行初始化 NVIC初始化 编写中断函数 因为EXTI…

STM32与RTOS的整合:实时操作系统在嵌入式开发中的应用

随着各种嵌入式系统应用的日益复杂和对实时性要求的提高,使用实时操作系统(RTOS)成为嵌入式开发中的一种重要选择。STM32微控制器作为一种强大的嵌入式处理器,与各种RTOS相结合,能够提供更高效、可靠并且易于维护的系统…

【仿真动画】双机器人协作完成一个任务(切割)

场景 动画 两个机器人协同工作完成一个任务需要解决以下几个关键问题: 通信:两个机器人需要能够相互通信,以共享信息,例如位置、姿态、状态等。规划:需要对两个机器人的运动轨迹进行规划,确保两个机器人不会…

老胡的周刊(第115期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 draw-a-ui[2] 利用 tldraw gpt-4-vision ap…

MATLAB算法实战应用案例精讲-【数模应用】漫谈机器学习(二)

目录 几个高频面试题目 机器学习中的模型评价、模型选择与算法选择 基本的模型评估项和技术 Bootstrapping 和不确定性 交叉验证和超参数优化 机器学习的发展历程 知识储备 机器学习常用术语 算法原理 1. 什么是机器学习? 机器学习和人工智能的关系 机…

机器视觉行业,日子不过了吗?都进入打折潮,双11只是一个借口,打广告出新招,日子不好过是真的

我就不上图了,大家注意各个机器视觉公司公众号,为什么打折?打广告也只是宣传手段,进入打折潮,内卷严重,价格战变成白刃战,肯定日子不好过了。

代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组

前言 本期我们来解决动规的经典题型------ 子数组问题 我们还是会使用动规五部曲来解决问题,下面我们仍然列出动规五部曲 1.明确dp数组含义 2.明确dp数组如何推导-递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组排错 LeetCode T300 最长递增子序列 题目链接:300. 最长…

61基于matlab的GWO算法的参数工具箱,图形界面,目标函数的默认名称为CostFunction。

基于matlab的GWO算法的参数工具箱,图形界面,目标函数的默认名称为CostFunction。如果您查看了CostFunction.m文件,成本函数获取向量([x1 x2…xn])中的变量并返回目标值。可以在该文件中编写目标函数,也可以…

Python实现猎人猎物优化算法(HPO)优化XGBoost分类模型(XGBClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

Js 语句

JavaScript 语句向浏览器发出的命令,语句的作用是告诉浏览器该做什么;分号用于分隔 JavaScript 语句,通常我们在每条可执行的语句结尾添加分号;使用分号的另一用处是在一行中编写多条语句。 JavaScript 语句通常以一个 语句标识符…

深入了解springmvc响应数据

目录 一、前后端分离开发与混合开发 1.1 混合开发模式 1.2 前后端分离模式【重点】 二、页面跳转控制 2.1 通过JSP实现页面跳转 2.2 转发与重定向 三、返回JSON数据 3.1 导包与配置 3.2 使用ResponseBody 四、返回静态资源 4.1 为什么无法直接查询静态资源 4.2 配置…

【机器学习基础】机器学习入门(1)

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!后面的内容会越来越有意思~ 💡专栏介绍: 本专栏的第一篇文章,当然要介绍一下了~来说一下这个专栏的开…

Java设计模式-结构型模式-代理模式

代理模式 代理模式静态代理动态代理JDK动态代理CGlib动态代理 代理模式 创建一个代理对象来控制对原始对象的访问,可以用来扩展原始对象的功能,同时保护原始对象 一般使用代理模式的目的有两个: 保护目标对象增强目标对象 代理模式有两种实现…

msvcr110.dll文件丢失的解决方法

msvcr110.dll是一个动态链接库文件,属于Microsoft Visual C运行时库(Runtime Library)版本11.0。它包含了在Visual C程序中使用的函数和变量。当一个程序编译完成后,仍然需要一些运行时库来在操作系统上运行。这些库提供了程序所需…

记录一个错误

通过Resource注解,将IStateHandler接口的实现类 StateHandlerImpl注入进来 Resource private IStateHandler stateHandler;Resource注解默认按照名称进行装配,这里抛出异常是因为IStateHandler和StateHandlerImpl都被 Spring 容器管理,在进行…

GPTS应用怎么创建?GPTS无法创建应用很卡怎么办

在首届开发者大会上,OpenAI宣布推出了GPTs功能,也就是GPT Store,类似App Store的应用商店,任何用户都可以去参与创建应用。那么GPTS应用该如何创建?碰到应用无法创建很卡怎么办呢?下面就为大家带来GPTS应用创建图文教程&#xf…

ChatGPT重磅升级 奢侈品VERTU推出双模型AI手机

2023年11月7日,OpenAI举办了首届开发者大会,CEO Sam Altman(山姆奥尔特曼)展示了号称“史上最强”AI的GPT-4 Turbo。它支持长达约10万汉字的输入,具备前所未有的长文本处理能力,使更复杂的互动成为可能。此外,GPT-4 Turbo还引入了跨模态API支持,可以同时处理图片、视频和声音,从…

【C语言】深入解开指针(二)

🌈write in front :🔍个人主页 : 啊森要自信的主页 🌈作者寄语 🌈: 小菜鸟的力量不在于它的体型,而在于它内心的勇气和无限的潜能,只要你有决心,就没有什么事情是不可能的…