自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringCloudAlibaba 2023.0.1、SpringBoot 3.2.5 - 项目完整搭建(Nacos、OpenFeign、Gateway、Sentinel)

c)点击 “创建配置”,然后就可以把 kt-gateway 微服务中的 application.yml 文件中的所有内容都放在 nacos 上进行统一管理,随后点击发布.这里需要配置路由规则,分别将将请求通过负载均衡引入到 kt-user 和 kt-product。b)接着分别给 kt-user 和 kt-product 引入 kt-feign 模块,如下。kt-product 微服务拿到 kt-user 微服务的数据,远程调用引入成功.a)在 feign 模块的 pom.xml 中引入如下依赖。

2024-05-12 22:35:04 1620 1

原创 点赞功能真的有必要上 Redis 吗?(Mongo、MySQL、Redis、MQ 实测性能对比)

除了单表操作比较耗时外,对于中小型项目而言,频繁的读写操作场景,使用 mongo 就够用了. 甚至都不用上 mq,更甚至有的场景下 redis 性能还不如 mongo...

2024-03-10 20:00:34 1892 1

原创 架构师成长之路 - 结合领域设计项目架构总结(持续更新,暂不公开)

每个人项目架构设计风格千姿百态,导致项目难以维护、可读性低... 于是将自己接触过的大型企业级项目经验总结一下,最终目的是为了提高我的团队协作效率,降低维护成本。

2024-01-24 15:00:56 403

原创 docker 部署 - 容器部署汇总

a)为了 es 和 将来要下载的 kibana 进行互联,因此需要我们去创建一个网络.Ps:默认账号和密码都是 sentinel。Ps:默认账号密码都是 nacos。c)kibana 部署。

2024-01-06 22:26:20 1603

原创 RabbitMQ | HAProxy - 给 RabbitMQ集群 集成负载均衡

试想一个问题:当 RabbitMQ 一个集群中有 3 个节点时,我们写代码时,因该访问哪个节点呢?当然时任意一个节点都可以~如果配置文件中写死访问的是 node1,但是 node1 挂了,不就是变相的等于 mq集群 整体不可用了吗,所以最好是有一个统一的入口,一个节点故障时,流量可以及时转移到其他节点.如果所有客户端都和 node1 建立连接,那么 node1 的负担会大大增加,而其他节点的负担不大导致资源浪费.2)使用 HAProxy 就可以实现流量的负载均衡.

2024-08-18 16:50:31 723

原创 RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)

1)RabbitMQ 普通队列在一个节点宕机之后,其他节点无法读写宕机节点的队列,为了解决这个问题,引入了仲裁队列.2)仲裁队列通过 Raft 协议,实现了不同节点间队列消息数据的复制,使得在 创建这个队列的节点 宕机时,其他节点仍然可以使用该队列进行服务.Ps:仲裁队列时 RabbitMQ3.8 版本的重要改动,是 镜像队列 的替代方案(设计上有缺陷). 镜像队列已被弃用,并计划在将来的版本中移除.

2024-08-18 14:29:34 1279

原创 RabbitMQ集群 - 普通集群搭建、宕机情况

1)普通模式中所有节点没有主从之分,所有节点的元数据(交换机、队列、绑定等)都是一致的.例如只要有任意一个节点上面 新增交换机, 那么这个交换机的元数据也会被复制到其他节点上.2)比较特殊的是队列,队列中的消息数据只保存在创建他的节点上,其他节点只保存元数据(队列名称、配置...)和指针(指向创建该队列的节点)例如 node1 创建 cyk.queue,那么 node2 只保存 队列的元数据 和 指向 node1 节点的指针,而 cyk.queue 中的消息,只会存在于 node1 节点中。

2024-08-17 14:53:49 1116

原创 RabbitMQ应用问题 - 消息顺序性保证、消息积压问题

a)消息顺序性:消费者消费的消息的顺序 和 生产者发送消息的顺序是一致的.例如 生产者 发送消息顺序是 msg1、msg2、msg3,那么消费者也需要按照 msg1、msg2、msg3 的顺序进行消费.b)顺序不一致可能会导致哪些问题?消息1:修改 用户318 的昵称为 “白天”.消息2:修改 用户318 的昵称为 “黑夜”.那么,按正常的逻辑来讲,用户318 的名称最后因该为 “黑夜”,但如果 消息1 是最后一个被消费者消费的消息,那么 用户318 的名称就变成了 “白天”.

2024-08-11 16:52:11 2077

原创 RabbitMQ应用问题 - 幂等性保障

假设 key 不存在,那么通过 setnx 操作后,就会成功设置 key,并且在这之后无论多少次调用 setnx,都不会在影响第一次调用 setnx 操作后的结果.这个方案基本上就覆盖了 90% 的应用场景. 可能网上也还有很多其他资料描述其他的方法,但基本上都是围绕 全局唯一ID 的拓展(本质的思想都一样).假设 i 初始为 0, 第一次调用后会 i = 1,并且后面每次调用都会影响第一调用后的结果(第二次 i++ ,i 就等于 2).因此,对于可靠性要求高的场景,建议使用。

2024-08-10 22:32:29 1009 1

原创 RabbitMQ高级特性 - 消息和队列TTL、死信队列

a)TTL(Time To Live 过期时间),RabbitMQ 可以对消息和队列设置 TTL. 当消息到达存活时间之后,还没有被消费,就会被自动清除.给消息设置TTL:MQ 扫描到队列头部消息(先进先出)过期了,就会剔除消息(这里会存在一个问题:当队列头部的消息还没过期,而队列头部之后的元素过期了却不会被清理,需要等到头部元素过期被清理后,才会依次扫描后面的元素).给队列。

2024-08-10 17:36:01 940

原创 Redis - 记录一次千万级 key 的 Redis 主从迁移步骤

完成 redis 主从迁移:* `主节点` 从 10.200.16.75 迁移到 10.200.16.10* `从节点` 从 10.200.16.74 迁移到 10.200.16.11最后保证迁移后数据基本一致.

2024-08-07 23:29:03 631

原创 Rabbit高级特性 - 消息重试机制(两种实现)

消息重试机制就是在消息处理失败之后重新发送,主要时为了解决消息发送过程可能会出现的问题,例如 网络故障、服务临时不可用 等.Ps:如果时程序逻辑引起的错误,那么即使重试多少次都是没有用的,但是可以通过配置重试次数来解决.

2024-08-07 23:25:58 865

原创 RabbitMQ高级特性 - 非持久化 / 持久化(交换机、队列、消息)

前面讲到了 生产者消息确认机制 和 消费者消息确认机制,保证了消息传输的可靠性,但是这还不够,试想如果 Broker 突然崩溃,那么所有的 交换机、队列、消息 不就全部都没了(RabbitMQ 以内存为主,硬盘为辅,默认交换机和队列都是非持久化的). 因此需要持久化机制.a)交换机持久化如果交换机不设置持久化,那么在 rabbitmq 服务重启之后,相关的交换机元数据就会丢失,对一个长期使用的交换机来说,建议设置成持久化的.

2024-08-04 22:09:16 593

原创 RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

2024-08-04 18:51:15 1172

原创 RabbitMQ高级特性 - 消费者消息确认机制

为了保证消息从 队列 到 消费者正确消费,那么就引入了消费者消息确认机制.a)消费者在订阅队列时,可以指定 autoAck 参数,根据这个参数设置,消息确认机制分为以下两种(以下讲到的方法和参数来自于 RabbitMQ 原生的 SDK,非 Spring 提供).自动确认:当 autoAck = true 时,RabbitMQ 会自动把发送出去的消息置为确认,然后不管消费者是否真正的消费这些消息,都会从内存中删除.(适合对消息可靠性要求不高的场景).

2024-08-04 17:12:36 1230

原创 RabbitMQ高级特性 - 消息分发(限流、负载均衡)

RabbitMQ 的队列在有多个消费者订阅时,默认会通过轮询的机制将消息分发给不同的消费者,但是有些消费者消费速度慢,有些消费者消费速度快,就会导致消费速度慢的消费者影响整个的任务的吞吐量下降例如,公司有1个正式员工和1个实习生,现在有 10 个任务分配平均给他们(各 5 个),而由于实习生干活比较慢,就会导致整个完成任务的吞吐量下降.消息分发机制给 “正式工” 多分一些任务,给 “实习生” 少分一些任务.

2024-08-03 21:54:44 1340

原创 RabbitMQ高级特性 - 事务消息

RabbitMQ 的 AMQP 协议实现了事务机制,允许开发者保证消息的发送和接收时原子性的,也就是说,要么消息全都发送成功,要么全都发送失败(只与发送方有关).

2024-08-03 15:48:32 814

原创 VMware、Docker - 让虚拟机走主机代理,解决镜像封禁问题

Ps:这里的 ip 就是 VMnet8 的 ip,端口是代理的端口.b)通过 curl www.google.com 测验代理是否成功.a)打开此电脑,输入 “控制面板”,然后回车.b)记住你的代理端口。

2024-07-27 19:12:17 646

原创 VMware、Yum、VIM、Zsh、Oh My Zsh - 搭建属于你的虚拟机

b)使用 vim ~/.zshrc,找到 plugins,添加 zsh-syntax-highlighting 插件.b)在 ~/ 目录下,可以看到一个隐藏文件 .vimrc 文件(如果没有就创建),这里我给出一个最简单且够用的配置.b)使用 vim ~/.zshrc,找到 plugins,添加 zsh-augosuggestions 插件.b)点击菜单栏上的【编辑】->【虚拟网络编辑器】,打开下方的虚拟网络编辑器.alias 是 .zshrc 中的配置项(下载 zsh 时自带).

2024-07-27 00:05:48 353

原创 Prometheus 云原生 - 基于 file_sd、http_sd 实现 Service Discovery

我们知道在 Prometheus 配置文件中可以通过 static_configs 来配置静态地址来获取数据,但是在云环境下,特别是容器环境下,抓取的 地址 经常是变动的,也就是说,地址每次变动因此,我们不但需要去修改 prometheus.yml 文件,还需要重启 prometheus 来加载配置,十分麻烦.这个示例中,Prometheus 会每 10s 读取 '/root/prometheus/targets/' 目录下的所有以 .json 结尾的文件,获取最新的监控目标.

2024-07-14 22:56:07 1081

原创 Prometheus 云原生 - 监控 Linux、MySQL、Redis、RabbitMQ、Docker、SpringBoot 3.x

docker restart 重启 Prometheus,接着在 Prometheus 的 Targets 就可以观察到。docker restart 重启 Prometheus,接着在 Prometheus 的 Targets 就可以观察到。docker restart 重启 Prometheus,接着在 Prometheus 的 Targets 就可以观察到。docker restart 重启 Prometheus,接着在 Prometheus 的 Targets 就可以观察到。Ps:这里有点问题。

2024-07-14 17:54:03 1730

原创 Prometheus 云原生 - Prometheus 数据模型、Metrics 指标类型、Exporter 相关

所有可以向 Prometheus 提供监控样本数据的程序都可以被称为一个 Exporter,而 Exporter 的一个实例被称为 Target.Exporter 可以用户自定义,也可以使用社区提供的,例如 MySQL_Exporter、Redis_Exporter、RabbitMQ_Exporter......Prometheus 通过轮询的方式,定期的从这些 target 中获取样本数据.

2024-07-14 13:54:40 1456

原创 Rainmeter - windows 美化、编写 .ini 文件实现自定义应用

这里我们可以任意选择 Windows 12X RE,右键点击 “打开皮肤目录”(下图中,我已经都是自定义的了,所以可能跟你的不太一样,不过自定义的方式都是一样~)a)自己多点点,多加载几个 .ini 文件,就会发现这些文件可能不是我们想要的 应用/图标,那我们怎么才能自定义呢?查看这些文件的 .ini 文件,点击 “加载”,就会显示在桌面,可以自己任意拖动,更改位置~c)安装成功之后,找到你需要提取的 .exe 文件的图标,右键点击 “属性”d)保存文件后,右键你的应用图标,点击刷新皮肤就可以看到效果啦~

2024-07-13 23:55:50 142

原创 Prometheus 云原生 - 微服务监控报警系统 (Promethus、Grafana、Node_Exporter)部署、简单使用

prometheus 是一个开源的系统监控和报警系统,本身是机遇 Go 开发的一套开源的系统监控报警框架和时序列数据库(TSDB)基本原理:通过 HTTP 协议周期性的抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口就可以接入监控,不需要任何的 SDK 或者其他集成过程. 这样非常适合做虚拟化环境监控,例如 VM、Docker、Hubernetes 等,被监控组件信息的 HTTP 接口叫做 exporter.

2024-07-13 17:37:37 1353

原创 项目DEMO - 编写一个自定义校验注解

a)注解解释:这个注解表示使用该注解的注解应该包含在生成的Kotlin文档中。换句话说,当使用KDoc生成文档时,应用了 MustBeDocumented 的注解将会出现在文档中。这个注解定义了该注解是一个校验约束,并且指定了用来校验该注解的逻辑类。ListValueConstraintValidator::class 是一个自定义校验类(下文中详细讲)@Target这个注解定义了自定义注解可以应用的目标元素。可以是方法、字段、注解类型、构造函数、参数或类型使用。

2024-07-09 22:15:02 715

原创 MinIO - 服务端签名直传(前端 + 后端 + 效果演示)

传统的,我们有两种方式将图片上传到 OSS:a)前端请求 -> 后端服务器 -> OSS好处:在服务端上传,更加安全.坏处:给服务器带来压力.b)直接写在前端 js 代码中好处:效率高,不用给服务器带来额外压力.坏处:危险,用户直接可以看得到 OSS账号密码 信息.用户直接去服务器请求获取上传签名(账号密码加密生成的防伪签名,一般有过期时间),服务器就返回防伪签名,然后用户就可以拿着签名和要上传的文件,通过表单直接上传到 OSS 中.

2024-07-08 00:14:33 1115

原创 阿里云 OSS - 开通到使用、服务端签名直传(前后端代码 + 效果演示)

传统的,我们有两种方式将图片上传到 OSS:a)前端请求 -> 后端服务器 -> OSS好处:在服务端上传,更加安全.坏处:给服务器带来压力.b)直接写在前端 js 代码中好处:效率高,不用给服务器带来额外压力.坏处:危险,用户直接可以看得到密钥信息.用户直接去服务器请求获取上传签名(账号密码生成的防伪签名,一般有过期时间),校验安全,服务器就返回该用户的防伪签名,然后用户就可以拿着签名和要上传的文件,通过表单直接上传到 OSS 中.

2024-07-07 18:38:03 1330

原创 MinIO - 从 环境搭建 -> SpringBoot实战 -> 演示,掌握 Bucket 和 Object 操作

案例:获取 文件夹"dir1" 中的 "test.gif"文件 ,保存到本地磁盘的 "D:/tmp/" 路径下,并重命名为 "123.gif"案例:将本地 "D:/tmp/滑稽.gif" 图片上传到 MinIO 的 "dir1" 文件夹下,并重命名为 "test.gif"案例:给 MinIO 上的 "dir1" 文件夹下的 "test.gif" 文件生成一个带签名的 url 路径(get 请求).案例:查询 "dir1" 文件夹下的 "test.gif" 文件的状态。

2024-07-06 18:02:38 1061

原创 项目DEMO - 树形菜单递归流查询、三级分类数据查询性能优化、Jmter 性能压测

asSequence 在处理大数据量时速度更快的原因主要是因为它采用了惰性求值策略,避免了不必要的多次迭代和中间集合的创建(原本的集合操作,每进行例如 filter 就会创建中间集合),从而减少了内存和处理时间的消耗。最直接的方法就是先从数据库中查到所有一级分类数据,然后再拿着每一个一级分类 id 去查对应的二级分类数据,最后拿着每个二级分类的 id 去查对应的三级分类数据.一开始就从数据库中拿到 分类表 中的所有数据,然后在内存中操作,过滤出每一个一级分类下的所有二级分类数据.......

2024-07-06 13:25:09 1061

原创 设计模式 - 外观(门面)模式就要这样学!

外观模式(Facade):也叫门面模式,为子系统中的一组接口提供了一个一致的界面,此模式定义了高层接口,这个接口使得这堆子系统更加容易使用.通俗来讲,就是 外观类 对 大量的子系统又进行了一层封装,对外提供一个聚合了多个子系统功能的接口.例如上述我们讲的 用户表 分表的情况,就可以在外观类中提供一个 查询接口,这个查询接口的工作就是 调用三张表的 Repo,查询到数据,然后聚合成 VO,并返回. 这样将来外部只需要调用这个 外观类 的查询接口,就实现了复杂查询和组装操作,无需知道内部实现细节~

2024-06-30 19:16:10 380

原创 设计模式 - 桥接模式,就要这样学!

桥接模式:是一种结构性设计模式,将抽象(Abstraction)和实现(Implementation)放在两个不同的类层次中,使两个层次可以独立改变.抽象:抽象类:就是真个桥接的桥梁,里面聚合了行为的 实现接口 .精确抽象:是具体的逻辑实体,通过父类中提供的聚合行为接口来完成不同的交互.行为:实现接口:这里就定义了实体的行为. 此接口被抽象类聚合.具体实现:实现了具体的实体行为.

2024-06-30 15:29:39 436

原创 设计模式 - 原型模式,就该这样学!

原型模式(Prototype Pattern)是一种创建型的设计模式,运行一个对象通过复制自身的实例来创建新的对象. 简而言之,提供了一个快速创建新对象的方法,这个新对象是已有对象的精确复制品(根据具体的业务场景,决定是深拷贝 还是 浅拷贝).简化对象创建:复制复杂对象时,可以通过原型模式简化对象的复制过程,并且可以动态的配置对象状态.

2024-06-30 01:08:21 737

原创 Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)

Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强(有报告表明支持高达 50 000 个并发连接数).b)何为正向代理代理客户端(在浏览器中配置代理服务器). 通过代理服务器进行互联网访问.例如,在中国大陆是不能直接访问到谷歌,因此就需要在浏览器中配置代理服务器,通过代理服务器来访问谷歌.c)何为反向代理。

2024-06-15 23:34:38 1254

原创 Vite - 项目打包从 0 到 1(完美解决打包后访问白屏问题)

在自定义配置的 router.js 中,配置 HashHistory (其他的不行!前端不要自己配置 server {proxy ...}!,否则会和上面配置冲突!使用 npm run build 命令打包,直接访问 dist/index.html 即可。Ps:主要 regenerator-runtime/runtime 在解决跨域警告。

2024-06-13 21:19:51 998

原创 Vite - 开发初体验,以及按需导入配置

a)这里我们只需要在 vite.config.js 文件中引入 elementPlus 的解析器,然后把她交给 Components 按需引入插件即可.之后就可以观察到项目中多出了 node_modules 文件(这个文件中存放的就是下载好的依赖),然后通过 npm run dev 就可以成功了。c)接下来你会发现,在 Home.vue 组件中使用 Foo.vue 组件,就可以不用写 import 了~a)例如我们在 Home.vue 文件中使用 ref 写了一个计数器(点击按钮,count++).

2024-06-09 16:20:20 3043

原创 SMS - 基于阿里云实现手机短信验证码登录(无需备案,非测试)

c)建议将短信服务专门到一个微服务中(专门用例处理调用第三方服务的接口),将来其他服务需要使用时,进行远程调用接口,解耦合(不要跟我张口闭口性能优化...).c)调整参数,点击发送请求,随后返回响应,显示 "ok",说明调试成功(此时你就可以看到发送到你手机上的验证码了).a)进入阿里云首页,然后从云市场中找到 “短信” (一定要从 云市场 去找短信服务,否则需要企业证明,备案)e)之后你就可以在控制台里搜索 “云市场”,找到你购买的服务。a)进入你购买的服务后,找到 API 接口,点击 “去调试”

2024-06-08 17:04:18 2279

原创 SpringCache 缓存 - @Cacheable、@CacheEvict、@CachePut、@Caching、CacheConfig 以及优劣分析

对于读多写少,一致性要求不高的数据,完全可以使用 SpringCache 来简化开发(只要缓存的数据有过期时间就可以).对于一致性要求高的场景,也没必要引入引入缓存,直接对数据库进行读写即可.特殊数据特殊处理.

2024-06-05 21:47:31 1407

原创 Redisson 分布式锁 - RLock、RReadWriteLock、RSemaphore、RCountDownLatch(配置、使用、原理)

目录前言Redisson 分布式锁环境配置1)版本说明2)依赖如下3)配置文件如下4)项目配置RLock1)使用方式2)加锁解释3)加锁时手动设置时间4)加锁时,到底要不要手动设置过期时间?(最佳实践)RReadWriteLock1)使用方式2)加锁原理RSemaphore1)使用方式2)信号原理RCountDownLatch1)使用方式2)原理解释前面讲过一篇 Redisson 分布式锁的底层原理,而这篇文章着重实战,因此对原理不清楚的,可以看看我之前的文章:http://t.csdnimg.cn/LU5

2024-06-04 22:55:51 1250

原创 项目总结 - 红皮书(从 0 到 1 自研)

目录专辑业务处理专辑新增或修改(图片的批量新增和修改),体现 @Transation 的使用评论楼中楼设计(避免递归查询)搜索推荐(用户画像)tag 专栏分类(体现 es 分词功能)专辑访问量、点赞量、收藏量、评论量的统计设计点赞收藏功能的实现数据存储处理(ES 到底需要保存哪些数据)如何控制 redis 的 list 中每一个元素的声明周期(体现优化业务)用户业务处理站内信设计好友离线消息处理jwt 令牌 + redis 实现用户信息鉴权Kotlin 语言设计DO & Entity 和 Repo 交互 ?

2024-06-03 00:59:08 102

原创 Protobuf - 语法、字段使用规则、注意事项

前面在讲gRPC 的时候有讲到Protobuf 的语法,但实际上远没有这么简单,有很多坑和注意事项,所以这篇文章就是来补坑的~

2024-05-25 12:48:25 2306 1

空空如也

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

TA关注的人

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