自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ByteX的博客

这是我的记事本~

  • 博客(152)
  • 资源 (3)
  • 收藏
  • 关注

原创 DDD学习第8课回顾与演进

本课程作为DDD战略设计的总结,系统讲解了从单体架构到微服务的演进路径。核心内容包括:1)通过上下文地图(Context Map)分析系统间关系,包括客户-供应商、从属者等模式;2)反腐层(ACL)的设计方法,防止外部系统污染领域模型;3)五阶段演进路线:单体→模块化→微服务→事件驱动→领域平台化。课程强调DDD适用于业务复杂、高并发的企业级系统,能够实现团队结构与系统架构的对齐。学习者将掌握领域驱动设计的完整知识体系,包括战略建模和战术建模的核心模式。

2026-01-07 18:45:00 679

原创 DDD学习第7课CQRS与查询模型

CQRS(命令查询职责分离)的核心在于将读写操作完全分离,采用不同模型和架构。关键点包括:1)读写模型独立设计,写侧使用领域聚合保证业务规则,读侧优化查询性能;2)允许读模型冗余和去规范化,以空间换性能;3)通过事件驱动机制实现最终一致性,而非强一致性;4)根据业务复杂度选择实现层级,从简单Controller分离到独立读库。CQRS能有效解决读写需求差异带来的性能问题,但需要接受读模型的延迟更新特性。

2026-01-07 18:30:00 747

原创 DDD学习第6课领域事件

本文介绍了领域事件(Domain Event)的概念与实现方法。领域事件是领域内发生的、对业务有意义且其他模块可能关心的事件。课程目标包括:1) 在领域层定义事件模型(如OrderPaidEvent、OrderCompletedEvent);2) 定义统一的事件发布接口DomainEventPublisher,并在基础设施层用Spring实现;3) 在应用服务中发布事件;4) 编写事件监听器执行业务逻辑。文章详细展示了事件模型定义、发布接口设计、Spring实现以及在订单服务中的具体应用,强调领域层与框架解

2026-01-06 18:45:00 952

原创 DDD学习第5课应用层与领域服务

本文介绍了应用层与领域服务的职责划分及实践方法。通过重构订单系统示例,展示了如何将业务逻辑从应用层抽离为独立的领域服务:1) PricingService处理折扣计算等定价规则;2) InventoryService负责库存校验。改造后的OrderLifecycleService仅负责流程编排,不再包含具体业务逻辑,使代码结构更清晰、职责更明确。文章还对比了应用层(用例协调)与领域层(业务规则实现)的核心差异,帮助开发者理解分层架构的设计原则。这种解耦方式能有效避免循环依赖,提升系统的可维护性和扩展性。

2026-01-06 18:30:00 328

原创 DDD学习第4课仓储与持久化隔离(使用数据库)

本课介绍了仓储模式在DDD中的核心作用,通过Spring Data JPA实现订单聚合的持久化隔离。主要内容包括:1)仓储作为领域层与持久化层的分界线,接口定义在领域层,实现在基础设施层;2)使用独立实体(OrderEntity)进行持久化,避免污染领域模型;3)通过JPA实现订单与订单项的数据库存储,并完成领域对象与持久化对象的双向转换。课程强调保持领域层纯净,不依赖具体框架,通过分层架构实现业务逻辑与数据访问的解耦。

2026-01-05 18:45:00 1039

原创 DDD学习第3课设计聚合与聚合根

DDD聚合设计关键点总结 本文系统阐述了DDD中聚合与聚合根的设计原则和实践方法。核心内容包括: 聚合定义:聚合是保持业务强一致性的边界,聚合根是唯一修改入口 设计原则: 事务范围=聚合边界 聚合间通过ID协作 业务规则封装在聚合根 不变量在聚合内维护 关键判断: 区分实体(有ID)与值对象(不可变) 正确划分聚合边界 避免跨聚合事务 实践示例:以订单系统为例,展示Order和Menu两个聚合的设计实现,包括代码结构、状态管理和业务规则封装方式。 聚合设计是DDD战术建模中最关键也最具挑战性的部分,直接影响

2026-01-05 18:30:00 1018

原创 DDD学习第2课建立领域模型

本文介绍了如何建立领域模型,重点讲解了订单系统的实体(Order)和值对象(OrderStatus、Money、OrderItem)的设计。课程目标包括:从业务出发完善模型、加入订单状态和业务规则、强化领域逻辑在实体内部完成。通过定义订单状态(CREATED、PAID等)和状态转移规则,将业务逻辑封装在Order实体中,确保状态转换的合法性。同时实现了金额运算、状态检查等核心业务逻辑,使应用层仅负责用例编排。代码示例展示了Order、OrderStatus等关键类的实现,体现了领域驱动设计中"领域

2026-01-04 18:45:00 277

原创 DDD学习第1课项目介绍与DDD分层

摘要:DDD在订餐系统中的应用 本文介绍了领域驱动设计(DDD)在订餐系统中的实践方案。传统CRUD开发方式容易导致业务逻辑分散,而DDD通过建立统一语言、划分限界上下文(如Order BC)和分层架构(应用层、领域层等)来解决这一问题。课程聚焦订单上下文,涵盖聚合根、仓储模式、领域事件等核心概念,采用Spring Boot技术栈实现。项目结构严格遵循DDD分层原则,确保业务逻辑集中且可维护。通过8次课程的系统学习,开发者将掌握如何构建符合业务领域的复杂系统。

2026-01-04 18:30:00 776

原创 Java8-Function创建对象替代Builder

本文介绍了两种Builder模式的实现方式:静态内部类Builder和基于Function的Builder。静态内部类方式通过定义Builder内部类实现链式调用,具有类型安全、可读性高等优点,但会增加代码量。基于Function的方式利用函数式接口封装setter逻辑,支持Lambda表达式,更加灵活简洁。两种方式都适用于构建复杂对象,前者更适合传统场景,后者则更具函数式编程优势。文章通过User类的具体代码示例展示了两种实现方式,并分析了各自的优缺点。

2025-12-18 18:15:00 558

原创 feign调用超时问题排查

生产环境出现Feign调用超时异常,SpringBoot 1.5.9版本下调用xxx-soa服务的apply/add接口时发生SocketTimeoutException。错误日志显示请求处理失败,主要原因是Feign客户端在执行POST请求时读取超时(Read timed out)。堆栈跟踪表明问题发生在HTTP协议层,涉及Apache HttpClient、Feign负载均衡及重试机制的处理流程。该异常可能由网络延迟、服务端响应过慢或客户端超时设置不当导致,需进一步排查相关配置和网络状况。

2025-12-10 18:15:00 256

原创 k8s系列之十七 资源指标API及自定义指标API

摘要: 本文介绍了Kubernetes资源监控系统的部署配置方法。主要内容包括: Metrics-Server的安装与配置 详细说明了版本兼容性问题(K8s 1.18需使用v0.5.2版本) 提供了镜像替换和证书问题的解决方案 验证了top命令查看节点和Pod资源使用情况 Prometheus监控系统的引入 解释了Prometheus作为更全面的监控方案的优势 展示了系统架构图和工作原理 提供了kube-prometheus 0.6.0版本的下载和解压步骤 问题排查过程 记录了metrics-server部

2025-12-03 18:15:00 709

原创 springboot 项目某个接口响应特别慢排查

问题摘要:接口日志显示耗时仅几十毫秒,但Postman实测耗时7秒多。通过arthas trace命令定位到耗时在CglibAopProxy拦截器调用。进一步排查发现是ControllerInterceptor中参数脱敏方法SensitiveInfoSerialize.getJson()对基本数据类型进行了不必要的递归处理,导致性能问题。该问题提醒开发者在使用递归时需特别注意退出条件,避免处理不必要的数据类型,否则会导致性能严重下降甚至栈溢出。

2025-12-02 18:15:00 192

原创 一致性哈希分表法

一致性哈希是一种分布式哈希算法,通过将数据和节点映射到虚拟哈希环上,实现分库分表时的数据均匀分布和动态扩缩容。其核心优势在于节点变更时仅需迁移少量数据,通过虚拟节点技术解决数据倾斜问题。实现步骤包括:设计哈希环、计算节点和数据哈希值、数据路由及处理节点变更。文末提供了两种Java实现方案,基础版使用固定128位环长,优化版通过计算最小环长实现动态配置,支持修改表数量(如16或64张表)并自动调整环长。优化版还包含哈希算法改进和环长动态计算功能,使数据分布更均匀。

2025-11-24 18:30:00 1496

原创 算法练习-成功之后不许掉队

摘要:本文实现了一个任务重跑判断算法,通过扫描任务状态序列,在遇到第一个非成功状态(0/2/4)后,后续所有成功状态(3)都需要重跑。算法采用"红绿灯"思想,使用两个变量(metFail标记是否遇到非成功状态,first记录目标下标)在一次遍历中完成判断,时间复杂度O(n)。取消状态(1)的任务会被跳过,不影响判断逻辑。最终返回第一个需要重跑的任务下标,若无则返回-1。 核心实现:当遇到非成功状态后标记红灯状态,后续遇到的第一个成功状态即为重跑起点;若全程未遇红灯,则返回第一个非成功状态

2025-11-13 20:00:00 516

原创 职场成长语录

【职场思维与成长路径】摘要: 职场成功的关键在于转变思维方式:1.站在上级角度思考工作价值,建立信任关系;2.跳出"打工思维",培养可复制的核心能力;3.把握底层逻辑比追求技术深度更重要。真正的成长路径包含:建立闭环反馈机制、理解进度-质量-成本三角关系、培养向上管理能力,以及突破线性思维局限。程序员应认识到代码与创作同理,具备边际成本递减特性,转变单一技术崇拜思维,从执行者成长为价值创造者。(149字)

2025-10-23 18:15:00 415

原创 RestTemplate动态修改请求的url

摘要:本文介绍了如何通过自定义ClientHttpRequestInterceptor实现动态修改RestTemplate请求URL。通过创建DynamicUrlInterceptor拦截器,在请求发送前替换服务名为指定IP地址。配置类RestTemplateConfig设置了连接池参数,并注册该拦截器到RestTemplate实例中。方案采用HttpClient连接池管理,包含超时设置、最大连接数等配置,并定时清理空闲连接。该实现适用于研发环境需要直接连接特定服务的场景,通过拦截器机制灵活修改请求目标地址

2025-07-11 19:00:00 339

原创 MySQL 分页查询Limit数量不满足时导致查询变慢

MySQL查询性能问题的分析摘要:SQL语句在不满足limit数量时,会查询很慢

2025-06-27 18:30:00 750

原创 算法攻略-数组

数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)。数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)。在处理数组和链表相关问题时,双指针技巧是经常用到的,双指针技巧主要分为两类:左右指针和快慢指针。

2025-04-07 18:30:00 682

原创 java使用word模板填充内容,再生成pdf

pom依赖可以参考https://blog.csdn.net/u011067966/article/details/134293480#comments_36351020。结合起来就能生成相对完整的word了。后续如果需要盖章什么的直接拿生成的pdf文件就可以了。现在介绍的是基于jodconverter把word转换为PDF。在处理类中注入,之所以使用@Lazy是因为加载的使用会报错,让它延迟加载。word生成pdf的方法比较多,调研了常用的方式。之前写过word模板生成段落和生成表格的段落。

2025-02-26 21:30:00 841

原创 Java 非递归创建树构代码

【代码】Java 创建父子结构代码。

2025-02-07 19:00:00 259

原创 Random模拟概率问题

随机数生成器要复用同一个实例,避免频繁初始化导致随机分布不均匀。在高并发场景下,可以考虑:使用单例模式共享 Random 实例。使用线程安全的 ThreadLocalRandom(Java 7+ 提供),避免多线程访问冲突。i < 1000;i ++) {// 10% 概率 successCount ++;} } System . out . println("触发事件的次数: " + successCount);i ++) {

2024-12-26 19:00:00 645

原创 Java8-Function的使用之读取文件

创建一个实现了 LineFilter 接口的类,用于定义具体的过滤逻辑。首先,我们需要一个 FileCloseAble 类来处理文件写入操作。定义一个 Predicate 接口,用于表示每一行的过滤逻辑。FileContext 类来存储文件的上下文信息。实现 LineFilter 接口。使用 FileHandler 类。FileHandler 类。定义一个过滤函数接口。可以愉快的读写文件啦。

2024-12-25 19:00:00 426

原创 Jvm之NativeMemoryTracking 使用

查看 Native Memory Tracking 的 detail 信息,包括 summary 信息,以及按照虚拟内存映射分组的内存使用信息,还有按照不同 CallSite 调用分组的内存使用情况。一般地,只有遇到问题的时候,我们才会考虑开启 Native Memory Tracking,并且在定位出问题后,我们想把它关闭,可以通过。通过 mmap 方式分配的内存保留为 1120MB,承诺为 108MB。通过 mmap 方式分配的内存保留为 244MB,承诺为 74MB。

2024-12-09 19:45:00 2029

原创 Jvm之内存申请和释放测试

CMS垃圾回收器,在内存开辟后,会随着System.gc()执行次数逐渐增多和回收频率逐渐拉长,从继续开辟内存到慢慢归还物理内存给操作系统,直到出现一次全部归还,就会在每次调用System.gc()都归还所有剩余的物理内存给操作系统;G1恰恰相反,G1是在JVM每次回收垃圾后,主动归还物理内存给操作系统,不做任何保留,大大降低了内存占用。

2024-12-09 19:30:00 650

原创 Go-反射

通过反射,可以动态地获取变量类型信息和值,例如使用reflect.TypeOf()可以获取变量的类型,使用reflect.ValueOf()可以获取变量的值。还可以使用Value提供的方法获取和设置变量的值、调用方法等。在Go语言中,反射(reflection)是指在运行时检查程序的结构、变量和接口的机制。可以通过反射获取和修改变量的值、获取变量的类型信息、调用方法等操作。需要注意的是,反射操作相对较慢,使用反射会带来一定的性能损失。因此,应尽量避免过度使用反射,谨慎地选择使用反射机制。

2024-08-05 21:45:00 622

原创 docker 安装orcale11数据库

介绍了如何在docker下安装Oracle11数据库

2024-07-12 20:30:00 1222

原创 Linux rpm和ssh损坏修复

我遇到的问题可能和你的不一样。但是如果遇到错误一样也可以按此方案尝试修复。我是想在Linux上安装Oracle,因为必须在离线环境下安装。就在网上搜一篇文章是一个用于在 Linux 系统上安装 RPM 包的命令。rpm-i-v-h./*--nodeps--force总的来说,这个命令用于在当前目录下批量安装所有 RPM 包,并且忽略依赖关系和可能的冲突。使用该命令时需要注意,因为--nodeps和--force选项可能导致系统不稳定或依赖关系问题,所以应谨慎使用。

2024-07-12 19:00:00 2389 4

原创 Feign Client超时时间设置不生效问题

可以在Feign Client的配置类中通过修改对象来设置超时时间。对象有两个属性,用于设置连接超时时间,用于设置读取超时时间。在上面的示例中,连接超时和读取超时时间都设置为5000毫秒。可以在Feign接口方法上使用注解的属性来指定一个配置类,然后在配置类中通过修改对象来设置超时时间。在上面的示例中,接口中的方法的超时时间被配置为5000毫秒。需要注意的是,Feign Client的超时时间设置只对请求的连接和读取阶段有效,对于响应的处理时间是无效的。

2024-06-24 21:00:00 2558

原创 多线程使用-变量共享问题

多线程使用时,有一个常见的问题是变量共享问题。在多线程环境中,多个线程可以同时访问和修改同一个变量,这时就会出现竞态条件和数据不一致的问题。在这个例子中,我们创建了一个计数器类Counter,其中有一个count变量用于记录计数值。我们启动了两个线程thread1和thread2,它们分别对计数器进行了一万次递增操作,并打印最终的计数值。然而,由于两个线程同时对count变量进行修改,会导致竞态条件的产生。

2024-06-20 19:12:07 1418

原创 算法攻略-链表

链表是一种数据结构,它由一系列的节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表中的第一个节点叫做头节点,最后一个节点叫做尾节点。链表中的节点不一定是连续存储的,它们可以在内存中的任意位置。链表的优点是插入和删除操作相对于数组来说更高效,因为只需要修改节点的指针,而无需移动其他节点。缺点是访问元素的效率相对较低,需要遍历整个链表才能找到目标元素。链表有多种类型,常见的有单链表、双链表和循环链表。

2024-06-18 19:00:00 961

原创 Rust 编程——prost-build 使用

而prost-build是Prost库的一个工具,用于生成Rust代码。Protocol Buffers是由Google开发的一种轻量级、高效的数据交换格式,可以用于结构化数据的序列化,特别适用于通信协议和数据存储等领域。prost-build工具通过读取Protobuf文件(.proto文件)并根据文件中定义的消息类型、服务等生成相应的Rust代码。时,prost-build工具会自动读取Protobuf文件并生成相应的Rust代码,并将生成的代码放置在指定的输出目录中。是生成的Rust代码的输出目录。

2024-06-05 13:56:53 1191

原创 算法攻略-滑动窗口

滑动窗口是一种常用的算法技巧,通常用于解决数组或字符串的子串或子数组的问题。它的基本思想是维护一个可变大小的窗口,通过滑动窗口来确定问题的解。滑动窗口算法的时间复杂度通常是O(N),其中N是数组或字符串的长度。它的优势在于可以在一次遍历中解决问题,而不需要使用嵌套循环。滑动窗口算法的应用非常广泛,能够解决很多实际问题,比如字符串匹配、字符串压缩、求解最长连续递增子序列等。

2024-05-30 19:30:00 1604

原创 Java8-CompletableFuture的使用

Future接口是Java并发编程中的一个接口,它表示一个可能还没有完成的异步操作的结果。Future接口的主要作用是提供一种机制,允许调用者在某个异步操作完成后取得其结果用Future 模拟同时获取 用户和勋章。

2024-04-24 20:00:00 446

原创 系统设计取舍问题

由于资源和时间的限制,不可能满足所有的需求,因此需要进行取舍。优先级:对于不同的需求,可以根据其重要性和紧急程度来确定优先级。对于低优先级的需求,可以暂时搁置或延后。成本与效益:在取舍时,需要考虑到实施某个需求所需的成本和所带来的效益。时效性:需求可能具有不同的时效性,一些需求可能会随着时间的推移而失去价值。总之,在需求设计取舍过程中,需要综合考虑多个因素,并根据优先级、成本与效益、可行性、用户反馈和时效性等进行取舍。如果用户对某个需求不满意或不需要,可以考虑将其暂时搁置或取消。

2024-04-07 19:30:00 394

原创 多数据源读库打印sql

在本地进行开发的时候,需要打印读库的sql,但是常规的配置是无法打印的,需要在读库的配置中进行设置。

2024-04-07 09:52:11 262

原创 k8s系列之十六 Istio通过kiali可视化bookinfo

kiali 是使用 istioctl 客户端工具安装 demo profile 时自动就会安装的组件,kiali 是一款 istio 服务网格可视化工具,提供了服务拓扑图、全链路跟踪、指标遥测、配置校验、健康检查等功能。

2024-03-26 23:45:00 841

原创 k8s系列之十七 Istio中的服务治理

在 Istio 中,流量路由管理是通过 DestinationRule 和 VirtualService 这两个资源来实现的。DestinationRule 用于定义服务的目标规则,例如负载均衡策略、连接池设置等。而 VirtualService 则用于定义服务的路由规则,包括如何将流量路由到不同的版本或实例。

2024-03-26 23:45:00 1495

原创 k8s系列之十五 Istio 部署Bookinfo 应用

Bookinfo 应用中的几个微服务是由不同的语言编写的。这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。该应用由四个单独的微服务构成。这个应用模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。下图展示了这个应用的端到端架构。Bookinfo 应用中的几个微服务是由不同的语言编写的。

2024-03-21 21:00:00 1708 2

原创 k8s系列之十四安装Istio

Istio 是一个开源的服务网格(Service Mesh),用于连接、管理和保护微服务。它提供了一组功能强大的工具,包括流量管理、安全性、监控和跟踪等,以帮助在微服务架构中更好地管理服务之间的通信。总的来说,Istio 提供了一种灵活且强大的方法,用于解决微服务架构中常见的网络通信、安全性和可观察性等问题。

2024-03-21 18:30:00 1609

原创 k8s系列-kubectl 命令快速参考

这些指令适用于 Kubernetes v1.29。要检查版本,请使用 kubectl version 命令。kubectl -A。

2024-03-15 18:30:00 1298

MSP430_SPI_模块

MSP430单片机特点:(1)SPI模式支持3线和4线模式;(2)支持主机与从机模式;(3)接受和发送有各自独立的发送移位寄存器和缓冲器;(4)接受和发送都有独立的中断能力;(5)移位时钟的极性和相位可编程;(6)字符长度可以是7位或者8位。 当Msp430 USART模块控制器UxCTL的位SYNC置位时,USART模块工作于同步模式,对于149即工作于SPI模式,若是169,USART0可以支持I2C,可以通过另一控制位I2C控制,I2C位0则工作于SPI。在SPI模式下,允许单片机以确定的速率发送和接收7位或8位数据。

2014-03-18

RS232通讯程序代码

RS-232C 标准(协议)的全称是 EIA-RS-232C 标准,其中EIA (Electronic Industry Association)代表美国电子工业协会,RS(recommended standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有EIARS-422A、EIA RS-423A、EIARS-485。这里只介绍EIA RS-232C(简称232,RS232)。例如,目前在IBM PC机上的COM1、COM2接口,就是RS-232C接口。

2014-04-13

前端读取excel示例.zip

前端读取excel示例

2020-07-28

空空如也

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

TA关注的人

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