自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(195)
  • 收藏
  • 关注

原创 SpringBoot自动装配原理分析

定义的格式转换的接口,并且定义两个实现类/*** 定义一个格式化的方法* @return*/@Override@Override首先定义格式化加载的Java配置类@Bean@Primary // 优先加载@Bean定义一个模板工具类再就是整合到SpringBoot中去的Java配置类@Bean。

2024-04-02 10:41:01 921

原创 JDK 19 新特性

在 2022 年 9 月 20 日正式发布,Java 19 不是一个长期支持版本,直到 2023 年 3 月它将被 JDK 20 取代,这次更新共带来 7 个新功能。

2024-03-13 10:06:09 357

原创 JDK 18 新特性

在 2022 年 3 月 22 日正式发布,Java 18 不是一个长期支持版本,这次更新共带来 9 个新功能。

2024-03-11 09:47:30 539

原创 JDK 17 新特性

Java 17 发布于 2021 年 9 月 14 日。Java 17 版本是切换到新的 6 个月发布周期以来的第二个(LTS)版本(第一个是 Java 11) [。

2024-03-08 09:08:46 585

原创 JDK 16 新特性

Java 16 在 2021 年 3 月 16 日正式发布,不是长久支持版本,这次更新没有带来很多语法上的改动,但是也带来了不少新的实用功能。

2024-03-07 21:35:58 985

原创 从零开始学PostgreSQL (七) & PostgreSQL SQL入门

SQL命令一般分为DQL、DML、DDL三类。DQL:数据查询语句,基本就是SELECT查询命令,用于数据查询。DML:Data Manipulation Language,即数据操纵语言,主要用于插入、更新、 删除数据,所以也分为INSERT、UPDATE、DELETE三种语句。DDL:Data Definition Language,即数据定义语言,简单来说,是用于创建、删除、修改表、索引等数据库对象的语言。

2024-02-20 15:08:06 874

原创 从零开始学PostgreSQL (六) & PostgreSQL psql工具

SQL命令一般分为DQL、DML、DDL三类。DQL:数据查询语句,基本就是SELECT查询命令,用于数据查询。DML:Data Manipulation Language,即数据操纵语言,主要用于插入、更新、 删除数据,所以也分为INSERT、UPDATE、DELETE三种语句。DDL:Data Definition Language,即数据定义语言,简单来说,是用于创建、删除、修改表、索引等数据库对象的语言。

2024-02-19 21:29:26 873

原创 从零开始学PostgreSQL (五) & Windows 安装PostgreSQL

下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads。初次进入这个界面的时候,会提示输入数据库密码,输入我们之前设置的密码即可。安装过程,需要一会儿时间,请耐心等待程序安装完成。3、选择您要安装的组件;1、搜索pgAdmin4,打开可视化面板程序。根据自身需要进行选择,一般情况下默认。7、选择新数据库集群使用的区域设置。2、数据数据库密码进入面板。8、预安装Sanary。4、选择数据存放目录。

2024-02-19 15:49:52 461

原创 从零开始学PostgreSQL (四) & Linux 源码编译安装 PostgreSQL

在许多系统上,GSSAPI 系统(通常是 Kerberos 安装的一部分) 并未安装在默认搜索的位置(例如,/usr/include、 /usr/lib),因此除此选项外,您还必须使用选项 --with-includes和–with-libraries。这样做显著增大了最后安装的可执行文件的大小,并且在非 GCC 的编译器上,这么做通常还要关闭编译器优化, 这些都导致速度的下降。:这是一个目录,包含一些附加模块、插件或扩展,它们不是核心PostgreSQL系统的一部分,但可以添加到系统中以提供额外的功能。

2024-01-18 09:39:16 3110

原创 从零开始学PostgreSQL (三) & Linux RPM安装PostgreSQL

rpm离线安装本质就是通过yum进行安装,只不过是在网络条件的限制下、无法联通互联网环境。可以用此处方式来进行替换,从而达到安装postgresql数据库的目的。

2024-01-15 21:42:19 3417

原创 从零开始学PostgreSQL (二) & Linux Yum安装PostgreSQL

本篇文章还未写完…当前,MessageQueue 和 Broker 耦合在一起,意味着 Broker 数量变化之后,消息队列的数量也会发生变化,这会造成所有的队列都需要一个重新平衡的过程,这个过程可能需要数分钟才能恢复。增加逻辑队列之后,Broker 数量的变化不会影响逻辑队列数量的变化,二者可以独立变化。

2024-01-14 22:49:10 2990

原创 RocketMQ 逻辑队列

本篇文章还未写完…当前,MessageQueue 和 Broker 耦合在一起,意味着 Broker 数量变化之后,消息队列的数量也会发生变化,这会造成所有的队列都需要一个重新平衡的过程,这个过程可能需要数分钟才能恢复。增加逻辑队列之后,Broker 数量的变化不会影响逻辑队列数量的变化,二者可以独立变化。

2024-01-13 21:36:50 517

原创 「源码解读」网络操作抽象类_ Channel

我们只要摸清楚了 fireChannelRegistered() 方法,以后碰到其他像 fireChannelActive()、fireXxx() 等就知道怎么回事了,它们都是类似的。经过前面的铺垫,我们已经具备一定的基础了,我们开始来把前面学到的内容揉在一起。实例,它用于保存 channel 的配置信息,这里没有我们现在需要关心的内容,直接跳过。操作,这一步其实是非常关键的,对于我们源码分析非常重要。这个方法,所以我们上面说的那些,对于两者都是通用的。操作是非常重要的,要知道这一步大概做了哪些事情,

2024-01-11 21:04:31 940

原创 「源码解读」消息处理器链表:ChannelPipeline

是消息的具体处理器,主要负责处理客户端/服务端接收和发送的数据。则是包含了一个或多个的链表。

2024-01-11 21:03:56 948

原创 「源码解读」异步操作:Future 和 Promise

别急,我们后面会碰到另一个类 DefaultChannelPromise 的使用,这个类是综合了 ChannelFuture 和 Promise 的,但是它的实现其实大部分都是继承自这里的 DefaultPromise 类的。的回调函数(当然,回调的具体内容不一定要由执行任务的线程自己来执行,它可以创建新的线程来执行,也可以将回调任务提交到某个线程池来执行)。接下来,我们需要来一个实现类,这样才能比较直观地看出它们是怎么使用的,因为上面的这些都是接口定义,具体还得看实现类是怎么工作的。

2024-01-10 21:37:21 1198

原创 「源码解读」线程池:EventLoopGroup

接下来,我们来分析 Netty 中的线程池。Netty 中的线程池比较不好理解,因为它的类比较多,而且它们之间的关系错综复杂。看下图,感受下类和类的继承结构:这张图我按照继承关系整理而来,大家仔细看一下就会发现,涉及到的类确实挺多的。本节来给大家理理清楚这部分内容。首先,我们说的 Netty 的线程池,指的就是的实例;线程池中的单个线程,指的是右边的实例。回顾下我们第一节介绍的 Echo 例子,客户端和服务端的启动代码中,最开始我们总是先实例化下面,我们就从的源码开始进行分析。

2024-01-10 21:36:45 1141

原创 「源码解读」服务调用过程

在前面的文章中,我们分析了 Dubbo SPI、服务导出与引入、以及集群容错方面的代码。经过前文的铺垫,本篇文章我们终于可以分析服务调用过程了。Dubbo 服务调用过程比较复杂,包含众多步骤,比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。限于篇幅原因,本篇文章无法对所有的步骤一一进行分析。本篇文章将会重点分析请求的发送与接收、编解码、线程派发以及响应的发送与接收等过程,至于服务降级、过滤器链和序列化大家自行进行分析,也可以将其当成一个黑盒,暂时忽略也没关系。

2024-01-08 19:48:49 925

原创 「源码解读」服务引用

上一篇文章详细分析了服务导出的过程,本篇文章我们趁热打铁,继续分析服务引用过程。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直连的方式引用服务,第二种方式是基于注册中心进行引用。服务直连的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等步骤。这些步骤,将在后续章节中一一进行分析。

2024-01-08 19:48:15 862

原创 「源码解读」服务导出

本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部分代码进行详细的分析。

2024-01-08 19:47:43 855

原创 「源码解读」负载均衡

LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。

2024-01-07 13:19:33 979

原创 「源码解读」集群.md

为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。

2024-01-07 13:10:21 919

原创 「源码解读」服务路由

上一篇文章分析了集群容错的第一部分 — 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者。在详细分析服务路由的源码之前,先来介绍一下服务路由是什么。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。条件路由 ConditionRouter脚本路由 ScriptRouter标签路由 TagRouter。

2024-01-06 22:12:46 432

原创 「源码解读」服务目录

本篇文章,将开始分析 Dubbo 集群容错方面的源码。服务目录 Directory服务路由 Router集群 Cluster负载均衡 LoadBalance。这几个部分的源码逻辑相对比较独立,我们将会分四篇文章进行分析。本篇文章作为集群容错的开篇文章,将和大家一起分析服务目录相关的源码。服务目录是什么?服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。

2024-01-06 22:11:59 380

原创 「源码解读」Dubbo SPI自适应扩展

到此,关于自适应拓展的原理,实现就分析完了。总的来说自适应拓展整个逻辑还是很复杂的,并不是很容易弄懂。因此,大家在阅读该部分源码时,耐心一些。同时多进行调试,也可以通过生成好的代码思考代码的生成逻辑。好了,本篇文章就分析到这里。

2024-01-05 23:48:12 945

原创 「源码解读」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 505

原创 「准备工作」Dubbo源码阅读环境搭建

下载jar包的过程中,很可能会遇到某些 jar 包出现问题的情况,导致项目多处报红,显示相关依赖导入错误。解决的办法就是:你去自己本地的 Maven仓库找到对应的 jar 包,将其删除,然后重新导入项目下载即可。我们找到 dubbo-demo 这个文件夹,里面包含了 3 种不同类型(xml、api、annotation)使用方式的 demo,可以帮助我们节省掉大量写 Demo 的时间。打开之后,可能需要一会时间下载项目所依赖的 jar包,我们喝杯咖啡,耐心等待即可。),不过我的更详细完善一点。

2024-01-04 20:07:04 1125

原创 「准备工作」Dubbo 源码全局概览

在《如何自己实现一个 RPC框架》注册中心:注册中心负责服务地址的注册与查找,相当于目录服务。网络传输:既然我们要调用远程的方法,就要发送网络请求来传递目标类和方法的信息以及方法的参数等数据到服务提供端。序列化和反序列化:要在网络传输数据就要涉及到序列化。动态代理:屏蔽程方法调用的底层细节。负载均衡: 避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题。传输协议:这个协议是客户端(服务消费方)和服务端(服务提供方)交流的基础。更完善的一点的 RPC 框架可能还有监控模块。

2024-01-04 20:06:28 854

原创 准备工作」Dubbo 概览

不过,由于 Spring Cloud 在微服务中应用更加广泛,所以,我觉得一般我们提 Dubbo 的话,大部分是分布式系统的情况。: 随着系统的发展,服务越来越多,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。:Dubbo相关的配置。左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。分布式服务架构下,系统被拆分成不同的服务比如短信服务、安全服务,每个服务独立提供系统的某个核心服务。

2024-01-04 20:05:51 346

原创 Docker数据卷和数据管理

数据卷的使用,类似于 Linux 下对目录或文件进行 mount数据卷可以在容器之间共享和重用对数据卷的修改会立马生效对数据卷的更新,不会影响镜像卷会一直存在,直到没有容器使用。

2024-01-03 10:19:05 1010

原创 Docker网络使用和配置

主机 A 和主机 B 的网卡一都连着物理交换机的同一个 vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一 vlan 中的其他物理机器互联。如果在企业内部应用,或者做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。将 Docker 的默认网桥绑定到这个新建的 br0 上面,这样就将这台机器上容器绑定到 em1 这个网卡所对应的物理网络上了。

2024-01-03 10:18:23 869

原创 Kafka 原理篇

作者:码哥字节今天我们来深入讲解 Kafka 的架构和实现原理。我将从架构和细节入手,以生动的图深入讲解 Kafka 的实现原理。我想很多同学之前可能已经看过很多 Kafka 原理相关的文章,但往往看时"牛逼"声连连,激情满满,总觉得自己又学习到了各种“吊炸天”的技术。但很多同学往往是不觉明厉,把文章结合面试题背一背还能应付一下半吊子面试官。可以遇到老司机面试官,或是进入实战,却对很多概念和实现摸棱两可。所以,我决定图解 Kakfa,却让很多半懂不懂的同学可以加深对 Kafka 实现原理的理解。

2024-01-01 22:25:29 1154

原创 Kafka为什么这么快?

Kafka 是一个优秀的开源项目。其在性能上面的优化做的淋漓尽致,是很值得我们深入学习的一个项目。无论是思想还是实现,我们都应该认真的去看一看,想一想。零拷贝网络和磁盘优秀的网络模型,基于 Java NIO高效的文件数据结构设计Parition 并行和可扩展数据批量传输数据压缩顺序读写磁盘无锁轻量级 offset。

2024-01-01 22:24:58 942

原创 Kafka 如何保证高可用?

开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性,反之,禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。Leader 将等待 ISR 中的所有副本确认后再做出应答,因此只要 ISR 中任何一个副本还存活着,这条应答过的消息就不会丢失。ISR 中的副本都是与 Leader 同步的副本,相反,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的。

2024-01-01 22:24:20 499

原创 如何保证Kafka不丢失消息

丢失消息有 3 种不同的情况,针对每一种情况有不同的解决方案。

2024-01-01 22:23:47 745

原创 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 298

原创 大白话带你认识Kafka

实际上在早期的时候 Kafka 并不是一个合格的消息队列,早期的 Kafka 在消息队列领域就像是一个衣衫褴褛的孩子一样,功能不完备并且有一些小问题比如丢失消息、不保证消息可靠性等等。我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2 个消息对应的操作分别对应的数据库操作是:更改用户会员等级、根据会员等级计算订单价格。需要说明的是,Kafka 2.8.0,移除了对 Zookeeper 的依赖(使用内嵌的KRaft替代了 ZooKeeper)。

2024-01-01 22:22:30 791

原创 10 SpringBoot内置生命周期事件详解

由于有一些小伙伴们建议之前有些源码分析文章太长,导致耐心不够,看不下去,因此,之后的源码分析文章如果太长的话,笔者将会考虑拆分为几篇文章,这样就比较短小了,比较容易看完,嘿嘿。

2023-12-30 21:05:16 956

原创 9 SpringBoot事件监听机制

温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了SpringApplication 对象的构建过程及 SpringBoot 自己实现的一套 SPI 机制,现将关键步骤再浓缩总结下:在 SpringBoot 启动过程中,每个不同的启动阶段会分别广播不同的内置生命周期事件,然后相应的监听器会监听这些事件来执行一些初始化逻辑工作比如会监听事件来加载配置文件的环境变量等。因此本篇内容将来分析下 SpringBoot 的事件监听机制的源码。为了探究 SpringBoot 广播内置生命周期事件流程,我们再来回

2023-12-30 21:04:40 836

原创 8 SpringApplication对象是如何构建的?

本篇接。

2023-12-30 21:01:35 799

原创 7 SpringBoot的启动流程是怎样的?

事件等,总之SpringBoot总共内置了7个生命周期事件,除了标志SpringBoot的不同启动阶段外,同时一些监听器也会监听相应的生命周期事件从而执行一些启动初始化逻辑。好了,SpringBoot的启动流程就已经分析完了,这篇内容主要让我们对SpringBoot的启动流程有一个整体的认识,现在还没必要去深究每一个细节,以免丢了。,现在我们对SpringBoot的启动流程有一个整体的认识即可,关于启动流程的一些重要步骤我们会在以后的源码分析中来深究。和相关依赖后,再编写一个启动类,然后在这个启动类标上。

2023-12-30 21:00:52 878

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除