- 博客(92)
- 收藏
- 关注

原创 关于提高复杂业务逻辑代码可读性的思考
实际工作中大部分时间都是在写业务逻辑,一般都是三层架构,表示层(Controller)接收客户端请求,并对入参做检验,业务逻辑层(Service)负责处理业务逻辑,一般开发都是在这一层中写具体的业务逻辑。数据访问层(Dao)是直接和数据库交互的,用于查数据给业务逻辑层,或者是将业务逻辑层处理后的数据写入数据库。简单的增删改查接口不用多说,基本上写好一部分,剩下的都是复制粘贴然后稍微修改一下就行了,有些甚至可以用工具来直接生成。
2024-04-11 00:53:36
2734
原创 使用 telnet 连接 dubbo 服务调用暴露的 dubbo 接口
工作中的微服务项目远程调用使用的技术是 dubbo,当对外提供了一个 duboo 接口时,无论是开发阶段自测,还是上线了服务出问题需要排查,都需要自己去手动调用 dubbo 接口。在开发阶段自己调用,很多时候就本地写个测试接口,然后使用 @DubboReference 注入依赖测试,测完的测试接口代码不提交即可。这种方法对于线上的dubbo接口就行不通了,对于线上的 dubbo 接口,工作中则是用来连接 dubbo 服务,然后通过命令行来直接调用接口,这样来验证接口是否正常运行。
2024-10-27 12:00:00
1311
3
原创 Spring 集成 Dubbo 启动容器报【Injection of @DubboReference dependencies is failed】错误
工作中的项目远程调用技术使用的是 dubbo,在一次需求中,在自己负责的模块中提供了一个 dubbo 接口给其他模块调用,在提测前需要自测一下接口是否能够调通,功能是否正常。所以在本地自测时,就是简单写了一个测试接口,然后使用 @DubboReference 来注入依赖,启动服务后本地调一下测试接口,看看是否能正常执行就完事了。然而启动容器却失败了,报【
2024-10-27 09:00:00
587
原创 Java 使用 aspose-cells 转 Excel 为 PDF 丢失表格线,列过多分页,单元格内容显示不全问题
工作中遇到一个需求,需要实现 excel 文件的预览,实现的思路就是将 excel 转成 pdf 文件,上传到文件服务器上得到文件地址,预览时只需要返回 pdf 预览文件地址即可。所以主要的问题就是如何将 excel 转为 pdf,调研了相关的技术,最简单的就是使用 aspose 类库,直接一个api调用就搞定了。但是直接这么使用会出现转换后的 pdf 文件单元格没有表格线,表格列过多会自动分页,单元格内容过多时,在 pdf 的单元格里内容显示不全情况。
2024-10-24 23:05:11
1863
原创 Java 基于 poi 和 itextpdf 实现 excel 转 pdf
工作中遇到一个需求,需要实现 excel 文件的预览,实现的思路就是将 excel 转成 pdf 文件,上传到文件服务器上得到文件地址,预览时只需要返回 pdf 预览文件地址即可。所以主要的问题就是如何将 excel 转为 pdf,调研了相关的技术,最简单的就是使用 aspose 类库,直接一个api调用就搞定了。但是 aspose 并不是免费的,虽然网上有破解,但是为了规避版权风险,最好还是不用了。可以使用 itextpdf 来平替 aspose 实现 excel 文件转换。
2024-10-24 10:31:34
1805
4
原创 Spring Boot 依赖注入为 null 问题
可以看到它实现了 SmartInstantiationAwareBeanPostProcessor 接口,BeanPostProcessor 接口,就是用于 Spring 创建实例后做后置处理的,这里就是用来创建 AOP 代理对象。Spring 容器在实例化bean后,就会通过 postProcessAfterInitialization 来做 bean 的后置处理。
2024-10-22 09:44:50
1804
原创 Java 使用枚举类定义系统异常(提高可读性,可维护性)
工作中开发业务系统,百分之二十的代码用来跑通主要业务流程,百分之八十的代码用来做异常处理。当然这是比较夸张的说法,不过在程序开发中,异常处理是避免不了的,做好异常处理才能够保证程序的健壮性。
2024-10-22 07:03:04
670
原创 Spring Boot 配置文件(yml、properties | bootstrap、application)加载顺序
Spring 使用”约定大于配置“思想,简化了开发过程,提高了开发效率。不过只是简化了配置项,并不是完全不需要配置文件了,所以在实际开发中也需要根据实际情况,进行一些额外的配置来满足特定的需求。在实际项目中,可能会看到各种各样的配置文件:要想知道写在配置文件里的配置项是否生效,就需要了解 Spring 框架是否会加载该配置文件,以及配置文件的加载顺序。
2024-10-21 10:07:46
2035
原创 Javascript 脚本查找B站限时免费番剧
B站的一些番剧时不时会“限时免费”,白嫖党最爱,主打一个又占到便宜的快乐。但是在番剧索引里却没有搜索选项可以直接检索“限时免费”的番剧,只能自己一页一页的翻去查看,非常麻烦。自己找限免番剧这个流程可以概括为:翻页-查找“限时免费”的番剧,重复直至遍历整个番剧索引,这个工作简单重复,意味着就可以用脚本来完成。
2024-10-21 06:30:41
1226
原创 Spring Boot 基于 Mockito 单元测试
在网上刷到过“水货程序员”相关的帖子,列举了一些水货程序员的特征,其中一条就是不写单元测试,或者不知道单元测试是啥。看得瑟瑟发抖,完全不敢说话。在小公司里当开发,对单元测试根本没有要求,测试也就是本地启动服务,自己调下接口看看是否调通,以及和前端本地联调。毕业后入行以来都没写过,想写也不知道该怎么做。自己想摆脱“水货程序员”标签去写单元测试,也只是照着网上博客,本地写一写,不知道写得是否规范,所以从没提交过单元测试代码。后面跳槽,项目有要求写单元测试了,这就有能够参考的单元测试代码了。
2024-09-29 21:44:18
1611
原创 MySQL 使用 mysqldump 备份数据库
工作中曾经遇到过一个线上的问题:凌晨12点后,公司系统几乎所有的业务都无法正常响应,接口都阻塞住了,而在白天就是正常。由于公司的产品是面向小企业的,主要的用户是各个小企业的员工,下班后基本没人会使用,所以也是被偶然发现,就反馈到了开发这里。
2024-09-29 08:00:00
1372
原创 IDEA 通义灵码 插件使用体验
自从 AI 技术开始大规模应用,老板就想让下面的牛马借助 AI 工具来提高编码效率,由于团队都没有在实际编码中深度使用过 AI 工具,所以专门调研了市面上比较出名的 AI 辅助写代码工具,实际尝试使用的有两个,一个是微软的 copilot,另一个是阿里的通义灵码。总所周知的原因,国内使用 copilot 比较麻烦,所以最后在实践中还是使用了阿里的通义灵码,idea中直接安装插件,使用支付宝账号直接登录就能免费使用了。以下是对通义灵码的使用体验。
2024-09-12 12:15:00
3691
原创 Windows 安装 ZooKeeper 以及 IDEA 安装 zoolytic 连接工具
在前公司做微服务开发时,使用的都是 Spring Cloud 的生态,服务的注册与发现中心用的 Eureka,也有使用 Nacos 的,远程调用则是用的 OpenFeign,换工作后,新公司的微服务技术栈有了些许改变,服务的注册与发现中心用的是 ZooKeeper,远程调用则是用的 Dubbo。为了自己本地开发方便,故直接在本地安装 ZooKeeper 服务自己使用,IDEA 也安装一个 ZooKeeper 连接工具插件 zoolytic,方便开发时查看。
2024-09-12 08:00:00
1435
原创 Windows 安装 MySQL8
一般数据库都是部署在 Linux 服务器上,在 Windows 上开发,通过数据库连接工具来连接数据库。在工作中,如果条件允许,会有单独的开发库给开发人员使用,否则开发人员就只能连接自己本地的数据库服务了,可以使用虚拟机来模拟服务器,但是工作中公司分配的电脑内存一般也就是16G,平时多启动几个工程内存就快不够了,为了启动个数据库服务还得专门去启动一个虚拟机实在是有点浪费内存。所以不如直接在 Windows 上安装数据库服务,Windows 安装服务,都是可视化界面操作,安装起来特别简单方便。
2024-09-03 00:15:00
511
原创 Spring Boot 同一个方法中操作多个数据源保证事务一致性
工作中开发过多数据源的系统,比如资产清查系统,数据的存储分成了两个库,一个当前库和归档库,系统就需要配置两个数据源来满足业务需求。在常规的业务场景下,对两个库的业务操作是分开的,井水不犯河水。但是有一个功能实现是个例外,就是归档。将当前库的数据进行归档,需要修改当前库数据的状态,并将当前库数据插入到归档库中,这就需要在同一个方法实现中同时操作两个数据源,直接使用声明式事务@Transcation注解是无法保证两个事务的一致性的。
2024-09-02 08:00:00
2739
原创 Spring Boot 多数据源配置(JPA)
一般一个系统至少有一个数据源,用来持久化业务数据以及查询。单个数据源的系统很常见,在 Spring Boot 框架下配置也很简单。在约定大于配置这个思想下,只需要在配置文件中简单配置下数据库连接信息就行了。除了单数据源系统,在实际工作中,还会遇到多数据源系统。
2024-09-02 00:15:00
2582
1
原创 基于本地消息表实现分布式事务(最终一致性)
传统单体架构下,所有的功能模块都在一个应用下,所有的代码和业务逻辑都在同一个应用下实现,所以保证数据的一致性就很简单,保证相关操作都在同一个本地事务下就可以了。但是在微服务架构下,将一个应用拆分成了多个独立的服务,每个服务都能有自己的数据库,服务间通信都是通过远程调用实现,实现一个功能可能需要由几个不同的服务来共同实现。这就会带来一个问题,不同的服务之间无法做到使用同一个事务,这就无法保证数据的一致性了。
2024-08-07 23:13:01
1741
原创 基于 Redis 的分布式锁 Spring Boot 集成 Redisson 使用分布式锁确保对共享资源的互斥访问
工作中开发过一个上传文件的接口,每个区县都有自己的资源压缩包需要上传到系统,系统接收到压缩包后,需要解压,提取出里面的文件保存到文件服务器中,解析里面的SQLITE文件得到数据保存到数据库中。由于处理的过程会比较耗时,所以使用了异步处理的方式来优化用户体验,接口接收到文件后快速响应,返回上传成功,异步线程在后台继续执行解析压缩包业务逻辑。为了防止在异步线程处理期间,用户再次上传压缩包,从而导致上传资源数据不一致问题,在异步线程处理期间要获取锁来保证上传资源数据一致。
2024-08-07 00:24:21
1164
1
原创 基于 Redis 的分布式信号量 Spring Boot 集成 Redisson 使用 Semaphore 控制并发访问数量
工作中开发过一个服务,这里记作A服务,主要功能是配置,部署以及调用云函数。其中配置云函数的功能里,有一个配置项是并发数,意思是同一时间最多能有多少个请求调用已部署的云函数。客户端通过调用A服务,再由A服务去调用云函数,从而实现客户端请求云函数的功能。在调用云函数时,是要根据配置的并发数控制请求的数量。如果时单机架构的话,直接使用JDK中的 Semaphore 就能够实现并发线程控制了。但是项目的架构是微服务架构,所以需要使用分布式信号量才行。
2024-08-06 09:00:00
1212
原创 CentOS7 VMware虚拟机基于NAT配置网络IP
平时学习时一直需要用到Linux服务器,一般都是在Windows上安装VMware来创建一个虚拟机。创建的虚拟机需要配置网络才能够访问外网,可以通过以下两种方式来配置虚拟机网络使用桥接模式要保证虚拟机的网卡和物理机能上外网网卡的网段保持一致,如果物理机的上网网段经常变化,显然桥接模式就很不合适。所以这里使用 NAT 模式,物理机和虚拟机之间的通信是通过在物理机上生成的VMware Network Adapter VMnet8虚拟网卡和虚拟机的虚拟网卡进行连接通信。
2024-08-05 18:10:58
840
原创 CPU飙高问题排查思路
工作中时不时会被指派去排查线上问题,线上问题大致分成两种:一种是业务bug相关的,这种实际上没啥好讲的,无非就是程序运行结果不符合业务,一般都是看下相关日志,获取相关入参,在本地复现bug后修复即可。另一种则是排查程序是否能稳定运行,即在程序能完成预期的功能前提下,保证程序能够有较快的响应速度,不会出现明显的卡顿以及延迟。一般出现延迟或者卡顿的情况,服务器CPU使用率通常都会异常飙高。所以问题也就转换成了排查CPU为何飙高,以及应该如何解决。
2024-08-05 02:41:45
1142
原创 多租户系统数据隔离方案
多租户系统是一种将多个客户的数据和应用程序分开的系统,每个客户被视为一个独立的租户,互不干扰。实现多租户系统的关键之一是确保数据的隔离。之前公司的产品是一个多租户的SAAS平台,是一个面向企业办公的平台,每个企业其实就相当于一个租户。实际使用中采用可 数据行+数据表 混合的数据隔离方案,大多数业务场景中是数据行级别,即所有的数据都在同一张表下,用租户ID来区分。少部分业务场景则是数据表级别,每个租户都有自己的数据表,表名使用租户ID做后缀区分。
2024-08-04 22:04:36
1339
4
原创 Spring Boot 动态数据源
大多数系统中,都需要数据库来持久化数据,在大多数情况下,一个系统只需要配置一个数据源便能够完成所有业务的查询,保存操作。也存在一个系统需要多个数据源的情况,不同的数据源对应不同的业务操作,这种场景下配置多个数据源,并且在代码中维护多套dao层就可以了。还存在一种业务场景,所有的业务操作都是一样的,只有操作的数据源的不同,如果用多套dao层来实现,由于业务操作都一样,会出现多块一模一样的代码,这样的冗余代码是我们不希望看到,不利于维护。这种业务场景就很适合用动态数据源来实现。
2024-08-01 22:38:36
1345
原创 Spring Boot 使用 Spring AI 构建知识库服务
做 AI 大模型技术调研时,参考的开源项目 Maxkb,它基于大模型做了一个的应用,用户可构建自己的知识库,创建自己的应用然后关联知识库,这样可以基于知识库里的内容让大模型的回答更加符合我们地预期。虽然 Maxkb 是使用 Python 写的,不过参考它用到的相关模型和数据库,可以用 Spring Boot 来构建一个自己的知识库服务。Spring Boot 也提供了 AI 相关的库,这使得接入 AI 大模型能力也十分方便。以下是使用Spring Boot 构建一个知识库的样例。
2024-08-01 01:01:31
3903
20
原创 Windows 安装 PostgreSQL 并安装 vector 扩展
调研大模型时,了解到一些大模型的应用,其中一个就是知识库,用户可以上传文档到知识库中,系统解析文档并将内容向量化保存起来,以便在和模型交互时使用。在和大模型对话时,可以先向量化检索自己的知识库,如果命中,则返回文档内容,然后将文档内容作为大模型的输入,以便让大模型回答得更加符合我们的预期。这里就涉及到了向量化数据的存储,可以为 PostgreSQL 安装 vector 扩展来存储向量化数据。记录 Windows 安装 PostgreSQL 以及 vector 扩展的步骤。
2024-07-26 13:59:54
8062
8
原创 Ollama 部署本地大模型
工作需要,被指派对大模型做技术调研,又不想花钱买各大产商的key,所以就考虑部署本地的大模型,了解到 Ollama 开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。便在自己电脑上安装了,记录下安装以及使用过程。
2024-07-26 10:48:13
1478
原创 数据库窗口函数实战
SQL 具有很高的灵活性,可以根据需求进行复杂的数据查询和分析,支持多表联合查询(join)、排序(order by)、分组(group by)、聚合(sum)等操作。虽然以上这些操作已经能解决绝大多的查询问题了,但是还是存在一些较为特殊的场景没法很好地处理。
2024-07-25 22:26:04
1158
原创 数据库表的行列转换(行转列,列转行)
在工作中,多多少少都会遇到一些数据展示的需求,开发一个接口,从数据库中查询数据返回页面展示。表结构是死的,但是查询需求却是非常灵活的。很多时候不是简单的直接从表中直接 select 获取数据就能够直接返回给页面,需要将一些判断,聚合逻辑交给 SQL 来做,才能够得到查询需求中的字段和数据。其中就可能会涉及到一些表行列的转换。以下用两个案例分别演示下行转列与列转行的业务场景,并给出通用的SQL写法。
2024-07-25 01:11:38
1585
1
原创 MySQL的查询优化思路
一般的系统中,数据库往往都是性能瓶颈。在一个系统中,数据库被使用的频率很高,因为几乎所有的应用程序都需要与数据库交互来读取或写入数据。所以一旦数据库的响应慢,负载突增,则会大大影响系统的运行效率,严重点甚至可能直接崩溃。面对数据库响应变慢,负载突增问题,应该及时处理,以下是处理的思路,依次考虑。
2024-07-23 08:53:43
862
原创 数据库分表实践
如果单表的数据量过大,则会影响查询效率。想要解决这个问题,显然,直接拆分就完事了。一张表的数据量过多,那么进行分表,将数据分散到多张表中,每张表中的数据自然就不多了,问题就迎刃而解了。针对单表数据量大的情况,分库分表就是一个通用的解决方案。
2024-07-23 00:08:40
939
原创 引入缓存带来的问题以及解决方案
在提升接口性能的方案中,毫无疑问,使用缓存是最有效果的,但同时也会带来新的问题。以上问题都是引入缓存需要考虑的,在设计时就需要做好相应的解决措施。
2024-07-22 11:14:58
1060
原创 接口性能优化思路
日常开发中设计接口,响应时间是衡量一个接口质量的重要指标。一般接口都是需要快速响应的,在不考虑任何优化策略的情况下,如果整个业务逻辑走下来,响应时间大于了2秒,那么就应该考虑对这个接口进行性能优化了,以免影响了用户的体验。
2024-07-22 02:34:10
2114
原创 PlantUML 实战示例(使用 PlantUML 画用例图、类图、活动图、时序图)
PlantUML 实战示例(使用 PlantUML 画用例图、类图、活动图、时序图)
2024-04-11 15:13:40
5080
原创 Java 解决 Process 执行命令行命令报【CreateProcess error=2, 系统找不到指定的文件。】错误问题
使用 Process 执行命令行命令时,报CreateProcess error=2, 系统找不到指定的文件。但明明指定的文件是存在的。
2024-04-08 14:22:17
6529
1
原创 Windows(Win11) 安装 Docker (Docker Desktop)
一般 docker 都是直接安装在 Linux 服务器上,用来快速部署一些中间件(比如 redis,rocketmq等等),省去繁琐的安装以及配置过程。很少有在 window 上跑 docker 的情况,不过总有意想不到的情况,在使用 Fn Project 进行部署云函数时,需要构建 docker 镜像,而开发程序时又是在 Windows 上开发的,想要在本地调试代码,就必须为 Windows 安装 docker 了。本文演示 Windows 安装 docker 的基本步骤。
2024-04-08 01:43:09
2355
2
原创 Linux(CentOS7)安装 Docker 以及 Docker 基本使用教程
Linux(CentOS7)安装 Docker 以及 Docker 基本使用教程
2024-04-07 23:30:08
1153
原创 使用 Apipost 管理项目接口文档
在 web 后端开发中,开发接口之前通常需要先写接口文档,然后前后端再根据接口文档开始开发系统模块。接口文档形式多种多样,有使用共享文档的(wps共享文档),也有使用第三方接口管理平台的(比如yapi)等等。写完接口文档后并且开发完后,就需要对接口进行自测,一般使用 postman 来调试请求接口,这时候就需要在 postman 中创建接口文档中定义的接口,输入对应的各种入参,然后请求调试。上面的开发过程中,接口文档和调试实际上是分离的。
2024-04-06 00:09:56
1397
原创 Linux(CentOS7)部署 y-api 接口管理平台
前后端分离时代,前后端通过接口文档来协作开发项目。一般开发过程中,由后端先编写接口文档,然后交付给前端,这时候前后端都根据这个编写的接口文档来进行开发。在没有一个统一的接口管理平台下,仅用一个文档作为前后端团队协作的媒介,一旦出现需求变更或者开发过程发现接口设计不合理需要重新调整,就需要改动接口文档,每次改动需要重新发一个文档给前端,改动次数越多,就会造成文档越混乱,同时也会出现前端对着旧版的接口文档开发的情况。
2024-04-05 21:24:33
1657
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人