自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

jvjkfd的博客

发表是最好的记忆

  • 博客(19)
  • 收藏
  • 关注

原创 对话机器人架构设计

本文介绍了笔者主导的一个重构项目。将一个迭代了8年的系统进行了整体架构升级,以清理架构中腐化的部分,保障业务迭代的效率。我认为架构是系统的基石,是系统中稳定且不经常变动的部分。是不断生长产品功能的基础,像人的骨架一样起到支撑作用。好的架构是拥抱变化的,是对变化友好的,使变化更容易发生,不容易出错。但是互联网产品的发展有着特殊性,那就是“快”。很多互联网产品都是朝生夕死。在这样的背景下,系统迭代往往追求短平快,快速上线功能,快速验证产品是否适应市场的口味。在追求快的背景下,架构的设计往往是被牺牲掉的。

2024-07-08 19:37:12 833

原创 SpringBoot应用启动优化

经历这么一个优化过程,我们发现,能定位到关键问题是非常关键的。而透过错综复杂的现象,能看到问题的本质是非常考验能力与经验的。

2024-04-21 13:57:43 838 1

原创 全局异常处理和调试日志打印

这个异常处理器是业务自定义的,负责执行业务定制的异常处理逻辑。标记红色的都是比较固定的逻辑,这部分往往是重复的。针对异常处理,如果不同的方法想使用统一的异常处理逻辑,一般的做法是拷贝原来的代码,复制一份然后修改。这种做法会导致重复,如果想为异常处理加一些通用的逻辑,不得不将每个方法都修改一遍,很容易遗漏。针对@HandleException,可以在类上声明通用的异常处理器,然后在有特定需求的方法上指定自定义的异常处理器。主要有以下两个功能。2、支持全局的异常处理,同时也支持自定义的异常处理逻辑。

2023-04-06 20:21:06 213

原创 一个数据迁移方案的设计

某个老业务一致运行在较久的系统上,而新业务运行在升级后的新系统上,此时有两个系统同时在运行。基于这种现状,同一个功能需要新旧系统上分别开发一遍。为了提高开发效率,需要将该老业务迁移到新系统上。新旧系统虽然对话领域的系统,在功能维度旧系统是新系统的子集。但是在实现上,两套系统完全不同。两套系统基于完全不同的表结构设计和系统设计。要想平滑的完成迁移,需要将旧系统依赖的数据完整的迁移到新系统中的库中。旧系统依赖2个库,7张表。新系统有相应的库和表与之对应,但是结构完全不同。以上就是本次数据迁移的业务背景。

2023-04-06 20:17:51 282

原创 记录一次线上问题的排查过程

这里还有一个问题,就是Mockito是被设计用在测试代码中的,不应该被用在生产环境。当生成环境需要Mock一些对象时候,不应该使用Mockito框架。可选的办法是手动创建代理对象,这样可以避免踩到未知的坑。另外,FullGC问题往往有一定的隐蔽性,一开始潜伏在应用中,逐步积累,超出临界值时,再一下子暴露出来。本次问题排查,体会最深的感受是,问题排查的方向真的很重要。这种方向感需要靠经验和实践的积累而形成,不仅仅是有理论知识就可以了。常言道,纸上得来终觉浅,绝知此事要躬行。

2023-04-06 20:13:31 163

原创 项目重构实践

我理解的重构是在不改变业务逻辑的基础上,修改代码实现,让其具有更好的可读性、可扩展性。要保证不改变业务逻辑是前提。有可能一次重构把正常的业务逻辑改坏了,搞成了线上故障。怎样保障这个前提呢?那就是充分的单测。有了单测的保证,采用小步快跑的方式,逐步重构。每完成一个小的修改,就运行一次单测。逐步重构可以让你快速发现问题,当一次单测失败了,你就知道是这次改动导致了bug。如果进行了多处修改,再运行单测,此时定位bug是哪处变更导致的,将花费更多的时间。这是逐步单测带来的好处,让你快速定位bug。有一句话叫做,无单

2022-08-30 21:53:22 652

原创 项目重构实践

我理解的重构是,在不改变业务逻辑的基础上,修改代码实现,让其具有更好的可读性、可扩展性。要保证不改变业务逻辑是前提,有可能一次重构把正常的业务逻辑改坏了,搞成了线上故障。怎样保障这个前提呢?那就是充分的单测。有了单测的保证,采用小步快跑的方式,逐步重构。每完成一个小的修改,就运行一次单测。逐步重构可以让你快速发现问题,当一次单测失败了,你就知道是这次小的改动导致了bug。如果进行了多处修改,再运行单测,此时定位bug是哪处修改导致的,将花费更多的时间。这是逐步单测带来的好处,让你快速定位bug。有一句话叫做

2022-08-27 11:42:13 464

原创 浅析事务脚本和领域模型

最近为了准备团队内分享,重新翻了下Martin Fowler的《企业应用架构模式》。对其中的事务脚本和领域模型比较感兴趣,选取了这一部分在团队内进行了分享。在准备过程中,重新看这一章节后,产生了一些共鸣。想到自己在实际业务开发过程中,见到的大部分都是事务脚本类型的代码,也被叫做面条代码或者胶水代码。这种代码可读性、可维护性差,经常出现祖传代码现象。遗留代码没人看得懂,也没人敢改。导致业务系统不断腐败下去,维护代码的人心力憔悴。同时也影响了业务迭代的速度,没办法快速响应市场需求。...

2022-07-07 16:58:16 573

原创 单元测试实践入门

概述笔者参与的项目中,很少使用单元测试。在使用maven时,我们知道maven把项目的声明周期抽象为了:编译、测试、打包、部署多个阶段。MatinFowler、RobertMartin、KentBeck等软件开发大师都不厌其烦的强调测试的重要性,宣传TDD如何如何提高项目编码质量,等等。既然测试这么好,我就比较好奇为什么不在项目中引入软件行业呢?本着这份好奇,笔者在项目中浅浅的实践一下单元测试,并把获得粗浅经验跟大家分享下。目录下面的文章主要以为以下几个部分进行介绍。TDD介绍、J...

2022-04-13 17:31:13 422

原创 数据结构-树

一、树的概念相比数组、链表、栈、队列,树是一种非线性的数据结构。树有层次关系,最高层次的节点叫做根节点。根节点的存在子节点,当一个节点没有任何子节点时,该节点被称为叶子节点。二叉树二叉树是一种特殊的树,它的每个节点最多只有两个节点。二、使用Java实现树????普通树的实现树由节点组成@Datapublic class TreeNode<T> { private T data; private List<TreeNode<T>&g

2021-03-11 22:32:23 56

原创 数据结构-图

一、图的概念相比栈、队列、二叉树、图是一种更复杂的数据结构。图由节点和边组成二、用java实现图定义节点@Setter@Getterpublic class GraphNode<T> { private T data; private List<GraphNode<T>> neighbourNodeList; private boolean visited; public GraphNode(T data){

2021-03-11 21:59:14 104

原创 个人职业发展书单总结

这个书单总结了自己职业发展过程中自己看过的书。这些书帮助自己提升自己的编程硬实力,也提升了自己的认知水平。这个书单从2018年进入阿里就几乎没更新过,也说明了自己基础能力的提升是有限的。从2016年开始工作到2021年在阿里进入工作舒适区,自己也工作了5年的时间。这个时间点也是一个转折点,意味着在职业发展的道路上要有一个提升。每次进入舒适区,自己总能很快的反应过来,不沉沦在舒适区,想要做一些改变,以提升自己的层次。不仅仅满足于完成自己的工作,拿固定的报酬。 每一个阶段的跳跃,需要长时间细枝末节工作的积

2021-01-27 11:24:55 121

原创 tomcat学习笔记

基于tomcat6Acceptor、WorkerConnector、Engine入口:org.apache.catalina.startup.Bootstrap.main整体架构图:org.apache.catalina.startup.Catalina.startContainerConnector初始化server的初始化,解析server.xml后在org.apache.tomcat.util.digester.Digeste.endElem

2020-08-02 11:57:07 198

原创 Java学习路线图

2018-01-30 13:48:48 170

原创 session到底是什么

做web开发的肯定都知道,cookie和session。不过刚开始,很多人都只是停留在概念上的理解。今天就以看得见的方式再理解一下session。通过查看tomcat源码,可以发现sessions就是一个ConcurrentHashMap。

2017-12-25 10:12:48 2208

原创 使用java socket理解tcp协议

之前学习tcp协议,都是通过一些理论、图例,看不到摸不着,感觉很抽象、很遥远。现在使用java socket来实现tcp通信,并通过RawCap结合wireshark,来实操一次,用看得见的方式理解tcp协议。package com.cfysu.socket;import org.apache.log4j.Logger;import java.io.*;import java.n

2017-12-19 20:01:55 351 1

原创 生成一个可执行jar包、invalid header field

把自己写的java程序打成一个jar包,通过java -jar xxx.jar命令就可以直接运行。jdk提供了jar命令用于jar包的生成。要打成可执行jar包需要两个东西。一是字节码文件,二是jar包描述文件。  举个例子,有源文件如下:public class HelloWorld{ public static void main(String[] args){ System.o

2017-07-02 13:17:17 1288

原创 找不到或无法加载主类、JAVA_HOME、PATH、CLASSPATH

刚开始学习java的时候,需要配置JAVA_HOME、PATH、CLASSPATH。只是按照步骤一步步的配置,不知道是用来干嘛的。学习阶段一直是云里雾里,搞不太清楚。现在回过头来想想,有种豁然开朗的感觉。  先说说JAVA_HOME。可以理解为定义一个叫JAVA_HOME的全局变量,给他赋值一个绝对路径。绝对路径具体是你jdk的安装目录。安装jdk时每个人选的安装路径不一样,所以需要把这个路径

2017-07-01 23:08:55 392

原创 android文件夹目录的读取权限

今天在做安卓应用的自动检测更新、下载、安装功能。遇到了下载完成,但是安装时总是提示“There was a problem parsing the package”的错误。开始是怀疑安装路径出错或文件下载过程中出现损坏,后来发现都不是。刚开始的时候我的模拟器上没有设置SD卡空间,通过Environment.getExternalStorageDirectory()获取不到SD卡路径。所以我尝试把文

2015-08-13 12:10:31 2533

空空如也

空空如也

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

TA关注的人

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