- 博客(429)
- 收藏
- 关注
原创 用通俗的语言介绍 RPC 框架的架构原理!
(1)服务提供者需要以某种形式提供服务调用相关的信息,包括但不限于服务接口定义、数据结构、或者中间态的服务定义文件。例如Facebook的 Thrift 框架的IDL文件,Web service的 WSDL 文件;服务的消费者需要通过一定的场景获取远程服务调用相关的信息。(2)远程代理对象:服务消费者用的服务实际是远程服务的本地代理,说白了就是通过动态代理来实现的。(3)序列化:毕竟是远程通信,需要将对象转化成二进制流进行传输。不同的RPC框架应用的场景不同,在序列化上也会采取不同的技术。(4)通信。
2025-11-19 21:49:52
846
原创 面试官:详细说说你对序列化的理解?
前面引入游戏的例子是为了让大家生动地理解什么是序列化和反序列化。序列化是指将对象实例的状态存到存储媒体的过程反序列化是指将存储在存储媒体中的对象状态装换成对象的过程把对象转化为可传输的字节序列过程反序列化:把字节序列还原为对象的过程。
2025-11-19 21:46:53
720
原创 10 张图搞懂服务注册发现机制!
在单体架构中一个应用程序就是一个服务包,包内的模块通过函数方法相互调用,模型足够简单,根本没有服务注册和发现一说。在微服务架构中会将一个应用程序拆分为多个微服务,微服务会部署在不同的服务器、不同的容器、甚至多数据中心,微服务间要相互调用,服务注册和发现成为了一个不可或缺的组件。
2025-11-19 21:46:06
699
原创 Redis 突然变慢了如何排查并解决?
如下检查清单,帮助你在遇到 Redis 性能变慢的时候能高效解决问题。获取当前 Redis 的基线性能;开启慢指令监控,定位慢指令导致的问题;找到慢指令,使用 scan 的方式;将实例的数据大小控制在 2-4GB,避免主从复制加载过大 RDB 文件而阻塞;禁用内存大页,采用了内存大页,生成 RDB 期间,即使客户端修改的数据只有 50B 的数据,Redis 需要复制 2MB 的大页。当写的指令比较多的时候就会导致大量的拷贝,导致性能变慢。Redis 使用的内存是否过大导致 swap;
2025-11-19 21:45:15
605
原创 图盘点七种基本的GC垃圾回收算法!
内存其实就是一块连续的空间,可以看做一个大数组,这块空间在业务运行时,经常会或零散或整齐的分布一些大大小小的对象,怎么样高效的分配和回收这块空间,同时尽量不影响业务系统的运行,就是 GC 垃圾回收要做的事,学习了七种基本的 GC 算法之后,我们更加知道,工程技术中没有“银弹”,没有完美无缺的算法,只有最适合自己业务系统的解法。
2025-11-11 22:11:32
784
原创 三万字盘点Spring最最核心的9大核心功能!
本节主要讲了实现IOC的几个核心的组件BeanFactory及其接口体系:BeanDefinition及其相关组件:BeanDefinitionReader和ClassPathBeanDefinitionScanner:读取资源,生成BeanDefinitionBeanDefinitionRegistry:存储BeanDefinitionBeanFactory核心实现:DefaultListableBeanFactory:IOC容器,同时实现了BeanDefinitionRegistry接口。
2025-11-11 22:09:39
695
原创 如何画好一张架构图?
系统采用什么样的应用架构,则受到业务复杂度的影响,包括企业的发展阶段和业务特点;业务的复杂度(包括业务量大)必然带来技术的复杂度,应用架构的目标是在解决业务复杂度的同时避免技术太复杂,确保业务架构落地。技术架构:确定组成应用系统的实际运行组件(lvs,nginx,tomcat,php-fpm 等),这些运行组件之间的关系,以及部署到硬件的策略。对需求全盘理解之后,进行高度的抽象分类,然后对各个分类进行对应的产品设计,完成抽象的逻辑梳理和数据梳理,逻辑和数据最终组成一个有机体,成为产品架构。
2025-11-11 22:02:51
608
原创 七种分布式全局 ID 生成策略,你更爱哪种?
上了微服务之后,很多原本很简单的问题现在都变复杂了,例如全局 ID 这事!最近工作中刚好用到这块内容,于是调研了市面上几种常见的全局 ID 生成策略,稍微做了一下对比,供小伙伴们参考。当数据库分库分表之后,原本的主键自增就不方便继续使用了,需要找到一个新的合适的方案。接下来我们一起来捋一捋。
2025-11-11 21:58:57
985
原创 探秘Redis架构演化之路!
总结一下,我们是如何从 0 到 1,再从 1 到 N 构建一个稳定、高性能的 Redis 集群的,从这之中你可以清晰地看到 Redis 架构演进的整个过程。数据怕丢失:持久化(RDB/AOF)主从副本(副本随时可切)故障手动切换慢:哨兵集群(自动切换)读存在压力:扩容副本(读写分离)写存在压力/容量瓶颈:分片集群分片集群社区方案:Twemproxy、Codis(Redis 节点之间无通信,需要部署哨兵,可横向扩容)分片集群官方方案。
2025-11-11 21:56:20
603
原创 聊一聊幂等设计?
幂等是一个数学与计算机科学概念。。比如求绝对值的函数,就是幂等的,。计算机科学中,幂等表示一次和多次请求某一个资源应该具有同样的副作用,或者说,多次请求所产生的影响与一次请求执行的影响效果相同。
2025-11-11 21:54:17
666
原创 把Redis当作队列来用,真的合适吗?
好了,总结一下。这篇文章我们从「Redis 能否用作队列」这个角度出发,介绍了 List、Pub/Sub、Stream 在做队列的使用方式,以及它们各自的优劣。之后又把 Redis 和专业的消息队列中间件做对比,发现 Redis 的不足之处。最后,我们得出 Redis 做队列的合适场景。这里我也列了一个表格,总结了它们各自的优缺点。
2025-11-11 21:53:28
532
原创 DDD领域驱动设计理论
领域建模的优秀与否,可以说直接决定着本次设计的成败,因为一旦发生建模边界不清晰,实体划分错乱,核心属性没有遵守开闭原则等问题,虽然当下可以正常交付业务,但是对于整个项目的后续发展可以说是灾难性的(之前接触过一个系统,因为一个实体的关键属性在最初设计时,没有制定标准规范,语义不统一,造成使用混乱。文章的前面部分,我讲了许多的概念:聚合根、值对象、领域事件、限界上下文等,但是实际设计开发过程中,并不需要照搬全套的体现出来,只要能够表达清楚核心的实体和关系、清晰的边界和合理的扩展性即是好的领域设计。
2025-11-11 21:46:57
525
原创 探秘Redis高效的网络模型!
这部分在一定程度上是我的强迫症作祟,我关于文章对知识点讲解的完备性上对自己近乎苛刻。我觉得把Socket讲明白对接下来的讲解是一件很重要的事情,看过我之前的文章的读者或许能意识到,我尽量避免把前置知识直接以链接的形式展示出来,我认为会割裂整篇文章的阅读体验。不割裂的结果就是文章可能显得很啰嗦,好像一件事情非得从盘古开天辟地开始讲起。因此,如果各位觉得对这个知识点有足够的把握,就直接略过好了~我们所做的任何需要和远程设备进行交互的操作,并非是操作软件本身进行的数据通信。
2025-11-11 21:45:37
613
原创 MySQL面试整理:MySQL日志15连问(带解析)
WAL,中文全称是Write-Ahead Logging,它的关键点就是日志先写内存,再写磁盘。MySQL执行更新操作后,在真正把数据写入到磁盘前,先记录日志。好处是不用每一次操作都实时把数据写盘,就算crash后也可以通过redo log恢复,所以能够实现快速响应SQL语句。其实所谓的两阶段就是把一个事务分成两个阶段来提交。两阶段提交两阶段提交主要有三步曲:redo log在写入后,进入prepare状态执行器写入bin log进入commit状态,事务可以提交。为什么需要两阶段提交呢?
2025-11-11 21:43:30
827
原创 你管这破玩意儿叫 MQ?
最近是又喜又忧,喜的是业务量发展猛增,忧的是由于业务量猛增,一些原来不是问题的问题变成了大问题,比如说新会员注册吧,原来注册成功只要发个短信就行了,但随着业务的发展,现在注册成功也需要发 push,发优惠券,…等这样光注册用户这一步就需要调用很多服务,导致用户注册都需要花不少时间,假设每个服务调用需要 50 ms,那么光以上服务就需要调用 200 ms,而且后续产品还有可能再加一些等活动,每加一个功能,除了引入额外的服务增加耗时外,还需要额外集成服务,重发代码,实在让人烦不胜烦,张大胖想一劳永逸地解决这个问
2025-11-09 21:30:33
649
原创 26张图盘点架构师必备10大接口性能优化秘技,条条经典!
在测试案例对比中,时间耗时的顺序为 Pzstd < ISA-L < Pigz < LZ 4 < Zstd < Brotli < Gzip (排名越靠前越好),其中压缩和解压缩的时间在整体的耗时上占比较大,因此备选策略为 Pzstd、ISA-L、Pigz。详细的测试过程和方案对比可以参考原文:《速度与压缩比如何兼得?压缩算法在构建部署中的优化》9.3 小结。
2025-11-09 21:29:40
966
原创 Redis会遇到的15个「坑」,你踩过几个?
好了,总结一下,这篇文章我们主要讲了 Redis 在「命令使用」、「数据持久化」、「主从同步」3 个方面可能存在的「坑」。怎么样?有没有颠覆你的认知呢?这篇文章信息量还是比较大的,如果你现在的思维已经有些「凌乱」了,别急,我也给你准备好了思维导图,方便你更好地理解和记忆。希望你在使用 Redis 时,可以提前规避这些坑,让 Redis 更好地提供服务。
2025-11-09 21:25:51
560
原创 如何实现可视化全链路日志追踪?
传统的ELK方案是一种滞后的业务追踪,需要事后从大量离散的日志中搜集和筛选出需要的日志,并人工进行日志的串联分析,其过程必然耗时耗力。而分布式会话跟踪方案则是在调用执行的同时,实时地完成了链路的动态串联,但由于是会话级别且仅关注于调用关系等问题,导致其无法很好地应用于业务追踪。因此,无论是传统的ELK方案还是分布式会话跟踪方案,都难以满足日益复杂的业务追踪需求。
2025-11-09 21:24:05
753
原创 你真的懂 Redis 哨兵集群吗?一主二从三哨兵架构如何扛住百万级并发?
你知道是高可用的基石,某个 slave 宕机依然可以将请求发送给 master 或者其他 slave,但是如果 master 宕机,则只能响应读操作,写请求无法再执行。所以主从复制架构面临一个严峻问题:master 宕机,无法执行写操作,无法自动选择将一个 slave 切换为 master,也就是无法实现自动故障切换。Chaya:“还记得那晚我与男友约会,眼前是橡树的绿叶,白色的竹篱笆。好想告诉我的他,这里像幅画,一起手牵手么么哒(此处省略 10000 字)。
2025-11-09 21:22:57
714
原创 面试官:CPU狂飙900%,该怎么处理?
不推荐在这种CPU使用过高的情况下进行慢日志的开启。因为大量的请求,如果真是慢日志问题会发生日志磁盘写入,性能贼低。直接通过MySQL show processlist命令查看,基本能清晰的定位出部分查询问题严重的SQL语句,在针对该SQL语句进行分析。一般可能就是索引、锁、查询大量字段、大表等问题导致。再则一定要使用缓存系统,降低对MySQL的查询频次。对于内存调优,也是一种解决方案。
2025-11-03 21:56:45
528
原创 RocketMQ为什么这么快?我从源码中扒出了10大原因!
在传统IO中,如果想将用户缓存区的数据放到内核缓冲区,需要经过CPU拷贝而基于零拷贝技术可以减少CPU拷贝次数,常见的有两种:mmap()sendfile()mmap()是将用户缓冲区和内核缓冲区共享,操作用户缓冲区就好像直接操作内核缓冲区,读写数据时不需要CPU拷贝Java中可以使用MappedByteBuffer这个API来达到操作内核缓冲区的效果sendfile()主要是用于文件传输,可以通过sendfile()将一个文件内容传输到另一个文件中或者是网络中。
2025-11-03 21:55:20
563
原创 Synchronized原理解析!
synchronized,是解决并发情况下数据同步访问问题的一把利刃。那么synchronized的底层原理是什么呢?下面我们来一层一层剥开它的心,就像剥洋葱一样,看个究竟。同步代码块是通过monitorenter和monitorexit来实现,当线程执行到monitorenter的时候要先获得monitor锁,才能执行后面的方法。当线程执行到monitorexit的时候则要释放锁。
2025-11-03 21:53:51
253
原创 MySQL进程CPU飙升到900%,怎么处理?
陈某提示:大家介绍场景的时候,就说自己主要涉及了两个场景, Java进程飙升900%、MySQL进程飙升900%两种场景,其实,这两个场景就足够讲半天了, 其他的,使用规避技巧规避一下就行。转换后的结果分别为7665,由于导出的线程快照中线程的nid是16进制的,而16进制以0x开头,所以对应的16进制的线程号nid为0x7665。但是,一旦高并发场景,要么走到了死循环,要么就是在做大量的 GC, 容易出现这种 CPU 飙升的情况,CPU飙升900%,是完全有可能的。目测数据量不大,也就几百万条而已。
2025-11-02 21:25:09
659
原创 字节一面:MySQL主从架构数据同步方式有哪些?
其实,mysql主从相关的八股文考点,还有很多,比如数据库主从延迟的原因与解决方案有哪些?MySQL是怎么保证主从一致的等等,你们知道怎么回答嘛?
2025-11-02 21:22:53
280
原创 字节Java一面:kafka为什么这么快?
有朋友去字节面试。?其实这不就送分题嘛,哈哈~~ 我梳理了一下答案:批量处理思想磁盘顺序读写零拷贝技术页缓存加速消息读写分区与并行处理数据压缩。
2025-11-02 21:21:49
775
原创 接口变更常见的八种场景,一定要考虑兼容性呀!
最后,修改接口,大体要做好这几点,很重要:更新文档,说明修改了哪些内容通知上下游,说明原因,场景分析兼容性影响,联调测试。
2025-11-02 21:20:15
395
原创 elasticSearch 是什么?工作原理是怎么样的?
elastic Search, 也就是 es,是一个开源的搜索引擎。它介于应用和数据之间,只要将数据写入 es,应用就可以通过一些关键词搜索到数据。效果就像某度搜索一样。那它是怎么做到的呢?我们从倒排索引聊起。回到文章开头的例子。依次遍历文本匹配是否含有"xiaobai",确实低效。那有更高效的解法吗?有,我们可以对文本进行切分,比如"I like xiaobai"切分为"I"、"like"、"xiaobai"三部分,这个操作叫分词,分词后的每部分,我们称为一个词项,也就是term。
2025-11-02 21:18:57
270
原创 Java面试题:一次B+树索引树查找过程,是怎样的?
如果插入关键字后,叶子节点当前含有的关键字数目等于阶数m,则插,该节点开始「分裂」为两个新的节点,一个节点包含⌊m/2⌋ 个关键字,另外一个关键字包含⌈m/2⌉个关键值。最后插入28,发现当前节点关键字也是不小于阶数4了,于是分裂,于是分裂, 第 ⌈4/2⌉=2个,也就是36上移到父节点,因父子节点只有2个关键值,还是小于4的,所以不用继续分裂,插入完成。将主键索引树的磁盘块3加载内存,在内存遍历,找到id=400的记录,拿到R4这一行的数据,好的,大功告成。分裂后,需要将⌈m/2⌉的关键字上移到父结点。
2025-10-31 19:22:03
368
原创 Java 中 JSON 字段不固定怎么搞序列化?用好这两个注解就够了!
特别适合那些字段不固定、可能需要动态扩展的 JSON 数据结构,比如配置项、参数列表、插件信息等。
2025-10-31 19:20:29
364
原创 面试官:如何优雅的实现在线人数统计功能?
这种方案的核心逻辑就是,创建一个在线用户身份集合为key,利用用户身份为member,利用过期时间为score,然后对这个集合进行增删改查,实现起来还是比较巧妙和简单的,大家有兴趣可以试试看。如果网站是公开的,是那种不需要登录就可以浏览的,那么这种网站一般就需要自定一个规则来识别用户,也有很多方式实现如IP、deviceId、浏览器指纹,推荐使用浏览器指纹的方式实现。我这里的逻辑是:每次添加一个在线用户时,利用当前时间加上过期时间计算出一个分数,可以有效保证当前用户只会存在一个最新的登录态。
2025-10-31 17:26:55
284
原创 告别Swagger UI!一款更适合 SpringBoot 的API文档新选择
正常使用SpringDoc,或多或少都会进行一些配置文件的配置,但是由于这里是进行最小化配置,所以这里不进行配置文件配置,仅仅介绍几个重要配置的默认项,给大家一个基础印象,方便大家理解后面运行时为什么要这样做,当然,如果不感兴趣的小伙伴也可以直接跳过,跟着步骤走,并不影响使用。按照如上设置后,SpringDoc将恢复正常(注意新版的SpringDoc和老版的SpringFox配置有所区别,这里只展示新版SpringDoc的配置方法)如果大家对老版配置有需要,可以留言,留言人多会单独出一期。
2025-10-31 17:26:05
351
原创 SpringBoot + @RefreshScope:动态刷新配置的终极指南
通过,我们实现了:• ✅ 零停机配置更新• ✅ 即时生效的应用参数• ✅ 更灵活的运维体验• ✅ 资源利用最大化最佳实践建议:• 敏感配置(如密码)避免使用动态刷新• 配合配置中心(Nacos/Config Server)使用• 生产环境务必保护刷新端点技术的本质是让复杂变简单。掌握动态配置刷新,让你的应用在云原生时代如虎添翼!
2025-10-31 17:24:42
227
原创 在使用 MyBatis 开发项目时,选择混合模式还是全注解模式 ?
在使用 MyBatis 开发项目时,Mapper 接口是为数据库操作提供最直观的方法,但在实现方式上,我们有两种选择:全注解模式和混合模式。那么,他们有什么区别,应该如何选择?我们一起来讨论一下。
2025-10-31 17:24:01
326
原创 京东一面:InnoDB如何用MVCC和Next-Key Lock实现RR隔离?看完顿悟!
在深入隔离级别之前,我们必须先统一共识:什么是事务?为什么需要它?事务是数据库操作的一个最小逻辑工作单元,其内的所有操作要么全部成功,要么全部失败。一个经典的例子就是银行转账:从 A 账户扣款和向 B 账户加款,这两个操作必须作为一个整体,不能分割。原子性 (Atomicity): 事务是一个不可分割的整体,就像原子一样。它要么全部完成,要么全部不完成,不存在中间状态。InnoDB 通过Undo Log来实现原子性。如果事务失败,Undo Log 会将已经修改的数据恢复到事务开始前的状态。
2025-10-31 17:22:47
668
原创 实战:画了几张图,终于把OAuth2搞清楚了!
在详细讲解oauth2之前,我们先来了解一下它里边用到的名词定义吧:Client:客户端,它本身不会存储用户快捷登录的账号和密码,只是通过资源拥有者的授权去请求资源服务器的资源,即例子中的网站A;Resource Owner:资源拥有者,通常是用户,即例子中拥有QQ/微信账号的用户;Authorization Server:认证服务器,可以提供身份认证和用户授权的服务器,即给客户端颁发token和校验token;
2025-10-28 21:41:26
606
原创 千万不要滥用Stream.toList(),有坑!
应将相等的实例视为可互换的,不应将它们用于同步,否则可能会发生不可预知的行为。工厂可以自由地创建新的实例或重用现有的实例。of和List.copyOf静态工厂方法为创建不可修改的列表提供了一种方便的方法。从Java16开始,Stream有了直接toList方法, java8时候常用的方法是。列表中元素的顺序与提供的参数或提供的数组中元素的顺序相同。但是,如果包含的元素本身是可变的,这可能会导致List的内容看起来发生变化。如果所有元素都是可序列化的,那么它们就是可序列化的。该接口是Java集合框架的成员。
2025-10-28 21:39:47
358
原创 从实现到原理,我总结了11种延迟任务的实现方式!
延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景的不大相同。
2025-10-28 21:38:52
404
原创 又踩坑了!BeanUtils.copyProperties浅拷贝的坑!
浅拷贝是指创建一个新对象,该对象的属性值与原始对象相同,但对于引用类型的属性,仍然共享相同的引用。换句话说,浅拷贝只复制对象及其引用,而不复制引用指向的对象本身。深拷贝是指创建一个新对象,该对象的属性值与原始对象相同,包括引用类型的属性。深拷贝会递归复制引用对象,创建全新的对象,以确保拷贝后的对象与原始对象完全独立。
2025-10-28 21:37:39
323
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅