- 博客(2388)
- 资源 (1)
- 收藏
- 关注

原创 你不是 leader,怎么推动事情走下去?
你不是指挥官,但你是facilitator —— 促动者,让人听你不是因为你大,而是你有组织力。有时候你不说话,事情就真没人记得了。不是你说了算,但你提的方案有道理,大家就会照你说的做。为了不耽误进度,我先拟了一个初步下一步,欢迎补充修改。不是甩锅,而是聪明地引入该出现的人,顺带洗清责任。提前提醒一下,如果要推进,可能需要领导的决策。你作为这方面的专家,是不是可以牵头一下这块?这边我草拟了一个初步方案,欢迎大家补充建议。我只是想帮大家对齐一下,方便推进下一步。我把这个加进我们的进度表,方便持续关注。
2025-06-26 00:16:36
545

转载 服务端高并发分布式架构演进之路
1. 概述本文以淘宝作为例子,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。特别说明:本文以淘宝为例仅仅是为了便于说明演进过程可能遇到的问题,并非是淘宝真正的技术演进路径2. 基本概念在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:分布式 系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署
2021-05-25 17:47:54
467

转载 警惕软件复杂度困局
简介:对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪些原则?本文将分享阿里研究员谷朴关于软件复杂度的思考:什么是复杂度、复杂度是如何产生的以及解决的思路。较长,同学们可收藏后再看。写在前面软件设计和实现的本质是工程师相互通过“写作”来交流一些包含丰富细节的抽象概念并且不断迭代过程。另外,如果你的代码生存期一般不超过6个月,本文用处不大。一 软件架构的核心挑战是快速增长的复杂性越是...
2021-05-19 18:17:58
671

转载 常见代码重构技巧,非常实用
关于重构为什么要重构项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是会往越来越混乱的方向演进。当混乱到一定程度之后,量变引起质变,项目的维护成本已经高过重新开发一套新代码的成本,想要再去重构,已经没有人能做到了。造成这样的原因往往有以下几点:编码之前缺乏有效的设计 成本上的考虑,在原功能堆砌式编程 缺乏有效代码质量监督机制对于此类问题,业界已有有很好的解决思路:通过持续不断的重构将代码中的“坏味道”清除掉。什么是重构重构一书的作者Martin..
2021-05-13 10:01:52
1082

转载 JAVA线上故障排查全套路
线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。一、CPU一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用js
2020-09-22 17:45:24
477

转载 图解+代码|常见限流算法以及限流在单机分布式场景下的思考
大家好,我是 yes。今天来说说限流的相关内容,包括常见的限流算法、单机限流场景、分布式限流场景以及一些常见限流组件。当然在介绍限流算法和具体场景之前我们先得明确什么是限流,为什么要限流?。任何技术都要搞清它的来源,技术的产生来自痛点,明确痛点我们才能抓住关键对症下药。限流是什么?首先来解释下什么是限流?在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000 个人能进去游玩。题外话:我之前看到个新闻,最不想卖门票的景区“
2020-09-22 13:06:08
587

转载 springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理
本文都是springboot的常用和实用功能,话不多说开始吧定时任务1.启动类开启注解@EnableScheduling //开启基于注解的定时任务@MapperScan("com.pdzx.dao")@SpringBootApplicationpublic class VideoApplication { public static void main(String[] args) { SpringApplication.run(VideoApplicatio
2020-08-26 20:22:41
1979

原创 聊聊微服务架构及分布式事务解决方案
分布式事务场景如何设计系统架构及解决数据一致性问题,个人理解最终方案把握以下原则就可以了,那就是:大事务=小事务(原子事务)+异步(消息通知),解决分布式事务的最好办法其实就是不考虑分布式事务,将一个大的业务进行拆分,整个大的业务流程,转化成若干个小的业务流程,然后通过设计补偿流程从而考虑最终一致性。什么是事务事务(Transaction)及其ACID属性事务是由一组SQL语句组成的逻...
2020-04-21 22:34:45
653

转载 Java线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程...
2020-04-03 14:58:43
706

转载 Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析
一、深入JVM锁机制:synchronizedsynrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null对象作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁...
2020-04-01 16:00:25
590

转载 一文带你理解Java中Lock的实现原理
当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁,一种是关键字:synchronized,一种是concurrent包下的lock锁。synchronized是java底层支持的,而concurrent包则是jdk实现。关于synchronized的原理可以阅读再有人问你synchronized是什么,就把这篇文章发给他。在这里...
2020-04-01 15:04:40
934

转载 业务复杂=if else?刚来的大神竟然用策略 工厂彻底干掉了他们!
对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。一旦代码中if-else过多,就会大大的影响其可读性和可维护性。首先可读性,不言而喻,过多的if-else代码和嵌套,会使阅读代码的人很难理解到底是什么意思。尤其是那些没有注释的代码。其次是可维护性,因为if-else特别多,想要新加一个分...
2019-10-24 13:41:06
894
原创 抽象是什么
所以,我们大部分的时间并不是在写代码,而是在梳理需求,理清概念,当然,也包括尝试看懂那些“该死的、别人写的”代码。抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。具体地说,抽象就是人们在实践的基础上,对于丰富的感性材料通过去粗取精、去伪存真、由此及彼、由表及里的加工制作,形成概念、判断、推理等思维形式,以反映事物的本质和规律的方法。实际上,抽象是与具体相对应的概念,具体是事物的多种属性的总和,因而抽象亦可理解为由具体事物的多种属性中舍弃了若干属性而固定了另一些属性的思维活动。
2025-08-19 00:12:31
171
原创 重试机制如何考量
微服务接口重试机制的核心是 “理性重试”—— 既不回避瞬时故障,也不盲目重试引发新问题。先保幂等:无幂等,不重试;精准筛选:只对瞬时故障重试,永久故障直接失败;策略合理:优先 “指数退避 + 抖动”,控制次数和间隔;联动容错:与熔断、限流、监控配合,规避重试风暴;组件落地:用 Resilience4j/Spring Retry 等成熟组件,减少手写逻辑;监控闭环:通过指标监控及时发现故障,持续优化。通过以上设计,重试机制才能真正成为微服务稳定性的 “守护者”,而非 “风险源”。
2025-08-18 21:19:46
643
原创 软件设计中的抽象思维,从封装变化开始
2年时间过去,对于抽象思维在软件设计中的运用,我又有了一些新的体会。。因为内容比较多,我会用两篇文章分别介绍。
2025-08-18 21:06:29
968
转载 跨越DDD从理论到工程落地的鸿沟
本文分享自华为云社区《》,作者:敏捷小智。。然而又因为DDD本身难以掌握,很容易造成DDD从理论到工程落地之间出现巨大的鸿沟。就像电影里面的桥段,只谈DDD理论姿势很优美,一旦工程落地就跪了......所以DDD的项目,工程落地很重要,。
2025-08-18 19:11:16
7
原创 面向对象语言的核心竞争力
面向对象语言的核心价值,不在于 “类、继承、多态” 这些语法特性本身,而在于它们共同构成了一套 **“将复杂系统拆解为可理解、可复用、可扩展的模块” 的方法论 **。这种方法论让开发者能更高效地应对大型软件的 “复杂性、迭代性、协作性” 挑战,最终实现 “代码易理解、易维护、易扩展” 的目标 —— 这也是为什么面向对象成为企业级软件开发的主流范式。
2025-08-16 01:06:15
768
原创 非内存资源和JVM 堆外内存
非内存资源(文件流、连接等)由操作系统或外部系统管理,Java 对象只是它们的 “引用者”。GC 仅负责回收对象的内存,无法知晓或执行资源的释放协议,因此必须手动调用释放方法(或利用 try-with-resources 自动释放)。否则,即使对象被回收,底层资源仍会被占用,最终导致资源泄漏。两者都不受 GC 自动管理,需手动释放,否则会导致资源泄漏。区别在于:非内存资源是操作系统级的非内存资源,堆外内存是操作系统管理的内存资源。
2025-08-16 00:35:31
735
原创 GO(C、C++、Python)语言的认识(三)
下面以一个为例,展示 Go 语言开发企业级项目的核心代码实现。该服务包含用户 CRUD、认证授权、日志、配置管理、数据库交互等企业级项目常见模块,采用分层架构(API 层、服务层、数据层)设计。
2025-08-16 00:19:49
830
原创 GO(C、C++、Python)语言的认识(二)
C++ 的设计初衷就是在 C 的基础上增加面向对象能力,因此面向对象是其主流用法,尤其在中大型项目中;但它并不排斥面向过程,而是允许开发者根据实际需求灵活选择,实现 “混合编程”。Python 不是 “纯面向对象语言”(如 Java 要求所有代码必须在类中),也不是 “纯过程语言”,而是以面向对象为核心、同时兼容面向过程的多范式语言。其设计理念是 “灵活实用”—— 开发者可根据任务复杂度选择合适的编程风格,这也是 Python 能广泛应用于脚本开发、Web 开发、数据分析、AI 等领域的重要原因。
2025-08-15 20:36:37
645
原创 GO(C、C++、Python)语言的认识(一)
结构体用于封装数据(字段),相当于类中的成员变量。// 定义一个 Person 结构体,包含 Name 和 Age 两个字段Name string // 姓名Age int // 年龄结构体(struct)相当于 “类” 的属性定义,用于存储数据。方法(通过接收器绑定到结构体)相当于 “类” 的方法,用于定义行为。指针接收器用于修改结构体实例的数据,值接收器用于只读操作。这种方式虽然没有 “类” 的关键字,但能实现类的核心功能(封装、数据与行为绑定)。Go 没有传统的 “继承”,但通过。
2025-08-15 19:07:02
947
原创 Java switch关键字
和 都是编程语言中用于条件判断的结构,但它们在适用场景、语法特点和性能表现上有明显区别,以下是具体对比: 基于布尔表达式判断,可处理复杂条件: 基于离散值匹配(如常量、枚举等),结构更清晰: 2. 适用场景 更适合: 更适合: 通常更快: 编译器可优化为「跳转表」或「哈希表」,直接根据值定位分支(时间复杂度接近 O (1))。 性能随条件增多下降: 需要逐个判断条件,最坏情况需执行所有分支(时间复杂度 O (n))。例外:若 的 值不连续,优化效果可能减弱,
2025-08-15 01:26:22
692
原创 GC日志分析
全面记录、合理轮转、便于分析”。通过正确的配置,结合专业工具分析关键指标,可高效定位 GC 问题(如内存泄漏、停顿过长),为 JVM 调优提供数据支撑。快速初步分析:优先使用(命令行)或GCEasy(在线版)。本地深入分析:选择GCViewer(图形化)或VisualVM(配合插件)。企业级监控:考虑Datadog或IBM GCMV。
2025-08-15 01:06:31
539
原创 jvm内存快照分析工具mat的使用
Overview(概览):显示堆内存总量、类数量、对象数量等基本信息,以及泄漏嫌疑报告入口。Histogram(直方图):按类名统计对象数量和内存占用(重点关注内存占比高的类)。Dominator Tree(支配树):展示对象间的引用关系,识别 “支配” 大量内存的对象(即若该对象被回收,可释放的内存)。Leak Suspects(泄漏嫌疑):自动分析并列出可能的内存泄漏点及详细描述。
2025-08-15 00:27:45
962
转载 分布式并发业务场景:别动不动就加分布式锁
为什么秒杀库存扣减不用乐观锁,甚至不用分布式锁如果你还没想明白,不妨回到上面的 SQL 细细琢磨。提示:答案藏在MySQL 行锁和WHERE 条件里,并不是不需要加锁,而是把加锁的操作交给了DB。
2025-08-14 17:29:10
7
转载 Java 状态机设计:替代 if-else 的优雅架构
通过本文,你应该能做到:理解状态 / 事件 / 转移三要素会写一个简单可扩展的 Java 状态机知道如何做性能优化(表驱动)与并发保护理解持久化原则:只存状态,记录历史避免常见反模式,做好监控与可恢复设计状态机不仅是代码结构,更是工程思维。
2025-08-14 17:15:45
9
原创 jvm堆外内存问题
堆外内存的核心使用者是直接缓冲区(内存映射文件JNI 调用及高性能框架。合理使用堆外内存可提升 I/O 性能并减少 GC 压力,但需注意手动管理内存释放,避免泄漏。排查堆外内存问题时,需结合jmap(查看堆内对象)、jcmd(查看 JVM 非堆内存)及操作系统工具(如toppmap先通过系统工具与JVM 工具确认堆外内存增长。再根据堆外内存的来源(/JNI/ 内存映射等),用调用栈追踪堆 dump 分析系统内存映射等手段定位具体代码。最后通过限制大小主动释放优化配置解决问题。toppsjcmd。
2025-08-14 16:53:49
658
原创 Java覆盖第三方jar包中的某一个类的实现方法(三)
类路径优先级方案(即文章中 “项目内创建同名同包类”)的核心依赖是应用类加载器(AppClassLoader)的默认加载顺序(先加载classes目录,再加载lib目录的 JAR)。无法覆盖 “更高优先级类加载器” 加载的类Java 类加载器遵循 “双亲委派模型”,应用类加载器(AppClassLoader)的父加载器是扩展类加载器(ExtClassLoader),再往上是启动类加载器(BootstrapClassLoader)。
2025-08-13 01:43:37
514
原创 Java覆盖第三方jar包中的某一个类的实现方法(二)
在 Java 中覆盖第三方 JAR 包中某个类的实现,本质是让 JVM 优先使用你的自定义类而非第三方类,或通过技术手段替换原有方法的逻辑。
2025-08-13 01:33:07
877
原创 Java覆盖第三方jar包中的某一个类的实现方法(一)
在我们日常的开发中,经常需要使用第三方的 jar 包,有时候我们会发现第三方的 jar 包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何实现呢,本文给大家介绍了Java覆盖第三方jar包中的某一个类的实现方法,需要的朋友可以参考下。
2025-08-13 01:23:30
726
原创 Java中继承的重新思考
编译时:字节码通过记录继承关系,重写方法标记为虚方法,构造器强制添加super()调用。运行时类加载:父类优先加载,静态初始化(静态变量 + 静态代码块)按 “父→子” 顺序执行。对象创建:堆中分配连续内存(含父类 + 子类实例变量),实例初始化(实例变量 + 实例代码块 + 构造器)按 “父实例→子实例” 顺序执行。方法调用:通过对象类型指针找到类元数据,重写方法通过动态绑定(方法表)调用子类实现,私有方法 / 静态方法则直接绑定到声明类。本质上,Java 继承是通过字节码记录关系。
2025-08-12 18:05:21
849
原创 面向对象VS面向过程
本质区别:面向过程以 “步骤(函数)” 为核心,分离数据与行为,适合简单问题;面向对象以 “实体(对象)” 为核心,封装数据与行为,适合复杂系统。共存原因:问题的复杂度和类型不同,需要不同的抽象方式 —— 简单问题用面向过程更高效,复杂问题用 OOP 更易维护,二者互补而非替代。理解这一点,就能在实际开发中根据场景选择合适的范式,而非教条地 “非此即彼”。
2025-08-12 17:54:03
726
原创 关于Java static关键字的重新思考(二)
static静态方法的本质是 **“类级别的行为封装”**,设计目的是提供不依赖对象实例的功能入口。简化通用工具功能的调用(无需创建对象);封装类级别的行为(如对象创建、静态变量操作)。合理使用静态方法(如工具类、工厂模式)能提升代码简洁性,但过度使用会破坏面向对象的灵活性(如多态、依赖注入),需在 “便利性” 和 “设计合理性” 之间平衡。在 Java 编程中,方法定义为实例方法还是静态方法,核心取决于方法的功能是否依赖对象的状态以及方法的归属(属于对象还是类)。实例方法静态方法对比维度实例方法。
2025-08-10 23:27:37
931
原创 关于Java static关键字的重新思考(一)
Java 中静态成员变量的值存储在方法区,其生命周期与类的生命周期一致(类卸载时才会被回收),而堆内存主要存储对象实例和实例变量。这一设计体现了静态变量 “类级别共享” 的特性。特性方法区(Method Area)永久代(PermGen)元空间(Metaspace)性质JVM 规范定义的逻辑区域HotSpot 对方法区的早期实现HotSpot 对方法区的新实现存储位置无具体规定堆内存的一部分本地内存(Native Memory)大小限制无规定固定大小(需手动配置)
2025-08-10 23:05:48
935
原创 OOA、OOD、OOP实践
怎么做从业务流程中提取 “用例”(用户与系统的交互场景),明确 “谁(参与者)” 做 “什么(功能)”。例:课程管理模块的核心用例包括 “讲师创建课程”“运营审核课程”“学生购买课程”“系统计算课程价格(含折扣)”。绘制 “用例图”:用建模工具(如 StarUML、Draw.io)展示参与者(讲师、学生、运营)与用例的关系,避免遗漏核心功能。注意:用例只描述 “做什么”,不涉及 “怎么做”(如 “计算课程价格” 只定义 “输入课程原价和折扣,输出最终价格”,不考虑计算公式)。OOP 的核心是。
2025-08-10 22:53:03
1016
原创 面向对象分析(OOA)
OOA 是面向对象开发的 “地基”,它通过对问题域的抽象建模,确保开发团队对 “要解决什么问题” 达成共识。如果跳过 OOA 或分析不深入,后续设计和编码可能会偏离用户需求,导致系统功能与业务脱节。在动手写代码前,先搞清楚 “要做什么”,并把它用 “对象” 的语言描述清楚。提取类之后,需要明确:每个类有哪些属性(描述实体的特征,如Product有 “价格”“库存”);每个类有哪些行为(实体能执行的操作,如Order有 “取消订单”“确认收货”);类之间有哪些关系(如 “一个买家可以有多个订单” 是。
2025-08-10 22:48:37
1016
原创 面向对象设计(OOD)
面向对象设计的本质是 **“合理划分责任”**—— 就像设计一个公司的组织架构:明确每个部门(类)的职责,部门之间通过规范流程(接口)协作,这样公司(系统)才能高效运转,且便于扩招(扩展功能)。好的面向对象设计,能让代码在需求变化时 “稳如泰山”;而糟糕的设计,会让代码变成 “牵一发而动全身” 的泥潭。本质是 “对抗复杂性”:通过划分责任、控制耦合,让系统在变化中保持稳定。思维是 “责任分配”:从 “谁该做这件事” 出发设计类,而非从 “需要做什么事” 出发堆砌功能。原则是 “避坑工具”
2025-08-10 22:24:48
690
原创 面向对象编程(OOP)
明白它是 “为解决复杂系统问题而生” 的工具;能将现实世界的实体和关系映射到类、对象、继承等概念;在实践中体会 “何时用 OOP”“如何用好 OOP”(而非生搬硬套概念)。当你写代码时,不再刻意思考 “我要封装一下”,而是自然地用对象组织逻辑,就说明真正理解了 OOP。
2025-08-10 21:56:55
867
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人