自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 接口性能优化思路

日常开发中设计接口,响应时间是衡量一个接口质量的重要指标。一般接口都是需要快速响应的,在不考虑任何优化策略的情况下,如果整个业务逻辑走下来,响应时间大于了2秒,那么就应该考虑对这个接口进行性能优化了,以免影响了用户的体验。

2024-07-22 02:34:10 1571

原创 关于提高复杂业务逻辑代码可读性的思考

实际工作中大部分时间都是在写业务逻辑,一般都是三层架构,表示层(Controller)接收客户端请求,并对入参做检验,业务逻辑层(Service)负责处理业务逻辑,一般开发都是在这一层中写具体的业务逻辑。数据访问层(Dao)是直接和数据库交互的,用于查数据给业务逻辑层,或者是将业务逻辑层处理后的数据写入数据库。简单的增删改查接口不用多说,基本上写好一部分,剩下的都是复制粘贴然后稍微修改一下就行了,有些甚至可以用工具来直接生成。

2024-04-11 00:53:36 2525

原创 基于本地消息表实现分布式事务(最终一致性)

传统单体架构下,所有的功能模块都在一个应用下,所有的代码和业务逻辑都在同一个应用下实现,所以保证数据的一致性就很简单,保证相关操作都在同一个本地事务下就可以了。但是在微服务架构下,将一个应用拆分成了多个独立的服务,每个服务都能有自己的数据库,服务间通信都是通过远程调用实现,实现一个功能可能需要由几个不同的服务来共同实现。这就会带来一个问题,不同的服务之间无法做到使用同一个事务,这就无法保证数据的一致性了。

2024-08-07 23:13:01 1050

原创 基于 Redis 的分布式锁 Spring Boot 集成 Redisson 使用分布式锁确保对共享资源的互斥访问

工作中开发过一个上传文件的接口,每个区县都有自己的资源压缩包需要上传到系统,系统接收到压缩包后,需要解压,提取出里面的文件保存到文件服务器中,解析里面的SQLITE文件得到数据保存到数据库中。由于处理的过程会比较耗时,所以使用了异步处理的方式来优化用户体验,接口接收到文件后快速响应,返回上传成功,异步线程在后台继续执行解析压缩包业务逻辑。为了防止在异步线程处理期间,用户再次上传压缩包,从而导致上传资源数据不一致问题,在异步线程处理期间要获取锁来保证上传资源数据一致。

2024-08-07 00:24:21 1042

原创 基于 Redis 的分布式信号量 Spring Boot 集成 Redisson 使用 Semaphore 控制并发访问数量

工作中开发过一个服务,这里记作A服务,主要功能是配置,部署以及调用云函数。其中配置云函数的功能里,有一个配置项是并发数,意思是同一时间最多能有多少个请求调用已部署的云函数。客户端通过调用A服务,再由A服务去调用云函数,从而实现客户端请求云函数的功能。在调用云函数时,是要根据配置的并发数控制请求的数量。如果时单机架构的话,直接使用JDK中的 Semaphore 就能够实现并发线程控制了。但是项目的架构是微服务架构,所以需要使用分布式信号量才行。

2024-08-06 09:00:00 1025

原创 CentOS7 VMware虚拟机基于NAT配置网络IP

平时学习时一直需要用到Linux服务器,一般都是在Windows上安装VMware来创建一个虚拟机。创建的虚拟机需要配置网络才能够访问外网,可以通过以下两种方式来配置虚拟机网络使用桥接模式要保证虚拟机的网卡和物理机能上外网网卡的网段保持一致,如果物理机的上网网段经常变化,显然桥接模式就很不合适。所以这里使用 NAT 模式,物理机和虚拟机之间的通信是通过在物理机上生成的VMware Network Adapter VMnet8虚拟网卡和虚拟机的虚拟网卡进行连接通信。

2024-08-05 18:10:58 748

原创 CPU飙高问题排查思路

工作中时不时会被指派去排查线上问题,线上问题大致分成两种:一种是业务bug相关的,这种实际上没啥好讲的,无非就是程序运行结果不符合业务,一般都是看下相关日志,获取相关入参,在本地复现bug后修复即可。另一种则是排查程序是否能稳定运行,即在程序能完成预期的功能前提下,保证程序能够有较快的响应速度,不会出现明显的卡顿以及延迟。一般出现延迟或者卡顿的情况,服务器CPU使用率通常都会异常飙高。所以问题也就转换成了排查CPU为何飙高,以及应该如何解决。

2024-08-05 02:41:45 842

原创 多租户系统数据隔离方案

多租户系统是一种将多个客户的数据和应用程序分开的系统,每个客户被视为一个独立的租户,互不干扰。实现多租户系统的关键之一是确保数据的隔离。之前公司的产品是一个多租户的SAAS平台,是一个面向企业办公的平台,每个企业其实就相当于一个租户。实际使用中采用可 数据行+数据表 混合的数据隔离方案,大多数业务场景中是数据行级别,即所有的数据都在同一张表下,用租户ID来区分。少部分业务场景则是数据表级别,每个租户都有自己的数据表,表名使用租户ID做后缀区分。

2024-08-04 22:04:36 843

原创 Spring Boot 动态数据源

大多数系统中,都需要数据库来持久化数据,在大多数情况下,一个系统只需要配置一个数据源便能够完成所有业务的查询,保存操作。也存在一个系统需要多个数据源的情况,不同的数据源对应不同的业务操作,这种场景下配置多个数据源,并且在代码中维护多套dao层就可以了。还存在一种业务场景,所有的业务操作都是一样的,只有操作的数据源的不同,如果用多套dao层来实现,由于业务操作都一样,会出现多块一模一样的代码,这样的冗余代码是我们不希望看到,不利于维护。这种业务场景就很适合用动态数据源来实现。

2024-08-01 22:38:36 685

原创 Spring Boot 使用 Spring AI 构建知识库服务

做 AI 大模型技术调研时,参考的开源项目 Maxkb,它基于大模型做了一个的应用,用户可构建自己的知识库,创建自己的应用然后关联知识库,这样可以基于知识库里的内容让大模型的回答更加符合我们地预期。虽然 Maxkb 是使用 Python 写的,不过参考它用到的相关模型和数据库,可以用 Spring Boot 来构建一个自己的知识库服务。Spring Boot 也提供了 AI 相关的库,这使得接入 AI 大模型能力也十分方便。以下是使用Spring Boot 构建一个知识库的样例。

2024-08-01 01:01:31 1289

原创 Windows 安装 PostgreSQL 并安装 vector 扩展

调研大模型时,了解到一些大模型的应用,其中一个就是知识库,用户可以上传文档到知识库中,系统解析文档并将内容向量化保存起来,以便在和模型交互时使用。在和大模型对话时,可以先向量化检索自己的知识库,如果命中,则返回文档内容,然后将文档内容作为大模型的输入,以便让大模型回答得更加符合我们的预期。这里就涉及到了向量化数据的存储,可以为 PostgreSQL 安装 vector 扩展来存储向量化数据。记录 Windows 安装 PostgreSQL 以及 vector 扩展的步骤。

2024-07-26 13:59:54 1250

原创 Ollama 部署本地大模型

工作需要,被指派对大模型做技术调研,又不想花钱买各大产商的key,所以就考虑部署本地的大模型,了解到 Ollama 开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。便在自己电脑上安装了,记录下安装以及使用过程。

2024-07-26 10:48:13 905

原创 数据库窗口函数实战

SQL 具有很高的灵活性,可以根据需求进行复杂的数据查询和分析,支持多表联合查询(join)、排序(order by)、分组(group by)、聚合(sum)等操作。虽然以上这些操作已经能解决绝大多的查询问题了,但是还是存在一些较为特殊的场景没法很好地处理。

2024-07-25 22:26:04 1073

原创 数据库表的行列转换(行转列,列转行)

在工作中,多多少少都会遇到一些数据展示的需求,开发一个接口,从数据库中查询数据返回页面展示。表结构是死的,但是查询需求却是非常灵活的。很多时候不是简单的直接从表中直接 select 获取数据就能够直接返回给页面,需要将一些判断,聚合逻辑交给 SQL 来做,才能够得到查询需求中的字段和数据。其中就可能会涉及到一些表行列的转换。以下用两个案例分别演示下行转列与列转行的业务场景,并给出通用的SQL写法。

2024-07-25 01:11:38 1197 1

原创 MySQL的查询优化思路

一般的系统中,数据库往往都是性能瓶颈。在一个系统中,数据库被使用的频率很高,因为几乎所有的应用程序都需要与数据库交互来读取或写入数据。所以一旦数据库的响应慢,负载突增,则会大大影响系统的运行效率,严重点甚至可能直接崩溃。面对数据库响应变慢,负载突增问题,应该及时处理,以下是处理的思路,依次考虑。

2024-07-23 08:53:43 780

原创 数据库分表实践

如果单表的数据量过大,则会影响查询效率。想要解决这个问题,显然,直接拆分就完事了。一张表的数据量过多,那么进行分表,将数据分散到多张表中,每张表中的数据自然就不多了,问题就迎刃而解了。针对单表数据量大的情况,分库分表就是一个通用的解决方案。

2024-07-23 00:08:40 874

原创 引入缓存带来的问题以及解决方案

在提升接口性能的方案中,毫无疑问,使用缓存是最有效果的,但同时也会带来新的问题。以上问题都是引入缓存需要考虑的,在设计时就需要做好相应的解决措施。

2024-07-22 11:14:58 998

原创 PlantUML 实战示例(使用 PlantUML 画用例图、类图、活动图、时序图)

PlantUML 实战示例(使用 PlantUML 画用例图、类图、活动图、时序图)

2024-04-11 15:13:40 2379

原创 使用 Fn Project 搭建无服务平台

使用 Fn Project 搭建无服务平台

2024-04-10 02:26:10 809

原创 Java 解决 Process 执行命令行命令报【CreateProcess error=2, 系统找不到指定的文件。】错误问题

使用 Process 执行命令行命令时,报CreateProcess error=2, 系统找不到指定的文件。但明明指定的文件是存在的。

2024-04-08 14:22:17 3681 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 1947

原创 Linux(CentOS7)安装 Docker 以及 Docker 基本使用教程

Linux(CentOS7)安装 Docker 以及 Docker 基本使用教程

2024-04-07 23:30:08 733

原创 使用 Apipost 管理项目接口文档

在 web 后端开发中,开发接口之前通常需要先写接口文档,然后前后端再根据接口文档开始开发系统模块。接口文档形式多种多样,有使用共享文档的(wps共享文档),也有使用第三方接口管理平台的(比如yapi)等等。写完接口文档后并且开发完后,就需要对接口进行自测,一般使用 postman 来调试请求接口,这时候就需要在 postman 中创建接口文档中定义的接口,输入对应的各种入参,然后请求调试。上面的开发过程中,接口文档和调试实际上是分离的。

2024-04-06 00:09:56 840

原创 Linux(CentOS7)部署 y-api 接口管理平台

前后端分离时代,前后端通过接口文档来协作开发项目。一般开发过程中,由后端先编写接口文档,然后交付给前端,这时候前后端都根据这个编写的接口文档来进行开发。在没有一个统一的接口管理平台下,仅用一个文档作为前后端团队协作的媒介,一旦出现需求变更或者开发过程发现接口设计不合理需要重新调整,就需要改动接口文档,每次改动需要重新发一个文档给前端,改动次数越多,就会造成文档越混乱,同时也会出现前端对着旧版的接口文档开发的情况。

2024-04-05 21:24:33 1481

原创 MySQL 主从复制架构搭建及其原理

系统的性能瓶颈一般出现在数据库上,以 mysql 为例,如果存在高并发的写请求,势必会有锁表,锁数据行的情况发生,这时候如果有读请求刚好访问到被锁的数据,那么读请求会阻塞,直到写请求处理完释放锁,系统性能大大下降。为了提高数据库性能,可以搭建一个简单的 mysql 主从复制集群。使用 mysql 主从复制集群,master 节点用来处理写请求,slave 节点用来处理读请求,当 master 数据变化时,自动将新的数据异步同步到 slave 节点上,实现读写分离。

2024-04-04 23:38:01 1297 1

原创 IDEA 中能提高开发效率的插件

IDEA 里又很多好用的插件可以帮助我们提升开发效率,这里罗列下自己开发过程中常用的插件,善于利用插件,可以将自己的 IDEA 调教成自己中意的模样。

2024-04-03 23:54:31 1288

原创 使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)

可以自定义命令,将一些常用的命令组合保存起来,这里以启动 nginx 为例子,进入 nginx sbin 目录,指定配置文件启动。实际应用中可以用来很好地管理服务器的各种服务启动脚本。

2024-04-02 22:45:55 3805

原创 Redis 主从复制集群搭建及其原理

单机的 redis 的性能虽然已经很强大了,但是随着业务的扩展,总有一天会遇到性能瓶颈,针对高并发带来的性能问题,解决的思路其实就是将请求分散,用多个 redis 来处理请求。具体的操作其实就是搭建一个简单的 redis 主从复制集群。使用 redis 主从复制集群,master 节点用来处理写请求,slave 节点用来处理读请求,当master数据变化时,自动将新的数据异步同步到slave节点上,实现读写分离。根据并发量的大小,动态扩展集群里的 slave 节点,实现水平化扩容。

2024-04-02 00:47:23 1120

原创 使用 PDManer 对数据库表建模(建表语句生成,代码生成)

在软件开发中过程中,一般分为几个过程:需求分析、概要设计、详细设计、编码实现、软件测试和软件交付。在概要设计和详细设计过程中,则需要对业务进行建模,行业内专业的建模工具是 Enterprise Architech,EA 的功能覆盖了整个软件开发的生命周期,功能十分齐全,也正因为如此,如果开发的软件比较小型的话,EA 就显得太重了,而且国内一般都是面向表结构编程,EA 的很多功能都用不上。PDManer 就是专门解决这个痛点的。

2024-04-01 19:38:50 2538 1

原创 Linux(CentOS7)配置系统服务以及开机自启动

Linux(CentOS7)配置系统服务以及开机自启动

2024-04-01 00:01:25 1759 1

原创 Linux(CentOS7)安装软件方式(编译安装,yum,rpm)

Linux(CentOS7)安装软件方式(编译安装,yum,rpm)

2024-03-31 19:28:05 1149

原创 软件设计七大原则

开闭原则,依赖倒置原则,单一职责原则,接口隔离原则,最少知道原则,里氏替换原则,合成复用原则

2024-03-31 00:15:00 2002

原创 Linux(CentOS7)安装 MySQL8

Linux(CentOS7)安装 MySQL8

2024-03-30 23:34:16 810

原创 备忘录模式实战运用(对象快照与恢复)

使用备忘录模式,主要目的就是创建对象副本,保存对象内部状态的的快照,以便在需要时恢复对象至某一个历史状态。仅仅从创建副本来看,备忘录模式和原型模式其实没啥区别,不过备忘录模式是行为型设计模式,重点在于恢复对象到某一历史状态。备忘录模式下,总共有三个角色,原始对象 Originator,对象快照 Memento,以及管理它们的 CareTaker。

2024-03-30 00:15:00 589

原创 Linux(CentOS7)安装 MongoDB

Linux(CentOS7)安装 MongoDB

2024-03-29 23:45:54 1127

原创 状态模式实战运用

通常一个完整的业务流程中,会经历多个阶段,每个阶段即一个业务状态,不同状态下对应这不同的业务处理逻辑。无脑堆砌 if else 做判断然后选择对应的业务处理其实也能够完成该需求,只不过这样写代码不够优雅。使用状态模式来处理这种业务场景,能让程序可读性更好,易于维护和扩展。状态模式和策略模式从 UML 上看其实是一样的,很容易混淆。两者的区别就是策略模式下的策略是由客户端自主选择的,且每个策略之间并没有任何关系;

2024-03-29 00:15:00 586

原创 Linux(CentOS7)安装 Redis

Linux(CentOS7)安装 Redis

2024-03-28 00:20:25 826

原创 装饰器模式实战运用(功能增强)

装饰器模式和代理模式在使用上很相似,都是在不修改原始类代码的情况下,动态地给真实对象的方法做增强。装饰器模式是通过创建一个包装对象来包裹原有对象,并在包装对象中添加额外的职责。装饰器可以有多个,在实际使用中,可以根据不同的场景,使用多个不同的装饰器包装来实现需求。

2024-03-28 00:15:00 1116

原创 Linux(CentOS7) 安装 Nginx

Linux(CentOS7)安装 nginx

2024-03-27 01:09:02 709

原创 观察者模式实战运用

使用观察者模式,便能够在对象之间建立起一种一对多(主题与观察者)的依赖关系,当主题对象改变状态时,所有依赖它的观察者对象都会得到通知并且自动更新。通过主题对象来使客户端与观察者对象之间的通信更加松散耦合、灵活可扩展。一般用来解耦不同的业务逻辑,比如将实时更新、动态同步等功能与其它业务逻辑解耦。可分为两种模式:推模型和拉模型。

2024-03-27 00:15:00 1086

空空如也

空空如也

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

TA关注的人

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