架构演进之路

news2024/11/15 6:48:42

架构设计:
一:如何分层。
1 为什么要分层:分而治之,各施其职,有条不紊。

常见的分层 计算机osi七层,mvc模型分层,领域模型分层。
2 单系统分层模型演进
浏览器-->servlrt-->javabean-->db-->渲染jsp
浏览器-->web层-->业务层-->持久层-->db-->渲染vue(ssh,ssm,springboot)
3 分布式分层:水平扩展,负载均衡,高可用,数据一致性。
3.1 web概念层:

客户端:pc,app
访问层:lvs(ip层进行分发,比ng快),上游nginx,应用nginx
接口层:websocket,http/https,tcp/udp,api网关。
3.2 业务概念层:
服务通信,业务服务模块,服务管理,任务调度,
基础服务(redis,mq,隔离管理,设备管理),监控。
3.3 数据访问及存储层:
存储接入层:mycat,redis proxy,shardingjdbc
存储层:mysql,redis

二 访问层架构知识。
1 lvs:通过dns网络找到公网ip,然后通过lvs ip层进行分发,比ng快


2 ng性能之所以快:
2.1 master-worker进程模型 
2.2 协程机制
协程和进程的区别:

 


ng的作用:反向代理,动静分离,负载均衡。缓存结果。

 

三 api网关层架构知识。
1 分布式会话管理
1.1 cookie:并非安全,被劫持概率高,xss,csrf安全攻击等。有跨域问题
1.2 token:凭证被劫持,伪造请求。有跨域问题
1.3 session: 依赖服务端,分布式则存储在中央管理机制中。

解决方案L:https请求防泄露,风控主动失效及过期机制。
2 接入层控制
需要实现的逻辑,身份验证,流量控制,路由服务,记录调试,或统计信息。
使用filter.
3 服务调用和聚合
重接入:srpingmvc+dubbo,由网关服务通过controller去接收响应结果,统一响应体。
轻接入:springcloud+zuul,交给业务服务处理。专注于网关,没有好与坏。

四 核心服务层架构知识。
1 微服务:服务治理(服务通信,健康管理,限流熔断),数据一致性,调用性能,
研发流程,测试,部署。
2 dubbo:轻量级rpc框架,远程方法调用,智能容错,负载均衡,自动服务注册和发现。
服务治理:

2.1 服务注册和发现,
2.2 服务消费获取服务,并通过负载均衡策略选择服务提供者。
(服务优雅的下线,消费端通过监听机制是可以感知的。zk通过钩子机制也是可以感知的)
2.3 动态增减服务提供者和服务消费者。
2.4 服务监控,服务限流,服务降级,高容错,定制化开发
3 异步化消息服务
削峰,解耦,异步。
4 任务调度
5 池化技术,通过对象池和连接池,减少系统消耗,提升系统性能。
5.1 java线程池(对象池):ThreadPoolExecutor

核心线程数-->队列-->最大线程-->拒绝策略-->idle等待时间
线程池状态:空闲 繁忙
5.2 数据库连接池:HTTP client连接池:redis连接池:(属于服务端的连接池)
核心连接数:  
最大连接数: 
连接等待时间:(服务之间的连接超过例如100ms,则连接中断)
数据读取时间:(读取之后响应数据的时间) 
等待释放时间(等待多久才会释放最大连接)
validate:各种网络原因等,在使用的时候会对连接validate一下,确保连接是正常释放的
连接池状态:init connect busy close
tomcat连接池:
5.3 tomcat连接池:每个请求进来,会创建维护一个client socket,放在连接池中。
属于维护客户端的连接池,并且client socket是没有办法处理读写请求的,则维护了一个io线程池。
tomcat io线程池:selector epoll,根据多路复用机制,感知到client socket有数据了,就会主动
去获取连接池socket的数据,然后获取的数据可以组成完整的http数据包时,就会把数据发给worker
线程池。(返回的工作线程可能是同一个,也可能不是同一个)
tomcat 工作线程池:工作线程,处理完数据之后又会将对应处理的结果,返回给空闲的io线程,然后
再返回给socket。返回的socket连接必定是同一个)
5.4 dubbo连接池:和tomcat机制一样,区别是一个发送的是http请求,一个是dubbo请求。

五 数据存储及接入层知识。
1 缓存分类:cdn缓存,反向代理缓存,分布式redis缓存,本地应用缓存(GUAVA)。
2 如何缓存:修改时实时写入,修改时异步写入,读取时实时写入,读取时异步写入。
3 多级缓存:

cdn缓存(仅静态资源)--> ng接入层缓存proxy cache缓存-->
ng应用层缓存(nginx lua shared dic)-->ng应用层缓存(通过应用层ng的lua redis脚本请求)
-->tomcat本地内存-->tomcat redis-->db
4 会涉及到缓存不一致问题,看业务是否容忍和接受。(在缓存周期内,通过异步更新)
5 隔离术:

硬件隔离(虚拟机):物理层面隔离,浪费资源
操作系统隔离(容器虚拟化):物理层面隔离,docker
进程隔离(系统拆分):微服务,按业务区分
线程隔离(线程池独立):服务之间的调用,也就是级联,
调用不同的服务使用不同的线程池,调用失败的则采取熔断降级等操作。
可以确保服务调用失败之后,不影响到该服务调用其他服务。
读写隔离(读写分离):主从模式
动静隔离(动态资源和静态资源隔离):在cdn取静态资源,在应用程序取动态资源。
热点隔离(热点账号,热点数据):走热点账号数据库,普通账号数据库。
6 队列术:异步,解耦,削峰
削峰:排队有时候比并发效率更高(不需要涉及到cpu去竞争抢占锁资源),
排队可以控制并发流量涌入。如redis就是单线程的排队机制,效率高。
常用的方案是使用线程池,通过设置核心线程数,最大线程数都为1,来实现简单的队列术。

六 数据存储及接入层架构设计
1 数据存储。
结构化数据,非结构化数据(音频,视频),半结构化数据(用户简历,文件)
常见的数据库存储中间件
nas:网络文件系统,基底层设备,提供文件磁盘。(服务器基于挂载的形成操作nas路径)
阿里oos:想象成无限大的网盘,阿里云oss网络文件存储。
sql关系型数据库:mysql,db2,slqlite等
非关系型数据库:mongdb,hbase。
缓存型数据库:H2,Redis。
2 关系型与非关系型。
3 代理访问。反向代理,数据库代理,redis代理。
为什么要代理:收口逻辑,负载均衡,路由策略,故障转移,缓存策略,减少后端被代理对象压力。
代理后端应用服务器:nginx
没有后端代理服务器:需多个公网ip支持多服务器,负载均衡只能通过dns寻址,
每个后端各自缓存热点数据
有后端代理服务器:仅需要一个公网ip绑定到代理服务器,可故障转移,可负载,可缓存热点
代理数据库服务器:mycat
没有数据库代理:应用层需要处理分库分表逻辑,应用层需要处理主从切换,应用层需要
各个数据库都维护连接池,数据连接池不够。
有数据库代理:可支持分库分表路由策略逻辑,可支持主从切换,可支持连接池管理。
代理缓存服务器:Twemproxy。(通常生产环境redis无需代理,自身支持)
没有代理缓存服务器:应用层需要处理分key分片逻辑,应用层需要处理主从切换,应用层需要
各个缓存都维护连接池,缓存连接数量不够。
有代理缓存服务器:可支持分key分片路由策略逻辑,可支持主从切换,可支持连接池管理。

七 监控,限流,降级知识。
1 监控:
为什么要监控:

线上发布了服务,怎么知道它一切正常
某个核心服务挂了,导致各级系统大量报错,如何确定问题在哪
系统上线后不知道业务进来多少,不知道服务器是否够用
业务搞大促,请求量激增,我们居然是最后一个知道的人
监控什么:通过cat监控软件指标,通过zabbix监控硬件指标。
硬件指标
:cpu idle time,free memory,io wait,network free 可以使用zabbix等
软件指标:cpu load average,parNewCount,parNewTime,old gc count,old gc time
可以使用cat heart beat监控
接口指标:url请求,保证95线,即99.999%成功率。可以使用cat transaction监控。
异常指标:可以使用cat execption监控,会打印堆栈信息。
大盘指标:基线成功率,基线失败率,总统响应时间指标。cat 大盘监控。
2 限流
为什么要限流:流量远比并发处理能力大,永远不知道对方怎么样,永远不知道自己怎么样。
因此需要有保护自己的决心。
限流的维度一:url的限流,dubbo接口限流,sql操作数。
限流的维度二:限制TPS/QPS,限制并发数,限制总数。
限流算法:
限制并发数(通过每个url计数器),
令牌桶算法,(通过固定时间重置桶中的令牌,每次请求取一个)
漏桶算法。往桶中涌入tps,不能超过桶的剩余量,桶会匀速下发请求过来的tps,
可以处理突发流量
如果是集群限流,对应所有操作都要加入中间体(如redis)
单机限流,不能保证绝对意义的均衡限流,通常建议使用单机限流。
可以使用guava包中的RateLimter类
limit = RateLimter.create(2),即每秒允许请求2个limit令牌,limit.acquire()获取令牌。
3 降级:保护系统,保证用户体验,给到充足时间排查问题。
关闭接口并设置默认返回,等同于隔离术。
降级逻辑,给到用户一个友好的体验响应。

随着架构的演进,可以看出分布式构建的繁杂体系,使得开发无法专注于业务本身,所以
云原生架构才会应运而生叭。

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

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

相关文章

unity组件LineRenderer

这是一个好玩的组件 主要作用划线,像水果忍者中的刀光,还有一些涂鸦的小游戏,包括让鼠标划线然后让对象进行跟踪导航也可通过此插件完成 附注:unity版本建议使用稳定一些的版本,有些api可能已经发生变化,…

【数据结构初阶】第四篇——双向链表

链表介绍 初始化链表 销毁链表 打印双向链表 查找数据 增加结点 头插 尾插 在指定位置插入 删除结点 头删 尾删 删除指定位置 链表判空 获取链表中元素个数 顺序表和链表对比 存取方式 逻辑结构与物理结构 时间性能 空间性能 链表介绍 本章讲的是带头双向链…

回溯算法秒杀所有排列-组合-子集问题

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 78. 子集 90. 子集 II 77. 组合 39. 组合总和 40. 组合总和 II 47. 全排列 II,做好准备了么,那么开始吧。 🌲&#x1f…

上海亚商投顾:A股两市震荡走弱 北证50指数大涨5.8%

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪沪指今日震荡调整,创业板指午后一度跌近1.5%,黄白二线分化明显,题材概念表现活跃…

Redis快速入门

Redis快速入门&#xff0c;分两个客户端&#xff1a;Jedis和SpringDataRedis 使用Jdedis 1、引入依赖 <!--jedis--> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>…

python算法面试题

这是我年前做技术面试官&#xff0c;搜集的面试题&#xff0c;从python基础-机器学习-NLP-CV-深度学习框架-Linux-yolo都有一些题目。针对不同方向的应试者问相应方向的问题。 基本上都是面试八股文&#xff0c;收集记录一下&#xff0c;以后自己也会用的到。 面试题 python基…

深入理解mysql的内核查询成本计算

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

过年回家,你是否也努力的给别人解释软件开发是干啥滴?

这个年就这样&#xff0c;在喜气洋洋的气氛中&#xff0c;在我们依依不舍的留恋中&#xff0c;从我们身边溜走了。这次回家又碰见了亲戚们不厌其烦的问我&#xff0c;你做什么工作呐&#xff1f;于是就有了我以下生动的解释 目录 打字的 帮助传话&#xff0c;帮助卖东西 皮…

易点易动打通固定资产采购,为企业实现降本增效

企业为什么要实现采购和资产管理的连接&#xff1f; 随着科技的发展&#xff0c;企业的办公工具越来越多&#xff0c;各类办公软件数不胜数。随之而来的是数据的不连通&#xff0c;员工需要穿梭在各个办公软件&#xff0c;重复导入导出数据&#xff0c;无形中没有提升办公效率…

三维电子沙盘数字沙盘开发教程第3课

三维电子沙盘数字沙盘开发教程第3课下面介绍矢量图层的控制显示&#xff1a;上代码foreach(string key in gis3d.SetFile.Biao.Keys)// gis3d.SetFile.Biao 该对象里存储了所有矢量层的信息{gis3d.SetFile.Biao[key].Show true; //是否显示标签gis3d.SetFile.Biao[key].ShowTe…

1.Weisfeiler-Lehman Algorithm

文章目录1.图同构介绍2.Weisfeiler-Lehman Algorithm3.后话参考资料欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Weisfeiler-Lehman Algorithm是美国的数学家Boris Weisfeiler在1968年发表的论文the reduction of a graph to a canonic…

Flask WebSocket学习笔记

WebSocket简介&#xff1a;WebSocket是一种全新的协议&#xff0c;随着HTML5的不断完善&#xff0c;越来越多的现代浏览器开始全面支持WebSocket技术了&#xff0c;它将TCP的Socket&#xff08;套接字&#xff09;应用在了webpage上&#xff0c;从而使通信双方建立起一个保持在…

Java面向对象基础

文章目录面向对象一、类和对象1. 类的介绍2. 类和对象的关系3. 类的组成4. 创建对象和使用对象的格式二、对象内存图1. 单个对象内存图2. 两个对象内存图3. 两个引用指向相同内存图三、成员变量和局部变量四、this 关键字1. this 可以解决的问题2. this 介绍3. this 内存图五、…

学术的快乐来源

文章目录我的核心快乐来源&#xff1a;其他非核心快乐源泉知乎搜到的别人的快乐来源作此文&#xff0c;以便懈怠时候看看&#xff0c;能够聊表安慰。 ——题记 抱着给自己枯燥无聊学术生涯找点乐子的想法&#xff0c; 我决定仔细思考一下自己做学术的时候有哪些快乐的地方&…

C++关于开源包7zip压缩工具的编译及使用

1、7zip的配置 7-Zip是一款免费开源的压缩与解压软件&#xff0c;基本能够满足绝大多数常见的压缩和解压文件需求&#xff0c;此外还支持了分卷压缩和解压&#xff0c;非常好用。但是调用7-zip库需要用到一个叫bit7z的库&#xff0c;bit7z是一个C静态库&#xff0c;其封装了简单…

MySQL 中主从之间是怎样保证数据一致的呢?

在我们日常的工作中&#xff0c;处理 MySQL 数据库相关问题时&#xff0c;我相信绝大多数 DBA 处理最棘手的问题就是数据库主从数据不一致的问题。 处理过关于 MySQL 数据库主从数据不一致的朋友一定印象非常深刻&#xff0c;因为稍有不慎就会将造成原有数据的丢失&#xff0c…

精益安灯电子看板实现了实时监测

众所周知&#xff0c;智能工厂的规划建设是一个十分复杂的系统工程。所以安灯电子看板是精益生产中一一个重要组成要素&#xff0c;可以提升工厂生产车间的过程管理&#xff0c;生产数据做的信息化、目视化&#xff1b;信息快捷化、生产工序透明化等&#xff0c;是提高生产率的…

自动控制原理笔记-根轨迹的概念-根轨迹方程

目录 根轨迹的基本概念&#xff1a; 根轨迹的概念&#xff1a;当开环系统某一参数从 0 到∞变化时&#xff0c;闭环极点在S 平面上变化所描绘出的轨迹。 闭环零极点与开环零极点之间的关系&#xff1a; 根轨迹方程&#xff1a; 开环增益于根轨迹间的关系&#xff1a; 闭环系…

excel 格式化日期为字符串

最近经常遇到excel打开文件的时候&#xff0c;excel自动将yyyy-MM-dd HH:mm:ss &#xff08;如&#xff1a;2022-01-21 12:12:12 &#xff09;之类的时间的自动转为这样的格式列&#xff0c;2022/1/21 12:12:12 &#xff0c;导致有想从excel/csv格式 中复制原始日期格式比较麻烦…

【软件测试】一个真正的测试面试过程,我比面试官还狡猾......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 先卖个关子&#xf…