⑴ 京东hotkey源码解析
京东hotkey是一个经过京东大促验证的hotkey防御中间件,大概原理是通过上报key访问数到统计服务器集群,统计服务器集群将hotkey通知到客户端,让hotkey能缓存到本地内存中,做到毫秒级的Scale-Out。处理方式有点像美团cat实时收集数据进行统计,只不过美团cat没有反向通知逻辑而已。非常贴近工作实践,值得一看。
首先看一下缓存入口Cache的get方法,JdHotKeyStore.getValue是获取hotkey的方法,并且会进行访问次数的统计上报,如果获取到hotkey不为空,则直接返回,否则从redis获取并调用JdHotKeyStore.smartSet判断是否有hotkey,有则设置值,最后返回。
JdHotKeyStore.getValue会先调用inRule校验此key是否有对应规则,如果没有对应规则则不处理,然后调用getValueSimple从本地内存中获取hotkey的存储对象ValueModel,如果没有获取到,则调用HotKeyPusher.push开始计数;如果获取到,会调用isNearExpire判断是否快过期了,如果是也计数,然后取出ValueModel里的value是否有设置对应值,有才返回。最后调用KeyHandlerFactory.getCounter().collect进行对应规则的计数。下面来一步步分析此流程。
inRule会去KeyRule缓存中获取对应的规则,经过层层调用会到KeyRuleHolder的findByKey方法,然后继续调用其findRule方法选择对应的KeyRule,如果没有KeyRule就直接返回了,否则会拿到它的ration(hotkey缓存时间),拿到对应ration的本地缓存。实际上这里为了方法的通用性,用了get来代替contain的判断。
findRule的逻辑比较特别,作者已经留下了注释,优先全匹配->prefix匹配-> * 通配,这样做是为了更精确选择对应的规则。比如配置了sku_的前缀规则,但是茅台sku的流量突升,需要针对茅台sku的本地缓存再长一点时间让系统平稳渡过高峰期,那就配置一个sku_moutai_sku_id的全匹配规则,这样不会干扰到其他sku的缓存规则。
那么KEY_RULES的规则是怎么来的呢?这就要说到etcd了,其实可以把etcd当做zookeeper,也有对配置crud,然后通知客户端的功能。这里是做了定时拉取+监听变化的双重保证,这里跟携程apollo的处理非常像:不要把鸡蛋放在一个篮子,兜底功能真的很重要。每5秒定时从etcd拉取规则,开启监听器有变化就去etcd拉取规则。fetchRuleFromEtcd从ectd的rule_path获取rules,然后转化成ruleList继续调用notifyRuleChange进行本地处理。
notifyRuleChange会往EventBus发送KeyRuleInfoChangeEvent的通知,进而进入KeyRuleHolder的putRules方法,这里可以看到维护了KEY_RULES和RULE_CACHE_MAP。
回到原有流程,getValueSimple方法的链路比较长,主要是通过key的规则,获取到对应的ration,然后从对应ration的本地缓存中获取ValueModel。
接下来是HotKeyPusher.push,如果是remove则在etcd创建一个节点然后再删除,达到集群删除的效果。如果是探测并且key在规则内,则调用KeyHandlerFactory.getCollector().collect进行统计。
KeyHandlerFactory.getCollector().collect方法交替使用两个map,对count进行累加,这样清理map的时候就不需要停顿了,交替使用是避免停顿的有效方式。
接回上文,还有一个 KeyHandlerFactory.getCounter().collect收集的是规则的访问次数,也是取到对应的规则,然后对规则的访问总数、热次数进行累加。
两个指标的收集已经分析完毕,那怎么发送到worker呢?来到PushSchelerStarter,这里会启动对两个指标的定时线程池,分别会定时调用NettyKeyPusher的send和sendCount方法。
NettyKeyPusher的send和sendCount方法都是为统计数据选择对应的worker然后进行请求,chooseChannel就是根据key哈希到其中一个worker上,然后发送请求即可。
最后当worker统计到hotkey时,client需要接收worker推送过来的hotkey进行存储,可以看到NettyClientHandler会向EventBus发送ReceiveNewKeyEvent事件,ReceiveNewKeyListener收到此事件后将调用receiveNewKeyListener.newKey,将hotkey放到本地缓存,client端的处理流程就结束了。
由上文可知,client与worker的交互只有推送统计数据到worker,worker接收处理,最后推送hotkey到client。因此worker端只需要分析两个部分:统计数据汇总、推送hotkey。
首先看到HotKey的处理逻辑是在HotKeyFilter中,首先会对totalReceiveKeyCount进行累加,然后调用publishMsg,如果统计信息超时1秒或者在白名单中就不处理,否则继续调用keyProcer.push。
keyProcer.push将未过时的统计信息丢进queue中。
worker端会开启指定数量的KeyConsumer,不断消费queue中的统计数据。根据统计数据的类型调用KeyListener的removeKey和newKey。
KeyListener的removeKey和newKey方法对Cache中的滑动窗口SlidingWindow进行删除或者累加,删除或者达到一定访问数就会推送到根据appname选出所有client进行推送。
京东的hotkey处理是通过计数来动态判断是否为hotkey,然后缓存再本地内存中,做到毫秒级的scale out。那还有没有其他解决方案?下面是我的观点:
1.如果面对一些缓存key很少的场景,比如活动页信息(同时进行的活动页不可能超过1000),完全就可以直接将缓存放在本地内存中,到了刷新时间就从redis拉取最新缓存即可,不需要动态计算hotkey。也就是常见的多级缓存。
2.同样是动态判断hotkey,但会将hotkey迁移到专门的、更多节点、更高性能的hotkey redis集群中,集群中每个节点都有同一个hotkey缓存,这样就可以做到请求的分散,避免流量都流向同一个redis节点,判断是hotkey就去hotkey集群中取,不需要存在本地内存中了,维护起来会比较简单。
⑵ 关于Spring Cloud Alibaba,看这篇文章就够了!(附教程资料)
首先我们需要了解一下Spring Cloud,然后再来了解Spring Cloud Alibaba;
源自官方描述:
Spring Cloud为开发人员提供了一些工具用来快速构建分布式系统中的一些常见模式和解决一些常见问题(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、群集状态)。分布式系统的协调导致了很多样板式的代码(很多固定套路的代码),使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地运行,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台;
Spring Cloud为分布式系统开发的典型应用场景提供良好的开箱即用的功能:
Spring Cloud Alibaba是Spring Cloud下的一个子项目,Spring Cloud Alibaba为分布式应用程序开发提供了一站式解决方案,它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序,使用Spring Cloud Alibaba,您只需要添加一些注解和少量配置即可将Spring Cloud应用程序连接到Alibaba的分布式解决方案,并使用Alibaba中间件构建分布式应用程序系统;
Spring Cloud Alibaba 是阿里巴巴开源中间件跟 Spring Cloud 体系的融合:
动力节点的Spring Cloud Alibaba学习教程,将带你深入掌握基于Spring Cloud Alibaba技术栈的微服务开发技术,包括nacos、sentinel、seata、gateway、skywalking等,培养独立进行企业微服务项目架构的能力;
Spring Cloud Alibaba视频教程
https://www.bilibili.com/video/BV1nK4y
Spring Cloud Alibaba资料下载
http://www.bjpowernode.com/?toutiao
•001.视频导读
•002.Spring家族产品梳理
•003.What is Spring-Cloud-Alibaba?
•004.Nacos运行环境部署
•005.向Nacos注册中心注册服务
•006.从Nacos发现服务并负载均衡调用
•007.从Nacos发现服务并负载均衡调用
•008.Nacos客户端信息缓存
•009.Nacos客户端信息缓存
•010.Nacos Config配置中心启动读取外部配置
•011.Nacos Config配置中心自动刷新
•012.Nacos Config配置中心yaml配置
•013.Nacos Config配置中心多环境配置
•014.问答交流
•015.内容回顾-配置中心数据模型
•016.配置中心三层结构数据配置隔离
•017.配置中心三层结构数据配置隔离
•018.配置版本回滚-服务注册分组
•019.Nacos管控台用户权限管理
•020.Nacos数据持久化
•021.Nacos数据持久化
•022.Nacos集群环境部署
•023.Nacos集群环境测试
•024.Nacos集群统一入口Nginx
•025.快速回顾
•026.RestTemplate无参数Get调用返回String
•027.RestTemplate无参数Get调用返回User
•028.RestTemplate有参数Get调用返回User
•029.RestTemplate有参数Get调用返回User
•030.RestTemplate有参数Post调用返回User
•031.RestTemplate有参数Post调用返回User
•032.RestTemplate传输User对象参数Post调用返回User
•033.RestTemplate传输JSON参数Post调用返回User
•034.RestTemplate有参数Put调用
•035.RestTemplate有参数Delete调用
•036.RestTemplate方法调用梳理总结
•037.RestTemplate结合Ribbon实现负载均衡
•038.RestTemplate结合Ribbon实现负载均衡
•039.Ribbon负载均衡实现策略
•040.自定义Ribbon负载均衡实现策略
•041.更改Ribbon负载均衡实现策略
•042.Ribbon的核心接口组成
•043.Ribbon负载均衡策略个性化配置
•044.Ribbon结合Nacos实现权重负载均衡策略
•045.Ribbon结合Nacos负载均衡策优先调用同名集群
•046.Ribbon结合Nacos基于版本负载均衡策略
•047.Ribbon结合Nacos基于命名空间负载均衡策略
•048.What is Feign?
•049.Spring Cloud Alibaba基于Feign的远程调用
•050.Spring Cloud Alibaba基于Feign+Ribbon负载均衡远程调用
•051.Spring Cloud Alibaba基于Feign的相关配置
•052.脱离Ribbon的Feign的远程调用
•054.微服务的级联故障服务雪崩
•055.Spring Cloud Alibaba集成Sentinel
•056.Spring Cloud Alibaba基于Sentinel管理后台数据测试
•057.Spring Cloud Alibaba基于Sentinel实现限流
•058.Spring Cloud Alibaba基于Sentinel实现限流自定义返回结果
•059.Spring Cloud Alibaba基于Sentinel实现限流自定义跳转页面
•060.Spring Cloud Alibaba基于Sentinel线程数限流
•061.Spring Cloud Alibaba基于Sentinel资源关联限流
•062.Spring Cloud Alibaba基于Sentinel流控规则和流控效果
•063.问答交流
•064.快速回顾和演示环境预备
•065.Spring Cloud Alibaba Sentinel 服务降级RT
•066.Spring Cloud Alibaba Sentinel 服务降级异常比例和异常数
•067.Spring Cloud Alibaba Sentinel 热点参数规则
•068.Spring Cloud Alibaba Sentinel 热点参数规则小细节
•069.Spring Cloud Alibaba Sentinel 系统保护规则
•070.Spring Cloud Alibaba Sentinel 授权规则
•071.Spring Cloud Alibaba Sentinel Dashboard控制台通信原理
•072.Spring Cloud Alibaba Sentinel 对Controller请求url埋点
•073.Spring Cloud Alibaba Sentinel 手写代码实现埋点
•074.Spring Cloud Alibaba Sentinel 采用注解实现埋点
•075.Spring Cloud Alibaba Sentinel 对RestTemplate流控和熔断
•076.Spring Cloud Alibaba Sentinel 对Feign流控和熔断
•077.问答交流
•078.Sentinel规则持久化-拉模式持久化到本地文件
•079.Sentinel规则持久化-拉模式持久化到本地文件
•080.Sentinel规则持久化-推模式持久化到Nacos
•081.Sentinel规则持久化-推模式持久化到Nacos
•082.Spring Cloud Gateway 网关功能特性
•083.Spring Cloud Gateway 网关搭建
•084.Spring Cloud Gateway 网关服务调用
•085.Spring Cloud Gateway 网关谓词
•086.Spring Cloud Gateway 网关谓词
•087.Spring Cloud Gateway 网关谓词
•088.Spring Cloud Gateway 网关过滤器
•089.Spring Cloud Gateway 问答交流
•090.Spring Cloud Gateway自定义谓词
•091.Spring Cloud Gateway自定义谓词
•092.Spring Cloud Gateway自定义谓词不匹配404页面
•093.Spring Cloud Gateway自定义过滤器
•094.Spring Cloud Gateway全局过滤器
•095.Spring Cloud Gateway自定义全局过滤器
•096.Spring Cloud Gateway集成Ribbon实现负载均衡
•097.Spring Cloud Gateway集成Sentinel限流
•098.Spring Cloud Gateway集成Sentinel限流自定义错误页
•099.Spring Cloud Gateway集成Sentinel规则持久化到文件
•100.Spring Cloud Gateway集成Sentinel规则持久化到Nacos
•101.Spring Cloud Gateway内部执行流程源码分析
•102.Spring Cloud Gateway小结
•103.快速回顾
•104.Spring Cloud Gateway跨域CORS请求
•105.Spring Cloud Gateway跨域CORS请求
•106.What is SkyWalking?
•107.Skywalking运行环境部署
•108.SkyWalking Agent对微服务的链路追踪
•109.SkyWalking Agent对微服务链路追踪
•110.SkyWalking Agent加入IDEA中对微服务链路追踪
•111.SkyWalking 监控告警通知
•112.SkyWalking 监控告警通知
•113.SkyWalking 微服务链路追踪数据持久化MySQL
•114.SkyWalking 问答交流
•115.Skywalking持久化跟踪数据elasticsearch
•116.Skywalking持久化跟踪数据elasticsearch
•117.Skywalking对多个跨服务的链路跟踪
•118.Skywalking对多个跨服务的链路跟踪
•119.Skywalking自定义链路跟踪
•120.Skywalking集成logback输出traceId日志
•121.Skywalking UI界面-仪表盘
•122.Skywalking UI界面-拓扑图-追踪-性能剖析-告警
•123.Skywalking 基于nacos集群
•124.Skywalking 基于nacos集群
•125.Skywalking 基于nacos集群
•126.Skywalking 问答交流
•127.What is Seata?
•128.Seata分布式事务生命周期
•129.Seata TC Server运行环境部署
•130.Seata基于AT事务模式单体应用多数据源分布式事务
•131.Seata基于AT事务模式单体应用多数据源分布式事务
•132.Seata基于AT事务模式单体应用多数据源分布式事务
•133.Seata基于AT事务模式多个微服务分布式事务
•134.Seata基于AT事务模式多个微服务分布式事务
•135.Seata基于AT事务模式多个微服务分布式事务
•136.Seata基于AT事务模式执行机制
•137.Seata AT事务模式
•138.Seata AT事务模式写数据隔离
•139.Seata AT事务模式写数据隔离
•140.Seata AT事务模式读数据隔离
•141.Seata AT事务模式读数据隔离
•142.Seata TC Server集群环境部署
•143.Seata TC Server集群环境部署
•144.Seata TC Server集群环境集成测试
•145.Seata TC Server集群环境集成测试
•146.Seata TCC事务模式的运行机制
•147.Seata TCC事务模式SpringBoot单体应用案例
•148.Seata TCC事务模式SpringBoot单体应用案例
•149.Seata TCC事务模式SpringCloudAlibab微服务应用案例
•150.Seata TCC事务模式SpringCloudAlibab微服务应用案例
•151.What is Spring Cloud Stream
•152.Spring Cloud Stream的核心概念
•153.Spring Cloud Stream集成RocketMQ配置
•154.Spring Cloud Stream集成RocketMQ发送消息
•155.Spring Cloud Stream集成RocketMQ接收消息
•156.Spring Cloud Stream集成RocketMQ监听接收消息
•157.Spring Cloud Stream集成RocketMQ多种发送消息方式
•158.Spring Cloud Stream Starter代码分析
•159.Spring Cloud Stream集成RocketMQ发送事务消息
•160.Spring Cloud Stream集成RocketMQ对象标签消息
•161.Spring Cloud Stream问答交流
⑶ 最好的python视频教程谁有
你看看这个教程适不适合你,如果适合的话,可以找我要一下视频!
阶段一:Python开发基础
Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等。
阶段二:Python高级编程和数据库开发
Python全栈开发与人工智能之Python高级编程和数据库开发知识学习内容包括:面向对象开发、Socket网络编程、线程、进程、队列、IO多路模型、Mysql数据库开发等。
阶段三:前端开发
Python全栈开发与人工智能之前端开发知识学习内容包括:Html、CSS、JavaScript开发、Jquery&bootstrap开发、前端框架VUE开发等。
阶段四:WEB框架开发
Python全栈开发与人工智能之WEB框架开发学习内容包括:Django框架基础、Django框架进阶、BBS+Blog实战项目开发、缓存和队列中间件、Flask框架学习、Tornado框架学习、Restful API等。
阶段五:爬虫开发
Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。
阶段六:全栈项目实战
Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具学习、CRM客户关系管理系统开发、路飞学城在线教育平台开发等。
阶段七:数据分析
Python全栈开发与人工智能之数据分析学习内容包括:金融量化分析。
阶段八:人工智能
Python全栈开发与人工智能之人工智能学习内容包括:机器学习、数据分析 、图像识别、自然语言翻译等。
阶段九:自动化运维&开发
Python全栈开发与人工智能之自动化运维&开发学习内容包括:CMDB资产管理系统开发、IT审计+主机管理系统开发、分布式主机监控系统开发等。
阶段十:高并发语言GO开发
Python全栈开发与人工智能之高并发语言GO开发学习内容包括:GO语言基础、数据类型与文件IO操作、函数和面向对象、并发编程等。
⑷ Pandora Bootstrap源码分析
在我的认知里,是没有办法改变当前的classloder的,当前的 SpringApplication.run的时候,肯定是系统的classloder啊,就让我们来揭开迷雾吧。
参数mainClass就是HSFProviderApplication这个有main方法的入口类
参数args就是main方法的参数
参数的classLoader是我们自己创建的classloader
由于我们创建的classloder是系统classloder的子类,我们就可以做文章了,中间件的类用新创建的classloder来加载,业务的类用系统的classloder来加载。是不是非常巧妙啊。孙改高
如何保证不会执行多次加载逻辑,甚至死循环的呢?第一遍是系统的classloder,第二遍虽然看上去是我们自己创建的classloder,但我们我们创建的classloder是委托给系统则尺的classloder的,所以其实还是相同的classloder。这就很简单了,PandoraBootstrap执行第一遍之后就改一个bool变量,第二遍读到这个变量改了就直接跳过歼或了。