- 博客(160)
- 收藏
- 关注
原创 【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第六节:伸缩性思考-负载均衡算法
负载均衡算法,我们就说这么多。上一篇文章讲了负载均衡,这篇文章讲的负载均衡算法,其实都是为了伸缩性做考虑。伸缩性就是通过算法找后端的一台机器,然后找到后端的那台机器之后,把请求发给他。这里面有一些算法,如果他要缩的话,就需要去改一下。比如说轮询,我们在数组去存对应的三台服务器的IP地址,如果我们需要把一台服务器删掉,就需要把数组里面的这个地址也给它去掉。关于服务器的伸缩,在我们的系统当中,如果能做成自动化的,就会更好。这一方面,通过云原生的解决方案去做,是比较好的。
2025-03-09 14:50:17
837
原创 【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第五节:伸缩性思考-负载均衡
本篇文章我们来学习伸缩性的思考。通过前面的知识呢。我们来看一看伸缩性怎么做。在前面,我们讲过了DNS、CDN,还有正反向的代理,这些和网站的伸缩性有一定的关系。所谓的网站的伸缩性是指。不需要改变网站的软硬件设计,仅仅通过改变部署的服务器的数量,就可以扩大或者缩小网站的服务处理能力。一些特别大的网站都经过购买很多服务器用来应对流量洪峰的情况。
2025-03-09 14:48:08
924
原创 【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第四节:请求链路中代理的作用
那么反向代理是什么呢?反向代理是服务端配置代理。所有的请求,由服务端接收,然后再由代理服务器分发到后面的服务器。我们来画一个图:这是一个代理服务器,代理服务器里配置了后面好多个服务器的地址,所有的用户请求,都来请求它,但是代理服务器这边配置了后面好多服务器的地址,然后代理服务器再将这些请求分发到后面的不同的机器上去,这个就叫做反向代理好了。这样一来,所有的请求呢,都由这么一个服务器来接收,无法判断这台代理服务器代理了多少的后端服务。
2025-02-26 21:28:37
771
原创 【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第三节:CDN扩展-多地址直连
我们总结一下,上面的这两种方式,基于注册中心和基于规则中心,他们都有一个共同的特点,就是客户端和服务器在真正获取数据的时候是直接连接的,注册中心和规则中心只是负责将用户的请求进行分流。在整个过程中,服务并不需要注册中心和规则中心的中转,只需要问他们我需要找谁,他们只是告诉一下我需要找谁,简单的地址解析请求或者给客户端提供一个IP地址即可。那么客户端至于要拿什么数据,它是直接跟我们的源站连接的。所以呢,这种方案,也叫做多地址直连,就是CDN的扩展,CDN扩展也叫多地址直连。举个例子,就像我们去租房子一样。
2025-02-26 21:26:43
590
原创 【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第二节:CDN优化
我们的系统部署在互联网上的某个节点上,这个系统别人要访问的时候,有一个IP地址,我们的客户端通过DNS的解析,拿到IP地址之后,根据这个IP地址去访问对应的这个服务器。比如说我们的机房部署在北京,然后我们的用户就那么几千个人,就服务北京的这一圈人,那么我们的这样的1000人在这个北京范围内访问系统还好,没有什么太大的问题。
2025-02-23 16:18:13
1181
原创 【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第一节:DNS优化
在前面的文章中,我们讲过了客户端的优化,从本篇文章开始我们来学习,请求从客户端发出之后到达具体业务逻辑的服务器之前,应该怎么优化,本篇文章我们来学习DNS的优化。
2025-02-23 16:16:24
785
原创 【深入理解SpringCloud微服务】Sentinel规则持久化实战
第二种办法是修改Sentinel控制台的源码,Sentinel控制台不和Sentinel客户端直接通讯,而是把在控制台上新增或修改的规则保存到配置中心,由配置中心通知Sentinel客户端。原因是因为Sentinel控制台发布到nacos的格式是按照ParamFlowRuleEntity的格式推的,而Sentinel从nacos拉取到热点参数规则时,是解析成ParamFlowRule的。这种模式是最简单的,不需要做任何改造,但是一旦Sentinel客户端重启,所有的规则都会丢失。
2025-01-25 20:03:26
1016
原创 【深入理解SpringCloud微服务】Sentinel源码解析——DegradeSlot熔断规则
如果到了可以重试的时间,那么调用fromOpenToHalfOpen方法尝试切换为半开状态,这里有可能会切换失败,因为有可能有多个线程并发尝试切换,只有成功切换的那一个线程被放行,其他的都会被拦截掉;当断路器处于打开状态一段时间后,就会变成半开状态,此时断路器允许一次请求调用,如果这次请求调用成功,那么断路器切换为闭合状态,否则重新变成打开状态。如果我们设置的熔断策略是“慢调用比例”,那么断路器会利用滑动时间窗统计总调用数和慢调用数,如果本次调用超过了设置的最大响应时长,那么就记一次慢调用。
2025-01-25 20:01:32
959
原创 【架构师从入门到进阶】第四章:前端优化思路——第三节:前置资源和缓存
http缓存是指能控制客户端各级代理和各级交换机等设备对页面资源进行缓存。大家注意我所说的这一点,就是http缓存这一块是控制什么?比如说这是一个客户端,它要去经过路由器,然后经过网络交换中心,然后经过网络中的各个节点,然后才能到达我们的真正的服务端是吧?比如说从你家出去,经过路由器交换机,包括市区的节点,城市的节点,然后什么陆地上的光纤各种乱七八糟的转化的路由器等等,最后才能到达我们的服务器,中间的节点是非常多的,我们统一把中间这些叫做中间节点。中间节点它是什么呢?指代很多东西。
2025-01-12 12:20:55
1035
原创 【架构师从入门到进阶】第四章:前端优化思路——第二节:减少不必要的传输
本篇文章我们来学习前端优化:“减少不必要的传输”。这四个分别什么意思呢?我们一一来进行解释。
2025-01-12 12:17:27
763
原创 【深入理解SpringCloud微服务】Sentinel源码解析——FlowSlot流控规则
在前面的文章,我们对Sentinel的原理进行了分析,Sentinel底层使用了责任链模式,这个责任链就是ProcessorSlotChain对象,链中的每个节点都是一个ProcessorSlot,每个ProcessorSlot对应一个规则的处理。然后我们又对Sentinel的整体流程进行了源码分析,我们分析了Sentinel的ProcessorSlotChain对象默认的构成:但是我们没有对每个slot进行深入的分析,本篇文章就对它们进行深入的了解。
2024-12-28 20:14:37
1376
原创 【深入理解SpringCloud微服务】Sentinel源码解析——SentinelWebInterceptor拦截器与@SentinelResource注解原理
invokeResourceWithSentinel方法中的两个catch块是值得我们注意的,它会寻找@SentinelResource注解是否有指定降级处理方法,如果有的话会执行降级处理,这也是SentinelWebInterceptor拦截器不具备的一个能力。使得@SentinelResource注解注解生效的是SentinelResourceAspect切面类,它通过AOP对@SentinelResource注解修饰的方法进行增强,织入Sentinel进行规则校验的模板代码。
2024-12-28 20:12:29
663
原创 【架构师从入门到进阶】第四章:前端优化思路——第一节:前端优化概述
本篇文章我们来学习前端优化的概述。为什么开始学前端呢?大家思考一下,我们在之前的文章中写过这么一段话。我们优化的点是从用户使用我们系统开始,直到我们响应用户为止。那么,首先第一个问题,用户什么时候开始使用我们的系统?比如说一个人,当这个人开始点我们的APP的时候是吧,开始上面操作的时候,我们就可以做优化了。那么第一个优化在哪里?只要用户一个动作发生之后,因为用户觉得这个动作已经脱离他自己了,就等着很着急的要这个响应,越响越快,用户的体验度越好。那么第一个优化在用户的手发出指令之后,到达我们APP之前。
2024-12-08 11:24:26
763
原创 【架构师从入门到进阶】第三章:系统整体优化思路——第一节:整体优化思路
本篇文章我们来看一下整体优化思路。什么意思呢?一一给大家解释。首先,我这里面给大家抛出一个问题,平时我们所说的亿级流量的系统是如何做的?是靠我们写代码吗?大家觉得亿级流量靠写代码能实现吗?你代码写的再精妙,精妙到天上去了,全世界就你的代码最精妙,能实现亿级流量吗?当然实现不了。因为你的代码再厉害,也得在机器上跑,你的机器就算再厉害,厉害到天上了,全世界最顶尖的机器了,把代码布到你这台最顶尖的机器上,能扛得住亿级流量吗?举一个例子。双11的活动在十年前,那一瞬间的流量,都能拖垮一个中型城市的网络带宽。
2024-12-08 11:23:01
934
原创 【深入理解SpringCloud微服务】Sentinel硬编码模式源码解析
方法时,Sentinel就会以责任链模式的方式逐一调用chain中的slot去进行规则校验,一旦某个slot校验不通过,那么就终止,所有slot都检验通过才算校验通过,最后entry方法会返回一个Entry对象。业务逻辑执行完毕后,我们需要调用Entry的exit()方法,Entry对象默认是CtEntry类型,那么调用的就是CtEntry的exit()方法。)方法进行规则校验。可以看到fireEntry()就是用于调用下一个slot的transformEntry方法触发该slot的执行的。
2024-11-24 11:37:16
1155
原创 【深入理解SpringCloud微服务】Sentinel功能详解
上一篇文章《Sentinel实战与原理剖析》我们没有对Sentinel的功能进行讲解,本篇文件将对它们进行详细的解析。
2024-11-24 11:34:42
1315
原创 【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
大型的网站需要面对大量的用户的高并发访问和海量的存储要求,或者说我们的系统从开始用户量很少的情况下到后面用户越来越多,一边是用户的访问量会增大,二是存储的数据量也会增大。这个时候系统就有扩容的需求,所谓的这种伸缩性呢就是指不断的向集群中加入服务器的手段来缓解不断上升的用户访问,和不断增长的数据需求。什么意思呢?就是说我这个系统扛不住这么多的用户请求,也扛不住这么多的数据的存储,那么我就需要进行扩容了。扩容就需要用到伸缩性,为什么叫伸缩性呢?
2024-11-09 11:44:38
842
原创 【架构师从入门到进阶】第一章:架构设计基础——第五节:架构演进(缓存到微服务)
到这里,我们就会有一个结论:大家做架构设计要有一个信心,就是不要怕架构无法满足业务。当真的遇到架构变得越来越复杂,复杂度成指数级提升的时候,创新的解决办法就会有了,天无绝人之路。从我们前面的演进过程来看,我们发现每次技术架构的变革,都是由于技术无法满足业务,要么是业务量增大了,要么是用户增多了,数据量增大了等等。为了应对这些业务的变化,我们来调整我们的架构。所以说,技术和业务呢,是相辅相成,相互促进的。这就是技术演进的大概的路径。初始阶段:一台服务器。
2024-11-09 11:41:58
879
原创 【深入理解SpringCloud微服务】Sentinel实战与原理剖析
如果是引入的spring-cloud-starter-alibaba-sentinel依赖,那就不需要配置Sentinel切面类了,spring-cloud-starter-alibaba-sentinel已经通过自动装配的方式帮我们配置好了。使用拦截器方式,就不需要声明@SentinelResource注解了,如果通过控制台配置规则的话,甚至连上面FlowRuleInit的流控规则配置都可以不需要,只需要引入依赖jar包,然后配置一个拦截器即可。剩下的就是在控制台配置规则。
2024-10-26 11:27:13
848
原创 【深入理解SpringCloud微服务】Hystrix作用与原理剖析
前面三篇文章,我们已经了解了微服务的熔断、限流、降级,并且也手写了一个熔断限流框架。从本篇文章开始,我们了解一下相关的开源框架Hystrix与Sentinel,本篇文章先解析Hystrix,后面的文章解析Sentinel。Hystrix其实已经算是一个过期了的技术,说实话不学也没什么问题,毕竟现在都有Sentinel了,但是我们简单了解一下,有助于与Sentinel作对比。
2024-10-26 11:25:28
989
原创 【架构师从入门到进阶】第一章:架构设计基础——第四节:架构演进(初始阶段到读写分离)
本篇文章我们学习架构演进的初始阶段。我们来看一下,互联网系统是如何从小网站逐步变大的,我们过一遍架构演进的历程,让大家对系统的演化心中有个谱。但是,这里面首先说明一点,并不是所有的网站都是像我下面所说的这样演进的,我说的只是个大概,不是统一的表达,就像我们前面所说的架构设计,没有统一的模式。
2024-10-12 10:40:51
1394
原创 【架构师从入门到进阶】第一章:架构设计基础——第三节:大型网站的特点
本篇文章我们来看一下大型网站的特点。我们首先得知道大型网站的特点,之后才知道我们做架构设计的目标或者方向。和小网站或者传统的软件系统做对比,大型网站有下面这些特点。第一个是高并发大流量。大型网站需要面对高并发大流量的访问,比如说谷歌。谷歌上现在的日均pv(就是page view)是80亿,微信的日活是六亿。这个都是一般的小网站或者传统的项目无法比拟的。第二个是高可用。大型网站因为服务的用户比较多,一般要求系统是7×24小时不间断的提供服务。
2024-10-12 10:39:23
278
原创 【深入理解SpringCloud微服务】手写实现断路器算法
假如时间往后走了5秒,此时时间是2024-04-05 20:09:25,时间戳是1712318965000,那么currentTimeSeconds = 1712318965000 / 1000 = 1712318965,然后timeIndex = 1712318965 % 5 = 0,得到的时间窗格数组下标又是0,然后times[timeIndex]是1712318960,不等于1712318965,那么得知时间窗格已过期。我们的BasicBreaker实现的是滑动时间窗统计失败数的断路器。
2024-10-06 09:06:27
1101
1
原创 【深入理解SpringCloud微服务】手写实现各种限流算法——固定时间窗、滑动时间窗、令牌桶算法、漏桶算法
我们在上一篇文章手写实现了一个熔断限流微服务框架,但是限流算法和断路器的具体实现没有进行详细分析,今天是对上一篇文章的补充。当然由于本篇文章专注于限流和断路器算法,因此没有看过上一篇文章也可以学习本篇文章。
2024-10-06 09:03:59
1232
原创 【架构师从入门到进阶】第一章:架构设计基础——第二节:架构设计原则
本篇文章我们来学习架构设计的原则,有这么三个原则,第一个是合适原则,第二个是简单原则,第三个是演化原则。许多同学心中或多或少有成为架构师的想法,可是并不是说你把代码写好,就能成为一个架构师,优秀的程序员和架构师之间,还有一个明显的鸿沟需要跨越,这个鸿沟就是不确定性。对编程来说,它是不存在不确定性的,对于同样的一行代码,不管是谁写的,不管什么时候执行,执行的结果总是确定的,这里的确定呢,它不一定是正确性,也就是说哪怕这个程序运行的有bug,那它也是确定的。但是。
2024-09-29 09:05:52
899
原创 【图解秒杀系列】秒杀技术点——隔离、熔断、限流、降级
一个容器有它独立的与外界隔离的环境与资源,包括CPU、内存等,如果容器中的服务出问题,比如占用资源过高,也不会影响到别的容器中的服务。秒杀系统的隔离是指单独部署一套秒杀服务,与常规的服务区分开,这样即使秒杀服务出了问题,原先的服务也不会受影响。比如服务A的接口调用服务B的接口发生异常或超时,那么服务A的接口进行降级逻辑,调用本地的一个方法,返回默认的数据。接口级别的降级是指,原有的逻辑无法正常执行,转而执行的一段备用的有损的逻辑。被流控的请求,可以报错返回错误信息,也可以走降级处理的逻辑。
2024-09-29 09:04:29
1194
原创 【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器
我们通过SpringAOP扫描被@Protected注解修饰的方法,给它们生成代理对象,并且通过SpringAOP的@Around注解定义了环绕增强逻辑,当请求被@Protected注解修饰的接口方法接收时,就会进入这里的增强逻辑,增强逻辑做的自然就是熔断、限流、降级等这些事情。当调用一个接口方法时,如果被流控,或者断路器处于打开状态,或者执行目标方法时超时或抛出异常,并且接口设置了降级回调,那么执行对应Fallback实现类的降级处理方法。限流也叫流控,也就是流量控制,作用是限制流入服务接口的流量大小。
2024-09-21 08:24:04
1689
1
原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(六)——spring-cloud-context关于配置刷新的公共逻辑
我们在上一篇文章《客户端监听配置变更并刷新的源码分析》中最后说到,nacos客户端监听到配置变更通知后,会发布一个RefreshEvent事件,触发spring-cloud-context关于配置刷新的公共逻辑。但是由于它不是nacos实现的逻辑,我们没有对这段逻辑进行分析,本篇文章将会分析spring-cloud-context关于配置刷新的公共逻辑。
2024-09-21 08:19:51
1217
原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(五)——客户端监听配置变更并刷新的源码分析
listener.receiveConfigInfo(contentTmp)里面会调用到innerReceive方法,就进入了在NacosContextRefresher的registerNacosListener方法创建的监听器实现的innerReceive方法。...@Override...// 发布一个RefreshEvent事件...});...这里的监听器的innerReceive方法被触发,发布一个RefreshEvent事件。
2024-09-14 09:34:33
1486
原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(四)——配置新增或修改源码分析
dump配置内容到磁盘文件是通过DumpService进行的,DumpService先把新增或修改的配置dump到磁盘文件,然后根据文件内容算出一个MD5值,再拿到算出的MD5值与缓存中该配置文件对应的MD5值进行比较,如果两MD5值不一致,说明修改后的配置内容与修改前不一致,也就是发生了配置变更,需要更新MD5值并通知客户端。ConfigCacheService的dump方法在服务端启动的时候也会调用,这个我们在上一篇文章《服务端启动与获取配置源码分析》已经分析过,这里就不再分析了。
2024-09-14 09:31:06
535
原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(三)——服务端启动与获取配置源码分析
ConfigCacheService的updateMd5方法首先从从一个ConcurrentHashMap中根据groupKey获取CacheItem,然后判断如果CacheItem等于空或者CacheItem中的md5值与刚算出的md5值不匹配则进入分支,由于是刚启动,因此CacheItem肯定等于空,所以会进入if分支。由于已经查询MySQL然后dump到磁盘成配置文件了,因此当接收到获取配置的RPC请求时,就不需要再去查询MySQL,而是读取磁盘的配置文件即可。
2024-09-07 10:12:47
1159
原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(二)——客户端启动源码分析
NacosPropertySourceLocator的loadNacosDataIfPresent()调用loadNacosPropertySource方法获取配置信息,返回NacosPropertySource,然后把NacosPropertySource放入CompositePropertySource。然后循环遍历每一个PropertySourceLocator,调用locate方法,返回的PropertySource对象放入CompositePropertySource中。
2024-09-07 10:11:39
999
原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(一)——宏观理解nacos配置中心原理
nacos配置中心的作用就是在微服务架构中负责集中管理各个微服务工程的配置文件,原先散落到各个微服务本地的配置文件,现在都集中存储到nacos上,这样更方便管理和维护。nacos配置中心客户端以jar包的形式被各微服务引入,然后微服务启动的时候,会通过nacos配置中心客户端请求nacos服务端拉取该微服务对应的配置,然后把拉取到的配置加载到Environment中。nacos有一个控制台界面,可以在上面修改配置信息。
2024-08-31 11:12:59
1030
原创 【深入理解SpringCloud微服务】深入理解微服务配置中心原理,并手写一个微服务配置中心
这里我们可以再回顾一下服务端的LongPollingService和客户端的LongPollingClient的关系。通过websocket建立了长连接建立连接后,会回调监听器RefreshListener发送对应的environment和serviceName,LongPollingService接收到后会保存其与Session的对应关系。
2024-08-31 11:10:45
1785
1
原创 【图解秒杀系列】秒杀技术点——缓存预热,库存预扣 & 异步下单,超时未支付库存回填
由于热点数据没有加载到缓存中,当秒杀开始时,大量请求由于缓存缺失,都涌向了数据库,此时数据库就会面临很大的压力。但是有时候用户超时了也没有进行支付,此时除了要告知用户比如“超时未支付,秒杀失败”等的消息外,还要把扣减的库存回填回去,如果缓存中还有售罄标志,那么还要把该标志修改为false,此时秒杀按钮再次从灰变成亮。“检查redis中的库存”,“以及扣减redis中的库存两个动作”,必须保证原子性,因此这里可以使用lua脚本的方式来处理。lua脚本在redis中执行可以保证脚本中的多个动作具有原子性。
2024-08-24 10:11:10
1391
3
原创 【图解秒杀系列】秒杀技术点——多级缓存、分层过滤
但是,直接用HashMap做本地缓存有一个缺点,就是对于一些冷数据的删除是不方便的,如果不做删除的话该HashMap占用的空间会越来越大,因此我们还要自己维护数据的访问频率或者最近的访问时间,以便于冷数据的删除。分层过滤是秒杀系统中高效处理高并发请求的策略,分层过滤采用“漏斗”式设计,通过在不同层次上逐步过滤无效请求,确保只有有效请求能够到达系统后端,从而减轻系统压力,提高系统的处理能力和响应速度。一般而言,我们会把本地缓存的过期时间设置的短一点,而分布式缓存的过期时间设置的较长一点。
2024-08-24 10:09:13
1146
原创 【架构师从入门到进阶】第一章:架构设计基础——第一节:架构设计的目的
本篇文章我们来学习架构设计的目的,我们从两个角度去分析,第一个就是架构设计的误区,然后再分析目的。
2024-08-18 11:47:51
857
原创 【深入理解SpringCloud微服务】Spring-Cloud-OpenFeign源码解析(下)——LoadBalancerFeignClient详解
由于LoadBalancerFeignClient里面使用到了RxJava ,因此我们要先了解一下RxJava ,RxJava 是一个在Java平台上实现响应式编程的库,用于处理异步数据流。我们看一下LoadBalancerFeignClient里面用到的RxJava的相关方法,其他的RxJava方法我们就不研究了,因为重点是LoadBalancerFeignClient的源码,而不是学习RxJava。// 创建一个负载均衡命令对象try {
2024-08-18 11:18:18
1155
原创 【深入理解SpringCloud微服务】Spring-Cloud-OpenFeign源码解析(上)
Feign对Ribbon和各种http客户端工具类(如OKHttp、HttpClient、HttpURLConnection等)进行了封装,使得开发者无需再手动调用RestTemplate发起http请求,而是以方法调用的方式向远处服务发起请求。当使用Feign之后,开发者要做的就是在接口以及接口方法上使用Feign的注解修饰,Feign就会扫描并给这些接口生成一个代理对象,当我们调用接口的方法时,实际上就是调用代理对象,底层就会通过Ribbon进行负载均衡,然后使用http客户端发起http请求。
2024-08-18 11:16:18
987
原创 【图解秒杀系列】秒杀技术点——秒杀按钮点亮、削峰
因此在生成的这个静态页面中,会加入一个特殊JavaScript,该JavaScript携带了秒杀是否开始的标识,该JavaScript不会被浏览器缓存,每次刷新页面都会请求一次,由于该JavaScript文件的体积很小,因此每次刷新页面都请求一次也不会对服务器造成什么压力。增加了答题或者验证码机制后,每个用户答题或输入验证码的速度都是不一样的,有的快有的慢,这就有效的把不同用户下单的请求在时间上错开了,很好的把一瞬间的请求均摊到一个相对较长的时间范围内,使得服务承受的并发压力大大降低。
2024-08-17 09:31:45
1191
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人