自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JAVA虚线程简介-译

本文加入了部分个人理解,省去了部分和主旨关系较弱的段落,可作为虚线程的概览,有时间推荐阅读非常优秀的原文。原文地址链接:Virtual Threads: New Foundations for High-Scale Java Applications。术语说明virtual thread:虚线程。thread-per-request:每个线程处理一个请求。runtime:运行时。s...

2023-06-14 21:15:03 51

原创 业务系统设计的本质

业务系统的挑战和价值业务系统的真正的挑战并不是技术,技术只是一个工具,基本上都有成熟的组件来使用。业务系统真正的价值也不是技术,而是实现了对企业有价值的业务逻辑。所以一个业务系统真正的挑战在于如何快速的支撑业务。完成一个可以支撑业务的系统设计好像并没有难度,但在不断地系统需求演进中,很多系统变得越来越难以维护,BUG越来越多,代码越来越难以读懂,响应需求越来越慢。需求是系统的试金石,系统应该像...

2023-04-26 21:10:47 37

原创 如何画一个系统的设计图

如何画一个系统的设计图为什么写本文评审中发现很多研发都不会画设计图,有的画的非常复杂但没有要点,听的人不知道要表达的是什么;有的图画的非常简单,也没有要点。如果设计图只有在讲解的时候通过别人长时间的询问才能明白,那么设计图还有什么价值?大部分研发内心想提升设计能力,但有一些错误的观念可能会阻碍设计的成长。比如“参考一个好的设计模版,我就能做出好设计了这种想法”,我个人认为是非常错误的观点。...

2023-04-03 19:01:29 66

原创 卓有成效的管理者-书摘

(Drucker.P.F.).卓有成效的管理者有效的管理者重视对外界的贡献。他们并非为工作而工作,而是为成果而工作。有效的管理者善于利用长处。一项有效的决策,总是在“不同意见讨论”的基础上做出的判断,它绝不会是“一致意见”的产物。有效的管理者并不是一开始就着手工作,他们往往会从时间安排上着手。人事决策都是费时的决策。“授权”这个名词,通常都被人误解了,甚至是被人曲解了。这个...

2023-03-21 11:01:41 33

原创 设计原理整体思考

一。引言具体问题的设计方案根据实际场景千变万化,其背后的设计原理几乎从未未改变。设计原理是比设计模式更抽象一级的方法论,接近于哲学。高度的抽象使得设计原理使用范围很广,小到代码书写,方案设计,大到生活的方方面面,都非常有价值。设计原理都很简单,原理的使用并没有它外表那样简单,因为辩证论的二分法,任何原理都有适用和不适用的场景,不要因为名字带原理,就认为绝对是正确的,需要在解决问题的实践中进行权...

2023-03-20 20:11:17 20

原创 Redis实现锁和幂等性

1. 流程示意图2. 示例程序2.1 程序主体private static String lockTest(String orderId, Jedis jedis) { //写入防重Key long result = jedis.setnx("union_" + orderId, "1"); // 1 第一次请求 if (result == 1) ...

2022-07-26 11:25:34 21

原创 JAVA代码Review总结

1. 代码Review的目的一般团队很难在Review中要求极致的代码质量,毕竟是项目而非艺术品。你很难通过Review要求程序进化为完美的程序,很难要求程序员都达到很高的水准,所以常见团队的Review更多的是达成一定的共识,底线是质量可以做到项目要求的高度。而更优秀代码的探讨可以作为锦上添花的讨论,根据情况推荐而不强求。本文尝试总结下自己评审中遇到的通用问题,项目或业务名称通过简称来替...

2022-07-12 21:19:40 51

原创 java的LinkedHashMap如何使用Stream过滤

1. 背景很多时候我们需要用到有序的Map,需要使用LinkedHashMap。如果我们需要对LinkedHashMap做一个过滤呢?是不是可以使用Stream的Filter?看起来很简单的一个问题,伴随展开却能反映出很多。我先给出结论,然后使用一个LinkedHashMap过滤值中包含1的小需求来展开不同的思考。先给出结论:不要书写团队人员都觉得晦涩的代码不同业务代码中共用的业务...

2022-07-12 20:59:34 68

原创 Java的List的Clone竟然是浅拷贝

Java的List的Clone竟然是浅拷贝1. List克隆返回的是浅拷贝的集合前一段时间,代码中用到了Clone,Java中自定义对象默认的Clone是浅拷贝,所以重写了自定义对象的clone方法,实现了深拷贝。没想到还有一个坑,ArrayList的Clone竟然也是浅拷贝,集合本来想当然的认为一定是深拷贝。复现写个小例子来复现下,下面是集合中存放的对象User,实现了Clone...

2022-07-12 20:52:59 19

原创 SQL中是否应该写逻辑

SQL中是否应该写逻辑问题如果我们有不同业务需要更新表的不同字段,我们是应该为每个业务单独写SQL,还是写个更新全部字段的SQL,还是写个动态SQL根据传入的对象非空拼接?问题举例-用户信息更改用户信息我们需要实现三个用例:方案一:单独写Sql如果不使用DDD,对业务还是很友好的,DAO层保证了不可以随便修改数据;很多人认为这种写法让DAO介入了业务,可以用依赖...

2022-07-09 13:32:49 21

原创 guava缓存的使用

guava缓存的使用1.基础-Cache直接存取普通的key-value缓存类似Map的使用:``` public static void main(String[] args) throws Exception { //创建一个1000长度的缓存,10毫秒失效 Cache cache = CacheBuilder ...

2022-05-31 21:09:11 38

原创 位操作与使用场景示例(ThreadPoolExecutor)

在学习ThreadPoolExecutor之前,需要先了解下此类源码依赖的基础知识。一。位操作基础知识二进制如何表示整数Java的正数与负数的二进制表示:Integer.toBinaryString(5)//整数0开始,负数1开始,负数等于正数的反码再加一,左边是高位,右边是低位正数5:0000 0000 0000 0000 0000 0000 0000 0101反码 :...

2022-05-26 20:54:57 19

原创 Java线程池测试-Spring-空闲线程会进队列

结论场景:想尽量减少队列等待(设置线程队列长度为1),直接用线程池处理,并发数量设置的够用(示例设置4个线程),期望在4个请求内,应该都不进入等待队列。结论证明是错误的:在空余线程够用(小于4)的情况下,依然会先进入队列,并且超出队列长度1后,会发生拒绝。测试代码JAVA```package fly.sample.thread;import org.springframe...

2022-05-24 19:00:25 69

原创 表达与PPT经验总结

如何表达让对方听明白不要用未知概念来解释未知概念,要用已知概念解释未知概念。太复杂讲解目标需要设置台阶,引导听者一步步理解,最终达到目标。每个讲解都有一个故事,有主题和渐进性。就像一个电影,有故事主题和推进过程。讲解类型事先准备:事前一切都想好,演讲的时候照本宣科。适合时间要求非常严格的场合,比如限定时间的述职。临场发挥:只做基本思路的准备,现场发挥具体的讲解衔接过程,以及...

2022-03-31 20:57:55 32

原创 JAVA性能排查方式与工具

1. FullGC频繁问题复盘-不可达内存高线上出现堆内存不断提高,到4个G(设置的最大内存为4个G);触发fullGC后,降低,再重新提高。下载dump文件mat分析后,发现对内存使用只用350M,使用的内存去哪里了,mat中有一项是 Unreachable Objects,发现占用了3G多,去除基本类型后,大部分是com.alibaba.druid.stat.JdbcSqlStat...

2022-03-29 21:12:00 29

原创 DDD领域驱动知识概览

本文未完成,持续完善中DDD是什么DDD:Domain Drive Design。领域驱动设计。软件系统是用计算机语言来表达业务逻辑,需要先对业务进行建模分析。没有DDD我们也是要建模分析的,而DDD是对业务逻辑进行分析的方法论,总结了一套如何分析一个系统的业务逻辑的方法论,可以使用这套方法来对复杂业务系统进行高效的建模分析。统一语言统一语言是沟通的前提,英语和汉语是无法直接对...

2022-03-07 20:14:07 21

原创 互联网抗量架构与CAP原理

互联网的架构,本质是权衡,CAP原理指出了哪些因素是不可兼得的。CAP原理C,A,P分别指的是互联网架构三个方面收益,CAP原理指的是鱼和熊掌不可兼得,我们没有办法同时得到CAP得所有好处,需要根据应用场景进行权衡取舍。CAP指的是以下几个方面: Consistency:数据一致性,每次请求都得到最新的正确数据或错误;Availibility:可用性,每次请求都能得到响应,但不...

2022-02-28 22:45:16 29

原创 小方法抽取与英语阅读能力的关系

你可以尝试打开一篇中文文章,大概几秒钟就能速读完了解大概;再打开一篇英文文章,需要多少时间呢?可能需要几十倍的时间。代码长度是一个永恒的争议,目前主流观点认为应该抽取小方法,消除长方法。在实践中,我发现其实抽取小方法和代码块的抉择和母语是否是英语有一定关系,作为英语不如汉语熟练的中国人,阅读英语方法名并不如中文注释来的直接(类比前面阅读中英文文章速读对比),下面展开叙述下这个想法。代码块与小方...

2021-11-17 22:17:02 19

原创 换个角度看设计模式

1. 引言学习模式的时候,会不会这种想法,不就是接口,抽象类,属性组合这些基本语法吗?为啥搞这么复杂?模式并不会改变编程语言的基础,我们是不是可以换个角度,从编程语言提供的基础能力来审视下。(本文使用JAVA语法展示,其他语言可能略有不同)VS对比设计模式是通过场景,然后解释场景的解决方案。我们要做的是倒过来,先看语言有几种解决方案,合适的场景再选用方案的排列组合。2. ...

2021-11-17 11:44:26 18

原创 先梳理业务逻辑再写代码

1. 业务逻辑与代码代码是需求逻辑的一种展现形式需求文档是业务逻辑的一种展现形式,而代码不过是业务逻辑的另一种表现形式;如果逻辑本身有问题,那么它的各种展示形式自然也是错的,所以写代码前应该先思考清楚业务逻辑。Review代码很多时候是逻辑问题在Review代码经验中发现:混乱的代码并不仅仅是代码编写技艺问题,很多时候是因为逻辑没有梳理清楚。逻辑混乱,自然代码也混乱。梳理清楚业务逻...

2021-11-16 11:51:32 19

原创 这个功能应该谁来做?

跨部门开发,总会有一些参数转换逻辑会涉及双边的领域逻辑,这些转换逻辑到底应该谁来做呢?下面使用一个简单的实例来演示下争议的过程,并给出一定的思考。1. 争议举例需求背景用户购买「买一赠一」两件商品,「促销部门」关心分别独立的两个商品(不同商品价格和促销不一样),「库存部门」不关心买一赠一,告诉我扣减两件库存就可以,「结算部门」调用「库存部门」的接口到底应不应该把「买一赠一」合并商品数量为二...

2021-11-12 18:11:28 18

原创 用CSS-DIV-UL-LI布局列表页实例

摘要:最简单的列表页是表格,其实使用DIV+CSS布局更简单,也更灵活,本文给出一个布局的小例子,读者可以根据需要在实际项目中调整。1. 先来看下效果分行展示列表页内容需要居中,两侧需要留白。隔行需要有线条隔开,视觉更容易对齐每行的标题与操作。标题靠左,操作靠右2. 要点CSS2.1 分行使用HTML列表标签ul-li实现``` 标...

2021-11-11 23:14:03 77

原创 模板方法设计模式与生活的关系

摘要:学习的过程是由已知概念去学习未知概念,编程中的很多概念,并不是新的概念,平时生活中都有使用。我们通过生活中的经验和编程类似概念类比思考,来加速我们的学习过程。本文讨论GOF中最常用的设计模式「模板方法-TemplateMethod」,这个模式不仅仅编程中常用,生活中也是经常会使用的,比如当你申请银行卡或信用卡的时候,就会用到「模板方法」。模板方法GOF:定义一个操作中的算法骨...

2021-11-01 18:05:10 14

原创 互联网登录系统设计思路

摘要:传统企业信息管理系统的登录功能,很多都是使用Web容器的Session来管理(比如Tomcat容器的Session),这种手段比较简单,适用于少量用户的场景。互联网用户面对的是整个互联网,需要更具扩展性的登录架构来处理登录问题,本文给出一种可实践,可复制的互联网登录解决方案。1. 登录流程首先要弄清楚,整个登录流程是怎样一步步衔接起来的,每个流程又用到了哪些系统能力,有了整体...

2021-10-31 20:37:00 15

原创 软件分层的思考

软件分层的思考1.传统分层传统分层中,上层依赖下层。每层定义了接口和实现,上层的实现依赖下层提供的接口。背后的寓意:服务的提供方(下)掌握了接口定义的话语权,调用方(上)根据自己需要调用服务方提供接口,上层需要把参数转换为下层要求的类型。比如:DAO定义了持久化到数据库的标准,Service层按照DAO层定义的接口进行调用。2. 依赖倒置分层通过依赖倒置,上层依赖与下层...

2021-10-31 15:51:38 19

原创 JAVA代码开发规范

规范如果太严会限制程序员的创新,规范如果没有,会写出的代码五花八门,本文尝试从个人代码的体验来说说那些应该作为规范,哪些不适合强制。1. 命名命名是最重要的规范,但给出比如驼峰命名是远远不够的,需要对程序中用到的「业务术语」和「技术术语」进行约束。1.1 问题示例比如,在「文件备份程序」GitHub地址的开发过程中,我经常要用到各种文件命名(文件夹路径字符串,文件夹路径对象,文件夹...

2021-10-28 21:09:06 17

原创 程序的扩展性与中台化建设

引言目前很多互联网公司都在搭建自己的业务中台,那么为什要搭建中台?中台化有什么好处?怎么搭建中台?中台化是一个综合性的方法论,本文从程序的扩展性开始,逐步讨论烟囱式开发以及中台化建设涉及的各方面知识。1. 封装性API&扩展性SPIAPI体现的是封装性,已有功能像个黑盒子,从外部在已经的基础上扩展;SPI是专为扩展性而设计,可以从系统内部加强系统的功能。API:使用者直接...

2021-10-28 20:23:44 29

原创 学习的本质

我们每天都在接收各种知识,遇到各种人和事,看了不同的电视或电影,阅读不同的书籍,看到各种新闻,是否有思考过,我们是如何接收,如何使用这些知识的?我们每个人接收知识,并不是别人说什么是对的,我们就接受什么是对的。接收知识的过程:对于别人说的,我们首先会通过自己的的「认知系统」进行判断,评判的结论可能是认同,也可能是否定,然后把这个结果加入到我们的个人「经验库」。如果我们在将来发现自己以往积累的经...

2021-10-26 22:13:20 16

原创 一种不停机的亿级数据迁徙方案

需求背景数据是一个公司最大的财富。伴随数据的增长以及使用场景的改变,需要对存储介质进行升级,此时需要进行数据迁徙。下面列举几个场景:公司一开始使用oracle或者sqlserver等商业数据库来存储数据,随着公司业务的发展,数据量越来越大,数据增长速度越来越快。传统oracle和sqlserver不仅成本高昂,而且不易于横向扩展,无法满足大数据量的存储和读写。公司决定选择免费的mysql...

2021-10-26 22:08:26 16

原创 使用面向行为编程解除项目耦合

引言实际项目中,我们经常使用面向实体编程。程序中我们会书写这样的逻辑:如果是某个业务实体,就执行某个逻辑。伴随着新需求的不断涌现,系统代码不断出现了耦合了各种需求的语句。这些判断语句代码会散列在不同的模块中,代码逐渐演变为人无法看懂的程度。if(需求A || 需求B){ doSometing1();}if(需求B){ doSometing2();}if(需求C ||...

2021-10-26 22:01:17 17

原创 电商库存系统的防超卖和高并发扣减方案

摘要:如果你要开发一个电商库存系统,最担心的是什么?闭上眼睛想下,当然是高并发和防超卖了!本文给出一个统筹考虑如何高并发和防超卖数据准确性的方案。读者可以直接借鉴本设计,或在此基础上做出更切合使用场景的设计。下面用电商库存为示例,来说明如何高并发扣减库存,原理同样适用于其他需要并发写和数据一致性的场景。库存数量模型示例为了描述方便,我们使用简化的库存数量模型,真实场景中库存数据...

2021-10-26 21:42:07 60

原创 java的lambda如何优雅处理异常

1. 丑陋的写法引入lambda的原因是代码更简洁,如果lambda中有异常处理代码,就会变成下面的样子。在lambda表达式中,如果需要处理异常,加入try-catch,那么使用lambda简化代码的效果就会消失。那我为啥还要使用lambda呢?//遍历文件夹中的文件,输出文件的大小,File.size方法会抛出IOException,需要try-catchpublic stat...

2021-10-26 19:57:18 27

原创 看似复杂的互联网抗量架构原理及其演进过程

摘要:互联网的基因是快速根据用户需求迭代,大型互联网架构都是复杂的集群架构,这种复杂性其实是伴随流量增长一点点进化的,每一个复杂的引入都是为了解决具体的问题。1. 看似复杂的互联网架构如上图,是一个常见的互联网架构,第一眼看上去很复杂,其实只是一些简单原理的综合使用而已,这些基本原理有:快的保护慢的:比如使用guava保护redis,使用redis保护mysql。人多力...

2021-10-26 14:56:19 19

空空如也

空空如也

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

TA关注的人

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