当我看源码的时候,我在想什么?

阿里cobar中间件文档集合 Home - Cobar - Alibaba Open Sesame 产品文档(未完成) - Cobar - Alibaba Open Sesame_action 路由算法 - Cobar - Alibaba Open Sesame_action rule - Cobar - Alibaba Open Sesame 数据源心跳配置 - Cobar - Alibaba Open Sesame_action 阿里巴巴Cobar架构设计与实践 Cobar的架构与实践(第88页) 立即下载

引言

在斯坦福大学, 乔布斯做了一场我认为他最精彩的演讲之一 (另一场可能是iphone的问世发布会)。他讲了第一个故事 "connecting the dots"

你不可能充满预见地将生命的点滴串联起来;只有在你回头看的时候,你才发现这些点点滴滴之间的联系。所以,你要坚信,你现在所经历的将在你未来的生命中串联起来。你不得不相信某些东西,你的直觉、命运、生活、因缘际会……正是这种信仰让我不会失去希望,它让我的人生变得与众不同。

什么是连接生命中的点滴呢?

我的理解: 当一个人的能力还在上升期, 格局和视野还不够广阔的时候,他需要专注当前的事情,并且把每件事情做到他当时的能力所能做到的极限,也许当时没有那么大的成就感,但"蓦然回首,那人却在灯火阑珊处"。

十年前刚进入IT这个行业的时候,我是一个很普通的工程师,脑袋也不灵光,工作老是得不到要领,我的同学智商很高,他看一次代码基本就会写了,我得花很长时间去消化吸收,我对自己能不能在这一行生存下去都产生了质疑。

没有办法,只能勤能补拙,笨鸟先飞, 当遇到问题的时候, 我都抱着死咬不放的心态去寻找最佳解决方案, 洗澡的时候,睡觉的时候,吃饭的时候,甚至上厕所的时候都会去思考。很自然的,"追"源码也成为我程序生命中的一部分。

阅读过很多源码,和大家分享几个对我的职业影响比较大的追源码的经历。

Druid 连接池

这是在2013年,我第一次重构一个彩票算奖服务,原有代码是C#版本,每次计算订单金额耗时2~3个小时,很多用户反馈体验很差(因为收到奖金很晚)。

当时采用druid作为新项目的数据库连接池,上线后,重构效果明显,算将性能提升到原来的10倍。

不过,有一个问题是:每天第一次请求,就报链接错误。

当时也不怎么会看源码,就直接给druid作者温少(也是fastjson作者)发了一封邮件:

温少给我回复了邮件,我马上翻开源码, 发现我配置数据库连接池的心跳有问题。

核心点在于需要连接池每隔一段时间发送心跳包到oracle服务器,因为数据库为了节省资源, 每隔一段时间会关闭掉长期没有读写的连接。所以客户端必须每隔一段时间发送心跳包到服务端。

这次简单的源码之旅给了我长久的激励,也让我更加关注技术背后的原理。

  • 精神层面,向别人请教问题是会上瘾的

  • 技能层面,理解连接池的实现原理:druid是基于数组实现,后来用到的jedis连接池基于commons-pool实现,netty连接池实现FixChannelPool

  • 架构层面,客户端和服务端请求需要考虑心跳:定时任务线程发送心跳包(类似druid连接池发送心跳机制),netty中的idleStateHandler

Cobar分库中间件

也还是在2013年,接触到cobar带给我的震撼简直无以复加。

当时互联网大潮奔涌而来, 各大互联网公司的数据爆炸般的增长, 我曾在javaeye上看到淘宝订单技术人员分享分库分表的帖子,如获至宝,想从字里行间探寻分库分表的解决方案,可惜受限于篇幅,文字总归是文字,总感觉隔靴搔痒。

没曾想到,cobar横空出世(开源了),用navicat配置cobar的信息,就可用像连单个mysql一样,而且数据会均匀的分布到多个数据库中。

**这对于我当时孱弱的技术思维来讲,简直就像是三体里水滴遇到人类舰队般,降维打击。**

因为对分库分表原理的渴求,我没有好的学习方法,大约花了3个月的时间,我把整个cobar的核心代码抄了一次。

真的是智商不够,体力来凑。

但光有体力是真的不够的,经常会陷入怀疑,怎么这也看不懂,那也看不懂。

边抄代码边学习好像进步得没有那么明显。

那好,总得找一个突破口吧: 网络通讯是非常重要的一环。

当时的我做了一个决定,我要把cobar的网络通讯层剥离出来,去深刻理解使用原生nio实现通讯的模式。

剥离的过程同样很痛苦,但我有目标了,不至于像没头的苍蝇,后来也就有了人生第一个github项目。

在写nio工程的同时,我同时也学习到了maven的asemble打包的模式,这个现在听起来很简单,但在2013年tomcat部署webapp war包的模式流行情况下,让我眼前一亮。

后来在2018年参与的一个直播答题的系统中,就采取和cobar一样的打包部署模式。

同时第一次了解到内存池的概念,后来的netty里面ByteBuf也可用池化。这是一个非常实用的理念。

追cobar的过程中, 好像我和阿里的大牛面对面交流,虽然我资质驽钝,但这位大牛谆谆教诲,对我耐心解答, 打通我的任督二脉,由是感激。

说是我生命中最重要的开源项目也不为过。

后来在艺龙网工作,和艺龙分布式数据库的架构师沟通的时候,因为有学cobar打的底子,理解起他的思路也会很快, 后来也找到数据中间件事务的一个bug,提交给他修改了。

再后来,cobar并没有消亡,阿里云的drds使用了cobar的解析器,民间中间件mycat大部分也使用了cobar的源码, 当然mycat的质量有待商榷。

metaq消息队列

2015年加入神州专车,那个时候神州专车处于上升期。各个系统遇到了较大的瓶颈。

metaq的故事很精彩,而且相关引申的知识点很多。

当时我们使用的metaq是庄晓丹在github开源的版本。

2016年初,我checkout了metaq的源码,边理解业务,边深入理解metaq的机制。

集群消费

首先冲击我的思维观念的概念是集群消费,我原来使用activemq,rabbitmq,使用点对点的模型, 每天消息接近百万级也能凑合的处理。但是假如不同的服务想要处理同样一条消息, 在点对点的模型下,只能重复发送,看起来很ugly。

集群消费模式下每一条消息都只会被分发到一台机器上处理。不同的消费者有不同的组名,但是可以消费同样的一条消息。对当时的我来讲,是思想上的突破,metaq借鉴了kafka的模型

我经常想:"工程上实现都还好,技术层面理念的创新更为重要",为什么先进的理念很多是由国外的公司提出的, 这都是值得我辈深思的。

神州专车的场景下,订单系统发送一条订单状态转换消息,可以被订单子系统消费,也可以被大数据团队的服务消费,还可以被派单系统消费。不同的系统有不同消费者group,消费进度offset存储在zk里。多么精妙的设计呀。我不由得感慨!

广播消息在专车推送系统中的使用(经典模型)

有幸和架构部的同事沟通专车推送是如何设计的。

最开始的时候,他们也是使用极光推送,后续因为定制的需求,所以决定自研。

最开始,我的疑问是:"推送服务器如何推送信息到每一个连接的专车app呢?"。

他们给我的答复很简单:"采用metaq的广播模式,就可以实现这个功能"。

  • 业务系统推送消息到metaq(rocketmq)

  • 消费metaq广播消息的tcp网关,获取到推送消息

  • tcp网关获取连接到该服务器的channel连接引用,推送数据给app

后来,我仔细研读了京麦tcp网关的设计,关于推送方面的实现和我们当初的实现非常相似,文章里有一句话:

在线通知是通过MQ广播机制到所有服务器,所有服务器收到消息后,获取当前服务器所持有的所有Session会话,进行数据广播下行通知

所以,技术的实现很多是相通的。

2018年我服务的一家电商公司研发直播答题系统,需要实现推送题目的功能,我花了大概3天时间,帮tcp网关的研发同学实现了相关的功能。

一场zk奔溃引发的一连串的知识点

我们也都知道metaq依赖zookeeper,metaq在zk里要保存。

突然有一天,专车整个zk集群down掉了。架构负责人修改了zk的jvm参数,问题貌似解决了。

但疑问随之产生了。

metaq和服务治理共用一组zk集群合适吗?

来公司后,阅读metaq源码后,我发现metaq消费者多的情况下,启动的时候,会频繁的争抢锁,另外消费的过程,也会对offset频繁的修改。在topic数量增多,partition数量增多的情况下,metaq对zk实际上是有写的压力的。

后来,神州架构部确实也是将metaq的zk集群和服务治理的zk集群分开了。当然迁移也是有技巧的。当前不赘述。

zk作为神州体系的注册中心是否有瓶颈?

zk会存储各个服务的ip和端口,以及对外暴露的方法。

随着专车系统的服务越来越多,zk真的可以承受得了吗?公司领导邀请了京东研发团队的同学来给大家答疑。

京东的注册中心服务信息用什么实现的呢?

京东的同学回答是: mysql。

我在旁边听得目瞪口呆,什么?mysql!

后来,淘宝中间件博客出了一篇文章: 阿里巴巴为什么不用 ZooKeeper 做服务发现?

文章的结论是:

当数据中心服务规模超过一定数量 (服务规模=F{服务pub数,服务sub数}),作为注册中心的 ZooKeeper 很快就会像下图的驴子一样不堪重负

可以使用 ZooKeeper,但是大数据请向左,而交易则向右,分布式协调向左,服务发现向右。

后来,我参看了张开涛写的一篇博客,以及在github上零落的jsf代码, 手撸了一个基于AP模型,客户端使用berkeyDb的注册中心。

我们也知道2019年,阿里在spring cloud生态上发力,nacos也诞生了,nacos同时支持AP和CP两种模型。

开源世界的选择更有多样性了。

当我们使用zookeeper的时候,一定要注意集群规模和使用场景。

神州架构团队:metaq重构之旅

说实话,我挺佩服神州架构团队的。

核心成员也没有那么多,但还是有进取精神的。一个中间件的重构需要领导者的前瞻性和勇气。

虽然,我并不完全知道神州架构团队为什么要去重构metaq,但可以从下面几点来说一下:

metaq的网络通讯框架

metaq的通讯框架是庄晓周自研的。

在神州专车在使用过程中,确实也发生过服务假死的情况,需要重启metaq服务。淘宝的一位架构师加入了神州架构团队开始从网络通讯层着手提升metaq的稳定性,将网络通讯层替换为netty。

当然替换的过程并非一帆风顺,得益于庄晓丹的代码可读性,替换后,就在测试环境小规模使用了。

突然,我惊奇的发现我的测试服务器连接数暴增,可能的原因是metaq重构网络处理连接这块可能还待优化,后续这位架构师很快解决了问题。

我很佩服高水平的架构师。

消息管理的自动化

最开始metaq有一个简单的管理系统,申请主题后,还需要运维修改配置重启服务。

后续的做法是:做一个消息管理平台,各个业务线申请主题,分区都是通过这一个平台,并且可以监控消息服务器的生产消费情况。

我并不是metaq重构的参与者,但我内心触动的点在于: 有勇气去重构知名开源产品,做出适当创新。

metaq vs rocketmq

很多同学在用rocketmq, 有一些我认为很重要的点,供大家思考。

  • rocketmq为什么将所有的数据存储在一个commitlog里,metaq多partition模式有瓶颈么?

  • rocketmq为什么要使用推拉结合的模式?相比metaq的拉模式有什么优势吗?

  • 阿里的ons系统有任意时延的消息,为什么rocketmq只支持固定的延迟消息。可否在rocketmq的基础上实现任意时延?可以参考 如何在MQ中实现支持任意延迟的消息?

  • rocketmq的控制台,你认为好用吗?能否支持多集群的模式,你要是设计该如何实现。

任务调度系统设计

xxljob(许雪里) , crane(美团),  schedulex(阿里云),这些都是任务调度系统。

时间已经到了2018年,技术部需要一个可靠的任务调度系统。最开始租赁团队使用的是xxljob,但不知道怎么搞的,老是使用有问题。

第一阶段: 坦率的讲,我看了xxljob的源码后,第一直觉是:"简单"。因为作者已经最大限度的将这个系统做成了开箱即用,去掉了quartz的集群调度模式,自研基于数据库的调度器。

但当前公司已经有自研的rpc服务,让其他团队配合xxljob添加jobhandler好像也不太容易。

所以最开始, 我修改了调度器的代码,使用了公司的rpc来执行。只不过将xxljob的jobHandler替换为公司的rpc的serviceId。

运行起来还行,能满足公司要求。

第二阶段: 为什么我想再优化一波?

因为当前的rpc调度是同步执行,xxljob的调度基于数据库锁,这两方面都有瓶颈。我想向大公司的同事取经。

所以,我找到了美团的朋友,向他请教他们公司是如何设计任务调度系统。

他给我演示了crane的执行过程,因为考虑到保密以及安全,他仅仅给我讲了其中的原理。我根据他的描述做了如下架构设计:

第三阶段: 光有架构设计没用,工程上如何实现呢?

我必须吃下定心丸,当前的设计模式确实可行。

我想到了阿里云的schedulex。假如我是一名阿里云的开发者,我怎么设计一个好的任务调度系统,支持每天千亿级别的任务调度。

我翻看schedulex的开放文档,以及schedulex client的源码。想不到真的是宝藏。

schedulex client里包含如下几点:

  • rpc调用类似rocketmq remoting

  • 任务调度通过rpc触发,任务调度有统一的注册中心(nameserver模式)

  • 支持多端口启动(若当前端口启动失败)

  • 任务执行和任务调度/回调线程池隔离

吃下了定心丸,无非是工程的实现了。

重构的效果还不错,技术同事们对当前的系统还算比较满意。

但我深知,当前的系统还有两个待解决的问题:

  • 任务调度重度依赖数据库, 当真正有10万,20万级别的任务的时候,任务的分配以及调度的触发肯定会有瓶颈。

  • 当前系统是容器的时候,是否可以正常使用。

于是,我在今年年初在github上写下了自己相对完整的一个任务调度系统,将quartz替换成了时间轮,将任务触发改成服务端推送模式。

在写任务调度的过程中, 实际上是不断超越自己的过程,我想把系统做成一个可以和行业对标的作品,就必须去向业界最先进的技术产品学习。

基于OpenSSL的CA建立及证书签发(签发多域名/IP) 自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 系统版本:CentOS Linux release 7.6.1810 (Core) OpenSSL版本:OpenSSL 1.0.2k-fips 26 Jan 2017 【前言】 在基于OpenSSL的CA建立及证书签发一文中(后面统. 阅读详情

相关推荐

基于 Python 的 LIF 模型:探索神经元同步与小世界网络

首先,我们定义了一个LIFNeuronself.soma.L = self.soma.diam = 12.6157 # 固定神经元形状self.cm = cm # 电容self.V_rest = V_rest # 静息电位self.V = V_rest # 初始化膜电位在初始化过程中,每个神经元被赋予初始的静息电位,并且其膜电位会在后续的模拟过程中动态变化。

qq_36224726的博客 1423

消息队列-Metaq(RocketMQ)原理

1. 应用场景 适用于大存储量,顺序消息,广播和日志数据传输的场景。设计理念类似kafka,场景类似。和kafak的一些差异如下,可以考虑差异使用: 文本协议设计,透明。纯java实现,kafka是scala实现。 提供事务支持,包括本地事务和XA分布式事务。Kakfa不支持分布式事务 支持HA复制,包括异步复制和同步复制,保证消息的可靠性。Kafka也都支持。支持同步和异步刷盘...

anboyyd的专栏 1751

从原理到实践:MIPI D-PHY v1.2的HS-Deskew功能全解析(附时序图详解)

本文深入解析MIPI D-PHY v1.2的HS-Deskew功能,从技术背景到实现机制,详细介绍了其在2.5Gbps高速传输中的关键作用。通过时序图详解和实测数据,帮助工程师理解并应用这一技术,解决信号完整性问题,提升系统可靠性。

weixin_30300225的博客 307

metaq架构原理

原创文章,转载请注明出处:http://jameswxx.iteye.com/blog/2034111    本来只是想看下metaq的文档,结果发现好乱,现在metaq其实有两个大分支了,一个是庄晓丹维护的已开源的,另外一个是淘宝内部的,本质结构原理没太大区别,只不过开源的已经去掉了对淘系相关的依赖。然后淘系的metaq已经到3.*版本了,但是文档比较乱,深入到细节时,发现好乱,一个...

樵夫后院 877

Jetson Orin NX深度学习环境配置全攻略:从JetPack到PyTorch避坑指南

本文提供Jetson Orin NX深度学习环境配置的完整避坑指南。重点讲解如何正确利用JetPack SDK作为系统基石,使用Miniforge管理Python环境,并安装与CUDA版本严格匹配的PyTorch特供版本。通过详细的步骤和验证方法,帮助开发者在ARM架构的嵌入式平台上高效搭建稳定的AI开发工作站。

yolo5detector的博客 272

倒立摆入门详解+pid调参

倒立摆制作全过程 最近在练习pid的控制算法,就选用了2013年的电子设计国赛题目:倒立摆 。 首先给你们看看我的成果 注意哦:倒立摆不是靠上面黄色的传感器保持平衡的,而是通过下面的电机左右扭动使得摆杆不掉下来,难度可不小了。 材料准备 1.机械部分 如图所示选好电机和角位移传感器进行组装就好了,这个部分是我直接网上购买的,如果要自己装也是可以的,不过会比较麻烦,结构差不多的。 2.主控部分 这个部分的话完全是我自己设计的,作用和网上买的一样,因为网上买的话太贵了,有需要的话可以联系我,有pcb文件

small_po_kid的博客 2万+

MetaQ的使用

文章目录MetaQ是什么MetaQ的使用目的适合的应用mete与Kafka的区别概念和术语消息生产者消息消费者Topic分区(partition /pɑː'tɪʃ(ə)n/)集群和负载均衡集群Broker集群配置负载均衡生产者的负载均衡和failover消费者的负载均衡MessageBroker消费者分组(Group)Offset(/'ɒfset/抵消,补偿,偏移量)消息的可靠性、顺序和重复可靠性...

文文的博客 2893

达妙电机MIT模式调参实战:如何从‘曲线偏离’到‘完美追踪’正弦波?

本文详细解析了达妙电机MIT模式调参实战,从曲线偏离到完美追踪正弦波的方法论。通过MATLAB实时曲线分析,深入探讨位置环(kp)和速度环(kd)的双重调节技巧,帮助工程师优化参数组合,提升电机控制精度和稳定性。

weixin_29053073的博客 729

Metaq原理与应用

Metaq原理与应用 (针对2.X版本)   誓嘉 兰生 2013/1/13 目录 1       前言 2       特别说明 3       专业术语 4       消息系统需要解决哪些问题? 4.1        Publish/Subscribe 4.2        

youling_lh的专栏 3631

.NET 8 组件之IOC容器组件

NET 8中的IOC容器组件继承了前几代的优良传统,并在性能、扩展性、灵活性等方面进行了诸多优化,使得它在现代应用开发中依然保持领先地位。通过合理使用IOC容器,开发者可以更高效地管理依赖关系,编写更加模块化、可维护的代码。随着.NET生态的不断发展,IOC容器将继续扮演关键角色,为开发者提供强大的依赖管理功能。

hy_4377的博客 1528

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

metaq的基本概念术语

为什么80%的码农都做不了架构师?>>> ...

weixin_33695450的博客 234

MacBook M芯片第二篇:Homebrew安装

Homebrew是MacOS/Linux平台的软件包管理工具,提供便捷的安装、卸载、更新等功能。

码农魏轩 893

我想对源码说

时光匆匆,慢慢长大。当我们面对这个社会的时候,一切是那么的陌生,那么的无助,找不到前进的方向,那都是因为自己能力不足。所以对于现在的社会来说,有一技之长才能立足于社会,除非你家里有矿。这时我知道了源码时代,它让教会我面对这个社会不再迷茫,它为我指引一条前进的道路。 在刚开班的时候,有像我一样初出茅庐的小白,也有经历过社会洗礼的人他们想重新开始一份新的工作。我们充满希...

Ricardo_M_Zhou的博客 203

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

想读项目源码?可为什么总是读不下去?

似曾相识的场景 你听说Spring已经有一段时间了,它已经是Java企业级开发事实上的标准。你觉得自己应该读一读Spring的源码,深入理解一下Spring的实现,这能使自己更好的使用Spring,同时也能提高自己项目设计和编码能力。 于是你泡了一杯咖啡,从github上下载最新的Spring源码,导入到IDE中,写了一个demo,然后就开始debug。你一边StepOver,一边嘴里嘟囔着「A类的a方法调用了B类的b方法,然后又调用了C类的c方法,然后又执行到了这里」。嗯,很清晰嘛,喝口咖啡。咦,刚才

wdj_yyds的博客 5512

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

最近想找一款scrm系统的源码

寻找crm源码公司自用

zzg369的专栏 117

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

要想进阶?先导源码

关于阅读源码,本号之前推送过一篇非常详尽的文章教大家如何方便的阅读framework源码: grepcode都无法访问了,如何更好的阅读源码 大致为在线查看: http://androidxref.com/ https://www.androidos.net.cn/sourcecode 替换adk中android.jar直接在as中查看: https://github.com/anggrayu...

Android 开发架构 376

想看源码但是无从下口怎么办?

前言相信不少同学都有欧阳这种情况,年初的时候给自己制定了一份关于学习英语和源码的详细年度计划。但是到了实际执行的时候因为各种情况制定的计划基本都没有完成,年底回顾时发现年初制定的计划基本都没完成。痛定思痛,第二年年初决定再次制定一份学习英语和源码的详细年度计划,毫无疑问又失败了。经过多年的摸索,对于如何查看源码欧阳终于有了一些自己的心得。有的同学还想问英语有什么心得没,不要问,再问欧阳哭给你看。一...

frontend_frank的博客 92

想看看这个网站的源码

想试一   推荐免费下载430套大型企业管理源码 下载地址:http://www.hur.cn/tg/linkin.asp?linkid=206003 下载地址:[URL=http://www.hur.cn/tg/linkin.asp?linkid=206003 ]http://www.hur.cn/tg/linkin.asp?linkid=206003[/URL] 下载地址:http:

Futureengineer的专栏 368

要想读懂HashMap的源码,你得这样看

/ 今日科技快讯 /近日,有传闻称字节跳动成立一级部门,入局社区团购。并称新事业部可能命名为“今日优选”“今日买菜”或“跳动优选”。字节跳动方面明确否认了这一传闻。字节跳动方面表...

郭霖 376

想读Spring源码?先从这篇「 极简教程」开始

想读Spring源码?先从这篇「 极简教程」开始

qq_41490913的博客 107

想下以前的CyanogenMod 源码怎么办

https://wenku.baidu.com/view/970a57fb6294dd88d0d26bef.html ——这篇移植指南非常详细,值得参考。 git CyanogenMod 源码下载 https://github.com/CyanogenMod CyanogenMod 之后LineageOS 的会怎么样?

lqxandroid2012的专栏 415

如何去阅读源码有些建议我想推荐给大家

当我们在读完一个类的代码的时候,一定要总结这个类的职责,明白这个类存在的意义。一般情况下一个类核心职责只有一个,遵循单一职责的设计原则。举个例子,在RocketMQ中有一个类MQClientAPIImpl。

weixin_44984196的博客 629

我也想读源码

我也想读读源代码。http://www.iteye.com/topic/1113732 1.JavaSDK java.util java.lang java.io other 2.Java Web Struts jetty Sun Servlet规范 Tomcat[尝试] 3.JDBC SUN JDBC驱...

保持简洁 61

突然想总结下自己阅读源码的经验

1. 带着疑问或者程序里出现的 bug 去阅读源码, 会更使人更兴奋 2. 读框架源码要先抓主干, 由粗到细 3. 一定要亲自 debug 一遍源码, 不要光看文字或视频教程 4. 一定要画图, 特别是时序图, 流程图, 哪怕不会画图, 也要先用其他形式记录下源码的主要流程 5. 不管是 debug 源码, 还是画图, 一定要有耐心, 不要急于求成, 不要把读源码当作面试突击 6. 善于利用和挖掘 IDEA 提供的各种工具 7. 市面上的框架都是大同小异, 互相模仿, 尤其是基于 Springboot 的源

nimo10050的博客 251
上一篇: 聊聊接口性能优化的11个小技巧
下一篇: 我被这个浏览了 746000 次的问题惊住了
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值