自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 为什么很多架构师,最后都开始反对CQRS?

这些年看过很多架构演进。会发现一个特别有意思的规律。初级工程师喜欢问:哪个方案最好?资深工程师更喜欢问:这个方案的代价是什么?CQRS 当然有价值。甚至在某些场景里非常强大。但它从来不是银弹。它解决的问题越高级。引入的复杂度也越高。所以真正成熟的团队。最后关注的往往不是:能不能上 CQRS。而是:这个业务,真的值得付出 CQRS 的成本吗?

2026-06-15 11:50:08 13

原创 为什么很多微服务系统,最后都在偷偷“合并”?

过去几年最大的变化之一。不是微服务失败了。而是大家终于开始理性看待微服务。微服务当然有价值。但它不是银弹。更不是技术先进的象征。很多团队最后重新合并服务。也不是因为技术倒退。而是因为:他们终于发现。真正困难的从来不是怎么拆。而是:怎么控制复杂度。而控制复杂度这件事。远比选择单体还是微服务重要得多。

2026-06-05 20:55:14 185

原创 为什么很多公司最后放弃了 TCC,转向 Saga?

很多人学分布式事务的时候,总想找到:终极正确方案。但真实世界里的大型系统,从来没有银弹。TCC 不是错。Saga 也不是更高级。它们本质上只是:不同阶段、不同业务下的取舍。而真正成熟的架构师,最后拼的也不是:会多少技术名词。而是:能不能理解真实系统里的复杂性,到底来自哪里。

2026-05-15 17:38:43 356

原创 真正的大厂系统,靠的不是“不出错”,而是“出错也能活”

但真实世界里,还有一个更残酷的问题:系统一定会出错。数据库会超时。MQ 会丢消息。第三方支付会抽风。网络会抖。服务会雪崩。真正成熟的系统,从来不是“永远正确”。而是:即使局部出问题,系统依然能慢慢恢复。

2026-05-06 16:57:24 331

原创 订单系统到底该怎么建模(五):高并发与秒杀场景下的订单系统设计

你必须承认一件事:系统不是无限吞吐的。QPS 限流熔断降级否则再好的设计也会被打死。

2026-04-22 17:47:44 347

原创 订单系统到底该怎么建模(四):微服务拆分与聚合边界的终极实践

从单体到微服务,不是技术升级,而是边界能力升级。如果你走到这一步,其实已经具备系统设计能力了。

2026-04-15 17:53:46 307

原创 订单系统到底该怎么建模(三):从 DDD 到代码落地,不再是“画图游戏”

前两篇我们聊了两件事:第一篇,是“你到底在建什么模型”第二篇,是“这些模型之间的边界怎么划”如果你认真思考过,其实你已经完成了 70% 的设计工作。但很多人会卡在最后一步:模型是有了,但代码一写,又回到了 Controller + Service + DAO 的老路。这一篇,我们就把最后这一步补上:怎么把 DDD 真正落地到代码结构,而不是停留在 PPT 上。

2026-04-07 12:19:16 212

原创 订单系统到底该怎么建模(二):聚合边界,比你想的重要得多

很多人一上来就问:Order 要不要做聚合?Payment 要不要?其实这个问题问反了。你应该先问的是:哪些数据,必须在同一个事务里保持一致?这句话非常关键,后面所有判断都围绕它展开。

2026-03-30 21:32:25 340

原创 订单系统到底该怎么建模:从 DDD 开始

做后端的,基本都绕不开订单系统。刚开始大家都觉得这个东西不复杂:下单、支付、发货、完成,流程很清晰。但只要真的做过线上系统,很快就会发现,订单系统根本不是“建一张表 + 写几个接口”这么简单。很多人第一反应是上状态机、分布式事务、补偿机制。但如果订单模型一开始就是错的,这些东西只是“止痛药”。这篇文章只讲一个问题:订单系统,到底该怎么建模?

2026-03-24 19:18:25 238

原创 MySQL调优步骤

通过 EXPLAIN 语句分析查询的执行计划,判断:用 EXPLAIN 判断查询是否合适,主要看:

2025-05-15 17:32:39 209

原创 KMP算法

KMP(Knuth-Morris-Pratt)算法是一种用于在文本字符串中查找模式(子字符串)位置的高效字符串匹配算法。与传统的暴力匹配算法相比,KMP算法通过利用已经匹配过的信息来避免重复比较,从而提高了匹配效率。从上面的例子可以看出,KMP能大大加快我们匹配时移动的速度,解决了字符串匹配的效率问题。很容易理解,如果我们暴力法的话,此时就需要从第二个字符,从头开始继续比较,效率很低。知道概念之后,我们可以利用前后缀,来计算模式P的部分匹配表(LPS array)A 对应 A,匹配。A 对应 A,匹配。

2024-09-01 16:44:10 826

原创 排序算法--堆排序

堆排序是一种利用堆数据结构实现的排序算法。首先,它将待排序的数组构建成一个大顶堆或小顶堆。然后,通过不断将堆顶元素(最大或最小)与末尾元素交换并重新调整堆,使得数组逐渐有序。

2024-08-29 07:59:50 474

原创 mac/windows 软件推荐

推荐一些这么多年mac/windows 平台搜集使用下来比较好用,提升效率的软件。

2024-08-27 19:30:40 957

原创 Spring 启动详解

Springboot启动流程方法入口: org.springframework.boot.SpringApplication#run(java.lang.String…)StopWatch 开启,公开总运行时间和每个命名任务的运行时间getRunListeners(args) : 获取SpringApplicationRunListener 监听者prepareEnvironment(): 准备环境,并发送环境准备事件给相关listeners,这时候有ConfigFileApplicationLi

2021-04-20 15:16:29 382

原创 ubuntu 下启用ipv6

安装Teredo隧道客户端sudo apt-get install miredosudo miredo用ifconfig 确定是否安装正确查看teredo服务状态sudo systemctl status miredo.service 测试方法:ping6 ipv6.google.com或者 访问 http://test-ipv6.com/ 网站注意点以下只是一些注意点,可能不需要更改也可以访问,按需修改:1.更改miredo配置文件sudo vim /etc/miredo

2020-09-28 11:34:03 2403

原创 mybatis自动生成代码工具,字段注释

1. 配置工具包maven依赖<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version></dependency><build> <plugins>

2020-08-03 14:54:00 1342

原创 RSA非对称加密

起源最开始,密码学都是基于对称密钥,也就是发送者使用特定密钥加密信息,而接收者使用相同密钥解密。这就造成了一个问题,如果需要和很多人进行通信,那么就要跟每个人都有一对密钥,保管很多不同的钥匙,非常难以管理。RSA就诞生了,它是非对称加密,有不同的加密密钥与解密密钥。它原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥使用有两种使用方式:公钥加密、私钥解密假设B有一对公钥私钥,公钥公开给所有人,A要给B发送一段信息,那么使用B的公钥加

2020-07-13 14:32:57 374

原创 缓存穿透、缓存击穿、缓存雪崩

redis作为基于内存的数据库,并且提供一定的持久化功能,被我们广泛用于缓存,加锁等场景中,作为中间件用于解决数据库读写慢等问题。但是引入redis又有可能出现缓存穿透,缓存击穿,缓存雪崩等问题。缓存穿透描述: 某个key对应的数据在数据源并不存在,每次针对此key的请求都会到数据库,从而可能造成数据库压力过大,压垮数据库。比如请求伪造一个缓存中可能不存在的id ,例如负数,uuid 等解决方法:布隆过滤器:布隆过滤器能实现判断一定不存在的数据,将所有可能存在的数据哈希到一个足够大的b

2020-06-21 23:04:37 204

原创 uefi引导windows + linux双系统安装

最近突然想玩一玩linux系统,所以选择安装windows + ubuntu 双系统,因为这是第一次安装,所以这篇博客记录一下安装过程。我就按照官网已经有教程来尝试吧先确定安装要准备好的条件要安装系统首先需要下载镜像, 下载网址:官网下载系统镜像,也可以点击选择替代版本找到所需要的版本,这里我选择ubuntu16.04这里我试了一下,下载特别慢,还是去国内镜像网站下载,...

2020-03-28 14:51:35 1333

原创 excel导出加密

今天需要写一个excel导出加密,具体实现方法是先将文件导出,再获取文件,加密后导出成新的文件,删除或替换原文件。依赖包poi 一定要注意最好是3.17,我之前用的是4.1.0打开会显示文件损坏,还没找到原因。加密代码如下,参考用的是:https://poi.apache.org/encryption.htmlXML-based formats - Decryption/** ...

2020-02-20 21:07:32 1584

原创 MultipartEntityBuilder 中文乱码,File转MultipartFile

将file先转为fileItem再转为MultipartFileFile file = new File("*****");DiskFileItem fileItem = new DiskFileItem("file", "text/plain", false, file.getName(), (int) file.length() , file.getParentFile()); ...

2020-02-20 16:18:04 885

原创 java8中map排序问题及方法使用

Map<String, List<String>> itemId2userIds = Maps.newHashMap();List<String> sortItemIds = itemId2userIds.entrySet().stream().sorted(Comparator.comparingInt(s -> s.getValue().size(...

2019-12-29 23:51:28 743

原创 postman请求传参为Boolean布尔值

今天使用postman调用接口时,传参为Boolean时遇到了问题:使用传输方式:{ "flag": true, "key": "bonus_gray", "secret": ".."}方法:public String markSwitch(Boolean flag, String key, String secret) {...}报错信息:java.lang.Runtime...

2019-12-04 11:12:28 10024

原创 linux 常用命令

目录:cd:变换目录pwd:显示目前的目录mkdir:创建一个新的目录rmdir:删除一个空的目录. : 代表此层目录… : 代表上一层目录– : 代表前一个工作目录~ : 代表『目前使用者身份』所在的家目录~account : 代表 account 这个使用者的家目录(account是个帐号名称)文件查看:cat 由第一行...

2019-11-30 23:13:27 181

原创 spring线程池ThreadPoolTaskExecutor

概述多线程编程时,频繁的创建线程和销毁进程会降低系统运行的效率,也不好控制容易出错,所以线程池产生,ThreadPoolTaskExecutor是spring中的线程池技术,它主要是使用jdk中的ThreadPoolExecutor进行实现。通常使用线程池是为了提高系统效率和吞吐量,做一些异步操作ThreadPoolExecutor的构造方法public ThreadPoolExecutor...

2019-10-16 18:45:04 534 1

原创 sql 相关问题记录

本篇博客主要记录平时写代码过程中的sql语句或者碰到的问题insert重复键问题有三种方法:INSERT IGNORE INTO: 如果有条目匹配unique key或primary key,忽略不插入注意点:如果出现问题,MySQL将不会显示任何错误,因此无法处理错误,自动增量键仍会增加。INSERT REPLACE INTO:替换条目,如果有条目匹配unique key或prima...

2019-09-19 17:50:37 253

原创 n叉树的遍历

前序遍历: 先遍历根节点 再遍历根节点1,3,5,6,2,4后序遍历: 先遍历根节点 再遍历子节点5,6,3,2,4,1java递归遍历方法private void preorder(Node root) { if (root == null) return; // 此处前序遍历 for (Node node : root.children) { ...

2019-08-29 16:56:08 189

原创 redisTemplate常用方法记录

我们平时使用redis有以下几种用途:缓存 public void set(String key, Object object, int expireSecond) { ValueOperations<String, Object> ops = redisTemplate.opsForValue(); ops.set(key, object, expir...

2019-08-21 20:51:47 287

原创 java8 stream 记录

常用方法filter(T -> boolean) 保留 boolean 为 true 的元素distinct() 去重sorted(Comparator.comparing()) / sorted((T, T) -> int) 排序map(T -> R) 将流中的每一个元素 T 映射为 R(类似类型转换)limit(long n) 返回前 n 个元素skip...

2019-07-25 20:06:02 246

原创 grafana

简介Grafana是一个功能齐全的度量仪表盘和图形编辑器工具,他一般是和一些时序数据库进行配合来展示数据。mac下用brew安装brew updatebrew install grafana安装完成后运行grafana,默认端口3000// startbrew services start grafana// stopbrew services stop grafana然后就可...

2019-07-03 17:30:48 962

原创 二叉搜索树出现最多的数

二叉搜索树它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树中序遍历中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回,否则:(1)中序遍历左子树(2)访问根结点(3)中序遍历右子树中序遍历结果...

2019-06-28 16:03:54 425

原创 mac 安装redis

安装brew进入 https://brew.sh/ 官网, 按照官网上面命令。等待安装好之后用brew命令安装redisbrew install redis安装成功配置文件路径: /usr/local/etc/redis.conf在这里插入图片描述...

2019-06-27 13:39:29 184

原创 二进制相关总结

原码、反码、补码原码, 反码, 补码的基础概念和计算方法.在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:[+1]原 = 0000 0001[-1]原 ...

2019-06-17 17:50:25 318

原创 lombok总结

原理Lombok支持JSR 269 Pluggable Annotation Processing API,Javac从Java6开始支持“JSR 269 API”规范,只要程序实现了该API,就能在Javac运行的时候得到调用1. javac对源代码进行分析,生成了一棵抽象语法树(AST)2. 运行过程中调用实现了“JSR 269 API”的Lombok程序3. 此时Lombok就对第一...

2019-05-27 21:02:48 195

原创 spring cloud 之 feign

什么是feign?Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API。为什么要使用feign?原先调用API会产生很多硬编码,在业务繁杂时显得非常冗余。所以,我们可以用更优雅的Feign来实现这个功能。如何使用?首先添加maven配置 <...

2019-05-18 17:55:26 375

原创 拦截器(Interceptor)和过滤器(Filter)

Interceptor简介:它依赖于web框架,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,动态代理就是拦截器的简单实现在SpringMVC中使用它可以实现HandlerInterceptor接口public interface HandlerInterceptor { default ...

2019-04-30 11:53:14 502

原创 安装tomcat配置并运行spring MVC项目

首先,上官网下载tomcathttp://tomcat.apache.org/找到相应版本下载并解压,此处我选择win64系统下的解压完成后,配置环境变量,注意要已经配置过JAVA_HOME点击bin目录下的start.bat此时运行 localhost:8080,就能看见,代表配置成功此时进入idea,在项目中添加tomcat配置,并选择war包点击运行,大功告成...

2019-04-21 14:49:11 2677

原创 Springboot集成Swagger

作用swagger是为了方便进行测试后台的restful形式的接口,实现动态的更新,当我们在后台的接口修改了后,swagger可以实现自动的更新,而不需要人为的维护这个接口进行测试。步骤先添加pom配置 <dependency> <groupId>io.springfox</groupId> <ar...

2019-04-18 11:38:26 129

原创 IntelliJ idea 好用插件

记录一下平时用IntelliJ idea 开发有用到的插件JRebel for IntelliJ热部署插件,只要不是修改了项目的配置文件,用它都可以实现热部署.ignoregit提交时过滤掉不需要提交的文件activate-power-mode装逼神器,打字会有特效Alibaba Java Coding Guidelines阿里编码规约,提高代码质量Free Mybati...

2019-04-02 17:23:59 216

原创 设计模式-单例模式

介绍,适用场景在Java开发过程中,有时候需要保证一个类仅有一个实例,并提供一个访问它的全局访问点。比如在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生。优点对于频繁使用的对象,可以省略创建对象所花费的时间由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻...

2019-03-23 22:27:02 125

空空如也

空空如也

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

TA关注的人

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