以下文案源自方志朋的博客,回复”666“获面试宝典 作者:Yrion | 链接:cnblogs.com/wyq178/p/12151160.html这个知识分享的爆炸时代,鉴于 Java 生态的完整和繁荣,各样框架、中间件和工具包供咱们运用。连新培训出来的人都晓得 SSM,微服务、集群、多线程、队列、高并发等技术,技术的间隔性正变得越来越小,仿佛咱们只必须按部就班的去运用别人说的框架等技术就能够处理问题。倘若刨除redis、rabbitmq、kafka、dubbo、springcloud这些详细的技术框架,你有无静下心来真正思考过架构是什么呢?这些框架是到底是扮演怎么样的角色?倘若不说各样天花乱坠的概念,让你给架构下一个定义,你会选取怎样去描述架构呢?
翻译翻译,什么是架构?
背景: 从业快 4 年.我记得在我刚从业的时候,当时流行的框架是 spring、struts2、hibernate,前端运用的是 jsp,业务亦不是那样繁杂,全部项目并发量并不大,QPS 都不会超过5,当时的做法所有的前端和后端放在一块安排,打成war包直接安排到centos上的tomcat上就能够运行了,这般完全能够承载实质生产环境的请求量,问题亦不大。
后来当我换了一家机构,机构采用 dubbo 微服务化,所有的业务均被划分成为了一个个服务来供给给接口调用,当时的业务场景亦比以前的繁杂,采用23台服务器掰开安排,容纳的线上负载大概在几百万上下。
服务进行修改规律再亦不消像以前那样麻烦必须把全部项目重新打包再安排了.之后就在微服务的路上走的更远了,所有的服务独立安排,打包成镜像文件作为 docke r实例,独立安排在 docker 的服务器上,结合git,安排、运维、研发的效率得到了快速提高。 目录 一:架构到底是什么
二:常用的架构技术 2.1:分布式 2.2:集群 2.3:缓存 2.4:队列 2.5:多线程 2.6:限流 2.7:服务降级和熔断三:安全性问题 3.1 sql注入 3.2 跨域攻击 3.3:XSS攻击四: 架构设计的误区 4.1:为了高挑上而设计出繁杂的架构 4.2:用技术能够处理一切问题
一:架构到底是什么
架构到底是什么?首要来看一下维基百科对架构的解释:
软件架构:是一个系统的草图。软件架构描述的对象是直接形成系统的抽象组件。各个组件之间的连接则知道和相对细致地描述组件之间的通讯。在实现周期,这些抽象组件被细化为实质的组件,例如详细某个类或对像。
软件架构师:软件架构师定义和设计软件的模块化,模块之间的交互,用户界面风格,对外接口办法,创新的设计特性,以及高层事物的对象操作、规律和流程。
根据维基百科的解释:软件架构实则是各个组件的互相搭配和组件之间的相互协同,是抽象的高层事务的的规律流程。简单来讲架构便是各个系统组件怎样通讯、协调、以及掌控操作的规律。
能够类比人体的结构来举个简单的例子来理解便是:人体是由于心肝脾肺胃、耳鼻嘴等多个要紧器官构成,各个器官各司其职,它们之间相互协同一起维持人的正常生活。这儿的心、胃等便是全部人体架构的组件,血液便是数据,血管便是传输数据的媒介,人的皮肤和长相便是用户的界面风格,规律组织便是食品要首要进入胃去消化而后才会进入大肠,而不是进入肾脏。
根据这个解释,咱们运用的kafka、redis、ssm、rabbitmq、xxljob等都是组件,这些组件各有各的功效,各自承担自己的责任去一起完成全部系统的有效流转.
二:常用的架构技术
2.1:分布式
分布式:将同一套业务代码根据业务功能或自定义的维度拆分区别的子系统,各个系统掰开安排,每一个子系统叫做服务,每一个服务之间通常经过rpc或webservice来调用
2.1.1: 分布式的优点
分布式的好处便是解耦了原系统,从而便于运维安排和水平扩展,供给软件的伸缩性,乃至服务能够经过区别的语言来实现.各个模块交给区别的人员去研发,每一个人各司其职,显现问题亦能够快速定位
2.1.1:分布式的缺点
分布式亦并不是毫没缺点的,存在以下的问题:
①:服务调用经过网络来调用,通常微服务之间运用rpc来调用的,而rpc的底层便是TCP协议,倘若网络故障或延迟高一点,那样服务调用就有显现超时的可能性,例如dubbo的话会显现RpcException
②:分布式在业务体量比较小或粒度划分的状况下便是一种劫难式研发,研发和运维的成本都会直线上升
③:分布式的数据一致性和事务比较难以保证,业务日前运用最多的是两周期提交2pc,必须本地事务和远程事务综合提交,性能比较差
④:分布式session的守护在单体工程中是不必须思虑session的安全性的,而在分布式环境中就必要思虑怎样去守护session的一致
⑤:分布式事务问题:分布式下怎样保准各个服务的数据一致性亦是一种挑战,当程序显现反常崩溃的时候能够保准各个服务能够正常回滚是很要紧的。
分布式最平常的技术:分布式缓存、分布式存储、分布式计算、分布式静态资源
2.2:集群
集群:同一套代码安排在多个服务器上,而多个服务器能够供给更加多的cpu、内存、硬盘等资源,从而提高整理的处理请求能力。集群的每个服务器叫做节点,每一个节点供给的是相同的服务,节点的关系只是一种简单的复制,详细是哪个节点处理,则是按照负载平衡策略来决定;
在网站的处理能力显现下滑的时候,简单的在集群中增多服务器台数就能够明显增多整体的数据量处理能力(不外存在上限);
原理很简单:所说众人拾柴火焰高,多台服务器一块聚合处理数据量和并发拜访的能力肯定比单台服务器要高非常多;在遇到请求处理的瓶颈时候,能够经过简单的增多服务器台数来加强并行处理的能力,不外必须重视的是增多服务器台数在显现大于某个数量之后性能会停滞不前。
2.3:缓存
缓存是加强软件的性能第1手段,最有效和最具表率性的办法,缓存分为单机缓存和分布式缓存。最平常的分布式缓存技术为redis、memorycache等,单机缓存例如hashmap、concurrentHashmap、guava等。单机缓存的承载容量有限,而分布式缓存的伸缩性和的存储容量会比较可观,就算缓存的空间不足了,亦能够经过增多服务器来扩展。
缓存最明显的功效有两个:①加快数据的拜访速度 ②分担后端的数据拜访和存储的负载能力,守护数据库
运用缓存必须重视以下几点:
①: 缓存雪崩
缓存雪崩指的是所有的缓存在统一时间所有失效,引起海量的请求直接涌入数据库,数据库被击垮。
处理缓存雪崩的办法:缓存过期值在必定的基本上设置随机值
②: 缓存击穿
缓存击穿指的是某些热点key在某一时间所有失效了,引起海量的请求涌入后台DB数据库,处理缓存击穿的办法:热点数据设置永不外期
③:缓存穿透
始终请求不存在的数据,最后走的还是数据库便是缓存穿透
处理缓存穿透的办法:采用布隆过滤器(bloomFilter),布隆过滤会有必定的误差,然则能够晒选出必定不存在的数据,缺点是没法判定某个key是不是确定存在。
2.4:队列
试想这般一个的高请求量场景:各大电商的双11,在双11的那一刻,有海量订单涌入,后端会接受请求,而后写入数据库,等待数据库的返回.倘若请求量非常大的话,数据库读写IO就会阻塞,那样程序就会显现卡死,数据库崩溃等问题。
倘若采用队列的话,将下单请求发送到队列中,而后立刻返回(能够根据业务决定,例如返回处理中,等到真正成功再通告用户),这般就不必须等待后端必要返回成功。消费端能够根据请求的次序平滑的去消费,缓解了高峰的请求,并且实现了请求下单和实现下单的解耦。从以下图能够看出运用队列以后处理起来比较平滑~
2.5:多线程
多线程真正的道理有两个①加强cpu的利用率 ②:加快程序执行效率,日前已然是多核的时代,服务器六核、八核屡见不鲜,在多核的cpu中倘若运用单线程那样没疑是对多核cpu的浪费,多线程能够有效加强cpu利用的效率,多个任务分给多个cpu去处理,能够实现真正的并行处理。
倘若在单核cpu中,只是cpu在一直的切换cpu时间。假设咱们有十个表格的数据必须分析处理(计算密集型),采用单线程必须一个个的轮询表格,而多线程在恰当分配线程数的状况下就能够同期处理,加强研发的效率
2.6:限流
限流是面对高并发的利器之一,例如秒杀场景:在海量的请求涌入后台,QPS高达几十万,倘若不可做到有效掌控就可能引起请求击垮数据库,DB基本上是一个网站的命脉。缓存、队列、限流等方式的本质其实都是为了守护DB。限流的简单理解其实便是过滤掉没效的请求,将请求限制在一个能够掌控的范围内,最平常的限流有以下方式:
①: Redis限流
Redis限流的基本思路是采用redis的key过期策略,将业务id和业务值放入到redis中设置必定的过期时间,等请求再次进入的时候,倘若能从redis获取到值,那样我就由于是重复性请求。Redis过滤限流是最基本的限流手段,适用于过滤同一个用户请求的场景
②:令牌桶算法
令牌桶算法的思路是在必定的时间内生成以固定的速度生成有限个令牌数量放入桶中,所有的请求首要从令牌桶中去尝试获取令牌,倘若能获取到就能够继续执行,否则请求就会被抛弃。Google开源的guava中有RateLimter能够实现单机限流,令牌桶算法是限流非常有效的手段,
③: 漏桶算法
漏桶算法的基本原理是将请求直接存放在一个漏斗中,请求太多的话,那样就会漏斗就会溢出,溢出的请求则会被拒绝服务。漏桶算法能够掌控端口的流量输出速率,平滑请求的突发流量,实现流量整形.
由于漏桶算法的漏出速率是有效的,因此呢漏桶算法相比于令牌桶算法有一个明显的缺点是没法应对突发性的流量.可令牌桶算法是能够的
④: 滑动窗口
http为了掌控流量的速率采用的办法便是滑动窗口机制。倘若要分布式限流,可采用阿里的Sentinel框架,其基本原理是滑动窗口机制,利用Entry映射资源来平滑的限流
另外还有nginx限流,例如运用参数来限制某一个ip的在时间范围内的拜访频率。客户端限流:发起请求按钮点击后,在后面的几秒内(由业务决定)设置为disabled,这一操作过程虽然很小,然则带来的限流功效很可观
2.7:服务降级和熔断
非常多人会忽略这个问题,对自己设计出来的架构茫然自信,认为不可能出问题。而事实上,一旦随着微服务和分布式架构的连续推进,服务器会越来越多,宕机的概率和可能性会逐步提高,虽然显现宕机的可能性基本上很渺茫,不外亦应该做好服务降级和熔断的准备,以防止那万分之一的概率宕机。假设有1000台服务器出现宕机的概率是0.001%,就由于存在0.001%的概率会引起咱们的服务并非100%高可用。
服务的降级和熔断通常采用的是netfly(没错,便是那个美剧巨头机构)出的hystrix,能够实现服务熔断和降级
三:安全性问题
安全性的问题总是不被注重,其实安全的问题要比咱们想像的要严重的多.大机构每时每刻都会有区别程度被攻击者发起攻击,一旦被黑客获取到数据库信息,那样将会有丢失用户信息、服务器被移植木马病毒、服务瘫痪等不容小觑的危险
3.1 sql注入
sql注入是日前所有方式中最频繁亦是最严重的攻击手段,sql注入倘若被居心叵测的黑客攻击很可能全部数据库都会被删除掉,其情节和结果非常卑劣。
防止sql注入的有效方式便是采用jdbc供给的preparementStatement进行预编译,它能有效保准sql的整体结构不会被破坏,万一被sql攻击亦能够在预编译周期失败,而不会执行成功。
3.2 跨域攻击
与主站的域名、端口、协议不一致性的请求都能够理解为跨域拜访,浏览器有同源策略:浏览器会限制来自于区别源的documet和脚本对当前的document读取或设置部分属性,然则例如src\form表单提交\< img >\< iframe >\< link >是无跨域限制的。
csrf攻击:登陆网站A,获取到了网站A的cookie用户信息,而后点击了一个恶意网站外链B,网站B能够利用csrf漏洞模拟A网站的用户信息去请求A的某些敏锐接口,例如转账、发送信息、邮件、获取部分信息、发起恶意代码等。
怎样防止csrf攻击:①接口请求加上随机的token值或token约束的规则,或是有时效性的token码。这般的话,外链去拜访接口在拦截器中验证token是不是有效,②在http的头部加入自定义参数:放到 HTTP 头中自定义的属性里。经过 Ajax,能够一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中
③减少运用get提交,get提交会降低门槛
3.3:XSS攻击
xss攻击指的是攻击者对包括有漏洞的服务器注入js代码,会诱使受害者打开攻击的服务器URL,其中里面的URL会包括有些恶意代码,例如移植病毒、添加宣传片段代码、篡改接口信息等。
预防xss攻击的办法:针对用户提交的内容,必须过滤任何有执行能力的脚本或影响页面的CSS,
四: 架构设计的误区
4.1:为了高挑上而设计出繁杂的架构
试想倘若在业务体量不是特点大的状况下,倘若一味的追求时髦,追求新颖,采用分布式微服务架构,那样将会增多业务研发的难度,为了守护海量的微服务而多出非常多成本。好的架构必定是适应于自己的业务发展的,而高于业务的,它拥有顺应业务发展的前瞻性。
4.3:用技术能够处理一切问题
企图用技术处理一切问题,认为技术是一切的处理之道,是万能的,其实有的时候技术处理不了的问题能够用从业务方向来思虑处理。例如之前楼主做个售票系统,重点是卖某个知名景点的票的业务。
后期上线后发掘非常多人买了非常多特价免费票,特价票是针对导游带领的团员的,每一个导游每日只能买一张特价免费票和一张半价票,之后看数据发掘了非常多导游配了两张票,而后那张半价票被退掉,只剩下一张免费票被刷了。技术总监就决定查这部分数据是怎么回事?
结果发掘部分人利用导游证这个特惠故意购买没价票,这个问题怎样从技术上处理呢?倘若不准许导游买特惠票不恰当,不准许退票亦不恰当。技术上貌似无好的手段去杜绝这个问题,只能从线下去处理。
五:总结
本篇文案的重点概略图我总结了一下,大概如下,其中包含分布式、集群、缓存、微服务、队列等,这关联的文案都发布过,关注公众号「Java后端」关注后回复「666」下载一本技术栈手册就能够看到历史发布的技术文案。
架构的专题弥足长远和繁杂,不是一篇简单的文案能描述清楚的。本篇文案只是提纲挈领以下,说实话亦是蜻蜓点水,期盼能起到抛砖引玉的效果,不外在工作中思考、在实践中总结学习,是有助于加强咱们的内功心法的。
热门内容:
5种分布式事务最后一致性处理方法,一次性说清了!
拜访了这位小哥的GitHub后,我失眠了!
咱们已然不消AOP做操作日志了!
剧烈不意见你用 a.equals(b) 判断对象相等!
近期面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更加多内容持续奉上。 明天见(。・ω・。)ノ♡
|