其他
文章平均质量分 91
优秀小白熊
这个作者很懒,什么都没留下…
展开
-
RocketMQ 逻辑队列
本篇文章还未写完…当前,MessageQueue 和 Broker 耦合在一起,意味着 Broker 数量变化之后,消息队列的数量也会发生变化,这会造成所有的队列都需要一个重新平衡的过程,这个过程可能需要数分钟才能恢复。增加逻辑队列之后,Broker 数量的变化不会影响逻辑队列数量的变化,二者可以独立变化。原创 2024-01-13 21:36:50 · 546 阅读 · 0 评论 -
「源码解读」网络操作抽象类_ Channel
我们只要摸清楚了 fireChannelRegistered() 方法,以后碰到其他像 fireChannelActive()、fireXxx() 等就知道怎么回事了,它们都是类似的。经过前面的铺垫,我们已经具备一定的基础了,我们开始来把前面学到的内容揉在一起。实例,它用于保存 channel 的配置信息,这里没有我们现在需要关心的内容,直接跳过。操作,这一步其实是非常关键的,对于我们源码分析非常重要。这个方法,所以我们上面说的那些,对于两者都是通用的。操作是非常重要的,要知道这一步大概做了哪些事情,原创 2024-01-11 21:04:31 · 962 阅读 · 0 评论 -
「源码解读」消息处理器链表:ChannelPipeline
是消息的具体处理器,主要负责处理客户端/服务端接收和发送的数据。则是包含了一个或多个的链表。原创 2024-01-11 21:03:56 · 972 阅读 · 0 评论 -
「源码解读」异步操作:Future 和 Promise
别急,我们后面会碰到另一个类 DefaultChannelPromise 的使用,这个类是综合了 ChannelFuture 和 Promise 的,但是它的实现其实大部分都是继承自这里的 DefaultPromise 类的。的回调函数(当然,回调的具体内容不一定要由执行任务的线程自己来执行,它可以创建新的线程来执行,也可以将回调任务提交到某个线程池来执行)。接下来,我们需要来一个实现类,这样才能比较直观地看出它们是怎么使用的,因为上面的这些都是接口定义,具体还得看实现类是怎么工作的。原创 2024-01-10 21:37:21 · 1248 阅读 · 0 评论 -
「源码解读」线程池:EventLoopGroup
接下来,我们来分析 Netty 中的线程池。Netty 中的线程池比较不好理解,因为它的类比较多,而且它们之间的关系错综复杂。看下图,感受下类和类的继承结构:这张图我按照继承关系整理而来,大家仔细看一下就会发现,涉及到的类确实挺多的。本节来给大家理理清楚这部分内容。首先,我们说的 Netty 的线程池,指的就是的实例;线程池中的单个线程,指的是右边的实例。回顾下我们第一节介绍的 Echo 例子,客户端和服务端的启动代码中,最开始我们总是先实例化下面,我们就从的源码开始进行分析。原创 2024-01-10 21:36:45 · 1255 阅读 · 0 评论 -
「源码解读」服务调用过程
在前面的文章中,我们分析了 Dubbo SPI、服务导出与引入、以及集群容错方面的代码。经过前文的铺垫,本篇文章我们终于可以分析服务调用过程了。Dubbo 服务调用过程比较复杂,包含众多步骤,比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。限于篇幅原因,本篇文章无法对所有的步骤一一进行分析。本篇文章将会重点分析请求的发送与接收、编解码、线程派发以及响应的发送与接收等过程,至于服务降级、过滤器链和序列化大家自行进行分析,也可以将其当成一个黑盒,暂时忽略也没关系。原创 2024-01-08 19:48:49 · 957 阅读 · 0 评论 -
「源码解读」服务引用
上一篇文章详细分析了服务导出的过程,本篇文章我们趁热打铁,继续分析服务引用过程。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直连的方式引用服务,第二种方式是基于注册中心进行引用。服务直连的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等步骤。这些步骤,将在后续章节中一一进行分析。原创 2024-01-08 19:48:15 · 879 阅读 · 0 评论 -
「源码解读」服务导出
本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部分代码进行详细的分析。原创 2024-01-08 19:47:43 · 898 阅读 · 0 评论 -
「源码解读」负载均衡
LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。原创 2024-01-07 13:19:33 · 1019 阅读 · 0 评论 -
「源码解读」集群.md
为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。原创 2024-01-07 13:10:21 · 930 阅读 · 0 评论 -
「源码解读」服务路由
上一篇文章分析了集群容错的第一部分 — 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者。在详细分析服务路由的源码之前,先来介绍一下服务路由是什么。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。条件路由 ConditionRouter脚本路由 ScriptRouter标签路由 TagRouter。原创 2024-01-06 22:12:46 · 450 阅读 · 0 评论 -
「源码解读」服务目录
本篇文章,将开始分析 Dubbo 集群容错方面的源码。服务目录 Directory服务路由 Router集群 Cluster负载均衡 LoadBalance。这几个部分的源码逻辑相对比较独立,我们将会分四篇文章进行分析。本篇文章作为集群容错的开篇文章,将和大家一起分析服务目录相关的源码。服务目录是什么?服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。原创 2024-01-06 22:11:59 · 402 阅读 · 0 评论 -
「源码解读」Dubbo SPI自适应扩展
到此,关于自适应拓展的原理,实现就分析完了。总的来说自适应拓展整个逻辑还是很复杂的,并不是很容易弄懂。因此,大家在阅读该部分源码时,耐心一些。同时多进行调试,也可以通过生成好的代码思考代码的生成逻辑。好了,本篇文章就分析到这里。原创 2024-01-05 23:48:12 · 958 阅读 · 0 评论 -
「源码解读」Dubbo SPI
接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。本篇文章简单分别介绍了 Java SPI 与 Dubbo SPI 用法,并对 Dubbo SPI 的加载拓展类的过程进行了分析。与 Java SPI 实现类配置不同,Dubbo SPI 是通过键值对的方式进行配置,这样我们可以按需加载指定的实现类。原创 2024-01-05 23:47:38 · 527 阅读 · 0 评论 -
「准备工作」Dubbo源码阅读环境搭建
下载jar包的过程中,很可能会遇到某些 jar 包出现问题的情况,导致项目多处报红,显示相关依赖导入错误。解决的办法就是:你去自己本地的 Maven仓库找到对应的 jar 包,将其删除,然后重新导入项目下载即可。我们找到 dubbo-demo 这个文件夹,里面包含了 3 种不同类型(xml、api、annotation)使用方式的 demo,可以帮助我们节省掉大量写 Demo 的时间。打开之后,可能需要一会时间下载项目所依赖的 jar包,我们喝杯咖啡,耐心等待即可。),不过我的更详细完善一点。原创 2024-01-04 20:07:04 · 1146 阅读 · 0 评论 -
「准备工作」Dubbo 源码全局概览
在《如何自己实现一个 RPC框架》注册中心:注册中心负责服务地址的注册与查找,相当于目录服务。网络传输:既然我们要调用远程的方法,就要发送网络请求来传递目标类和方法的信息以及方法的参数等数据到服务提供端。序列化和反序列化:要在网络传输数据就要涉及到序列化。动态代理:屏蔽程方法调用的底层细节。负载均衡: 避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题。传输协议:这个协议是客户端(服务消费方)和服务端(服务提供方)交流的基础。更完善的一点的 RPC 框架可能还有监控模块。原创 2024-01-04 20:06:28 · 941 阅读 · 0 评论 -
准备工作」Dubbo 概览
不过,由于 Spring Cloud 在微服务中应用更加广泛,所以,我觉得一般我们提 Dubbo 的话,大部分是分布式系统的情况。: 随着系统的发展,服务越来越多,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。:Dubbo相关的配置。左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。分布式服务架构下,系统被拆分成不同的服务比如短信服务、安全服务,每个服务独立提供系统的某个核心服务。原创 2024-01-04 20:05:51 · 358 阅读 · 0 评论 -
Kafka 原理篇
作者:码哥字节今天我们来深入讲解 Kafka 的架构和实现原理。我将从架构和细节入手,以生动的图深入讲解 Kafka 的实现原理。我想很多同学之前可能已经看过很多 Kafka 原理相关的文章,但往往看时"牛逼"声连连,激情满满,总觉得自己又学习到了各种“吊炸天”的技术。但很多同学往往是不觉明厉,把文章结合面试题背一背还能应付一下半吊子面试官。可以遇到老司机面试官,或是进入实战,却对很多概念和实现摸棱两可。所以,我决定图解 Kakfa,却让很多半懂不懂的同学可以加深对 Kafka 实现原理的理解。原创 2024-01-01 22:25:29 · 1177 阅读 · 0 评论 -
Kafka为什么这么快?
Kafka 是一个优秀的开源项目。其在性能上面的优化做的淋漓尽致,是很值得我们深入学习的一个项目。无论是思想还是实现,我们都应该认真的去看一看,想一想。零拷贝网络和磁盘优秀的网络模型,基于 Java NIO高效的文件数据结构设计Parition 并行和可扩展数据批量传输数据压缩顺序读写磁盘无锁轻量级 offset。原创 2024-01-01 22:24:58 · 955 阅读 · 0 评论 -
Kafka 如何保证高可用?
开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性,反之,禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。Leader 将等待 ISR 中的所有副本确认后再做出应答,因此只要 ISR 中任何一个副本还存活着,这条应答过的消息就不会丢失。ISR 中的副本都是与 Leader 同步的副本,相反,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的。原创 2024-01-01 22:24:20 · 568 阅读 · 0 评论 -
如何保证Kafka不丢失消息
丢失消息有 3 种不同的情况,针对每一种情况有不同的解决方案。原创 2024-01-01 22:23:47 · 756 阅读 · 0 评论 -
Kafka消费组了解么? 重平衡机制是做什么的?
举个例子:假设一个 Consumer Group 订阅了 2 个(Topic 1、Topic 2),Topic 1 有 2个分区,Topic 2 有 1 个分区。,Kafka 以 Consumer Group 这一个整体来订阅 Topic (主题),Consumer Group 内的所有 Consumer 共同来消费订阅的 Topic 内的所有 Partition(分区)。并且,Topic 下的每个 Partition 只从属于 Consumer Group 中的一个 Consumer,原创 2024-01-01 22:23:09 · 317 阅读 · 0 评论 -
大白话带你认识Kafka
实际上在早期的时候 Kafka 并不是一个合格的消息队列,早期的 Kafka 在消息队列领域就像是一个衣衫褴褛的孩子一样,功能不完备并且有一些小问题比如丢失消息、不保证消息可靠性等等。我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2 个消息对应的操作分别对应的数据库操作是:更改用户会员等级、根据会员等级计算订单价格。需要说明的是,Kafka 2.8.0,移除了对 Zookeeper 的依赖(使用内嵌的KRaft替代了 ZooKeeper)。原创 2024-01-01 22:22:30 · 807 阅读 · 0 评论 -
10 SpringBoot内置生命周期事件详解
由于有一些小伙伴们建议之前有些源码分析文章太长,导致耐心不够,看不下去,因此,之后的源码分析文章如果太长的话,笔者将会考虑拆分为几篇文章,这样就比较短小了,比较容易看完,嘿嘿。原创 2023-12-30 21:05:16 · 1043 阅读 · 0 评论 -
9 SpringBoot事件监听机制
温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了SpringApplication 对象的构建过程及 SpringBoot 自己实现的一套 SPI 机制,现将关键步骤再浓缩总结下:在 SpringBoot 启动过程中,每个不同的启动阶段会分别广播不同的内置生命周期事件,然后相应的监听器会监听这些事件来执行一些初始化逻辑工作比如会监听事件来加载配置文件的环境变量等。因此本篇内容将来分析下 SpringBoot 的事件监听机制的源码。为了探究 SpringBoot 广播内置生命周期事件流程,我们再来回原创 2023-12-30 21:04:40 · 857 阅读 · 0 评论 -
8 SpringApplication对象是如何构建的?
本篇接。原创 2023-12-30 21:01:35 · 814 阅读 · 0 评论 -
7 SpringBoot的启动流程是怎样的?
事件等,总之SpringBoot总共内置了7个生命周期事件,除了标志SpringBoot的不同启动阶段外,同时一些监听器也会监听相应的生命周期事件从而执行一些启动初始化逻辑。好了,SpringBoot的启动流程就已经分析完了,这篇内容主要让我们对SpringBoot的启动流程有一个整体的认识,现在还没必要去深究每一个细节,以免丢了。,现在我们对SpringBoot的启动流程有一个整体的认识即可,关于启动流程的一些重要步骤我们会在以后的源码分析中来深究。和相关依赖后,再编写一个启动类,然后在这个启动类标上。原创 2023-12-30 21:00:52 · 893 阅读 · 0 评论 -
6 SpringBoot内置的各种Starter是怎样构建的
前面分析了SpringBoot内置的各种Starter的构建原理,理论联系实践,那么如果能够动手实践一下自定义Starter那就更好了。下面提供一个自定义Starter的一个简单Demo,这个Demo完全模仿SpringBoot内置Starter的内部包结构来编写,对于进一步了解SpringBoot内置的各种Starter的构建原理很有帮助。下面是这个Demo的github地址,推荐给有兴趣的小伙伴们。模仿springboot内部结构自定义Starter。此外,如何自定义一个Starter。原创 2023-12-30 21:00:18 · 853 阅读 · 0 评论 -
5 SpringBoot的配置属性值是如何绑定的?
从配置文件中加载自动配置类;加载的自动配置类中排除掉注解的exclude属性指定的自动配置类;然后再用接口去过滤自动配置类是否符合其标注注解(若有标注的话)和的条件,若都符合的话则返回匹配结果;然后触发事件,告诉条件评估报告器对象来分别记录符合条件和exclude的自动配置类。最后 spring 再将最后筛选后的自动配置类导入 IOC 容器中本篇继续来分析 SpringBoot 的自动配置的相关源码,我们来分析下和这两个注解,来探究下外部配置属性值是如何被绑定到注解的类属性中的?原创 2023-12-30 20:59:34 · 870 阅读 · 0 评论 -
4 SpringBoot是如何实现自动配置的
温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了 SpringBoot 的条件注解SpringBoot 的所有的条件类都是继承于基类,而又实现了Condition接口。基类主要用来打印一些条件注解评估报告的日志,这些条件评估信息全部来源于其子类注解条件类,因此其也抽象了一个模板方法留给子类去实现来评估其条件注解是否符合条件。前一篇我们也还有一个重要的知识点还没分析,那就是跟过滤自动配置类逻辑有关的接口,这篇文章我们来填一下这个坑。原创 2023-12-30 20:54:54 · 825 阅读 · 0 评论 -
3 助力SpringBoot自动配置的条件注解原理揭秘
上一篇,我们分析了 SpringBoot 源码结构及各个模块 pom 之间的关系后,那么此篇开始就开始解开 SpringBoot 新特性之一–自动配置的神秘面纱了。因为 SpringBoot 自动配置原理是基于其大量的条件注解,因此,本节我们先来撸下 Spring 的条件注解的相关源码。原创 2023-12-30 20:54:18 · 931 阅读 · 0 评论 -
2 如何分析SpringBoot源码模块及结构?
其子pom为spring-boot-project(pom.xml)的子module(注意除去spring-boot-dependencies(pom.xml)),比如有spring-boot(pom.xml),spring-boot-starters(pom.xml)和spring-boot-actuator(pom.xml)等;●spring-boot-project(pom.xml)起到聚合module的作用,其子模块并不继承于它,而是继承于spring-boot-parent(pom.xml);原创 2023-12-30 20:53:32 · 833 阅读 · 0 评论 -
1 如何搭建自己的SpringBoot源码调试环境?
这是 SpringBoot2.1 源码分析专题的第一篇文章,主要讲如何来搭建我们的源码阅读调试环境。如果有经验的小伙伴们可以略过此篇文章。原创 2023-12-30 20:52:29 · 865 阅读 · 0 评论 -
RocketMQ 逻辑队列
本篇文章还未写完…当前,MessageQueue 和 Broker 耦合在一起,意味着 Broker 数量变化之后,消息队列的数量也会发生变化,这会造成所有的队列都需要一个重新平衡的过程,这个过程可能需要数分钟才能恢复。增加逻辑队列之后,Broker 数量的变化不会影响逻辑队列数量的变化,二者可以独立变化。原创 2023-12-29 11:02:16 · 872 阅读 · 0 评论 -
RocketMQ 事务消息
基于 RocketMQ 4.8.0 版本进行的源码分析。讲述 RocketMQ 是如何的。原创 2023-12-29 10:57:36 · 799 阅读 · 0 评论 -
RocketMQ 主备同步
Master 磁盘坏掉,Slave 依然保存了一份Master 宕机,不影响消费者继续消费。原创 2023-12-29 10:56:59 · 1019 阅读 · 0 评论 -
RocketMQ 定时消息和重试消息
RocketMQ 支持 Producer 端发送定时消息,即该消息被发送之后,到一段时间之后才能被 Consumer 消费者端消费。但是当前开源版本的 RocketMQ 所支持的定时时间是有限的、不同级别的精度的时间,并不是任意无限制的定时时间。这 18 个定时级别在服务器端启动的时候,会被解析并放置到表 delayLevelTable 中。解析的过程就是上述字符串按照空格拆分开,然后根据时间单位的不同再进一步进行计算,得到最终的毫秒时间。i++) {// ...// 级别:延迟时间。原创 2023-12-29 10:56:12 · 1329 阅读 · 0 评论 -
RocketMQ 消息索引流程
基于 RocketMQ 4.2.0 版本进行的源码分析。讲述 RocketMQ 消息索引服务。原创 2023-12-29 10:55:33 · 789 阅读 · 0 评论 -
RocketMQ 消息过滤流程
Override= null) {下面我们一一讲解各自背后的机制与实现原理。消息的自定义匹配需要开启过滤服务器、上传过滤类、过滤服务器委托过滤消息等步骤,下面我们一一进行说明。原创 2023-12-29 10:54:58 · 916 阅读 · 0 评论 -
RocketMQ 消息接受流程
基于 RocketMQ 4.2.0 版本进行的源码分析。本篇讲述 RocketMQ 消息接受流程。原创 2023-12-29 10:54:23 · 1330 阅读 · 0 评论