自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梦想歌的技术博客

原文链接可访问 https://mengxiangge.netlify.app

  • 博客(42)
  • 收藏
  • 关注

原创 Arthas 还能这么玩?权限控制 + 自动发现,K8s 诊断效率直接翻倍!

Arthas 是阿里巴巴开源的在线诊断工具,提供了Stack 堆栈查看Watch 性能观测等功能。1. 服务发现:自动获取接入的应用列表 IP 和端口,无须手动输入 AgentId2. 权限控制:基于 Spring Security 实现登录控制,并支持 Nacos 动态绑定账号与服务

2023-09-24 23:24:25 222 1

原创 Sentinel 收费功能开源:规则持久化 + 监控存储,K8s 流量治理从此无忧!

Sentinel 是阿里巴巴开源的流量治理平台,提供了流量控制、熔断降级、系统负载保护、黑白名单访问控制等功能。基于上面的问题,笔者 fork 了官方最新的源码进行二次开发,并打包镜像到 Docker Hub,方便大家使用。

2023-09-24 23:17:09 479 1

原创 CAT 监控大升级:链路追踪 + 告警推送,生产问题秒级定位!

CAT 是美团点评开源的实时应用监控平台,提供了EventProblemBusiness等丰富的指标项。基于上面的需求,笔者 fork 了官方最新的源码进行二次开发,并打包镜像到 Docker Hub,方便大家使用。

2023-09-24 01:02:53 451 1

原创 只需一行配置!日志从22万行压缩到3万行,节省 90% 资源成本

本次改动没有任何代码侵入,研发团队只需要在 log4j2.yml 微调 pattern,就可以将日志的占用空间缩减 10 倍,并且,在排查问题只需要关注第一段堆栈的信息,就能定位到业务代码问题。

2025-03-20 01:05:21 490

原创 30天日志凭空消失?Log4j2这个参数千万不能乱配!

研发突然反馈,生产日志没有按 Log4j2 设置的 30 天保存,并且今天的日志有一些丢失了。我们上去查看生产日志,看到今天的日志文件剩余 30 个,和 log4j2.yaml 配置文件对比,发现研发配置的 Log4j2 保存的规则是按个数,而不是按天数。之前没发现这个问题,是因为刚上线,访问量不大,每天只产生的日志文件不多,没有达到设置的阈值,不会触发日志文件覆盖。

2025-03-20 00:57:41 105

原创 使用 Spring Boot 优雅实现用户操作日志审计

在现代应用系统中,事件审计是一个至关重要的功能。通过记录用户的操作行为,我们可以追踪问题、分析用户行为,甚至在出现安全问题时提供关键证据。由于目前没有较好的事件审计框架,笔者决定实现一套可扩展的事件审计组件,要求对业务低侵入性,可以轻松获取前后变更的内容。

2025-02-27 23:24:22 521

原创 告别MQ强耦合!一文了解如何实现消息队列无缝切换

在复杂的分布式系统中,消息队列(如 RocketMQ、Kafka、RabbitMQ)常用于优化系统性能。然而,直接在代码中引入这些消息队列的 API 会导致系统与特定消息队列的强耦合,后续难以切换其他消息队列组件。虽然 Spring Cloud Stream 提供了一种抽象层,但其引入了复杂的概念(如绑定器、通道、处理器等),且与低版本的 Spring Boot 不兼容。

2025-02-27 15:50:28 968

原创 Elasticsearch 分页查询技巧:小数据与大数据场景下的最佳实践

对于小数据量的分页查询,可以使用 from+size 查询。当分页结果超过 10000 条结果时,则推荐使用 search_after 查询。不推荐使用 scroll 查询进行深度分页,因为实时性不高,对资源要求高。

2025-02-18 11:55:06 922

原创 Serverless 架构下的流量管理:腾讯云 NGINX Ingress 实战

我们的系统建设初期,使用腾讯云 CLB 负载均衡实现蓝绿发布,由于 CLB 的设计只能绑定腾讯云 CVM 服务器,对于 Serverless 集群架构很不友好。为解决这个问题,笔者尝试在腾讯云部署 NGINX Ingress Controller 实现金丝雀发布。

2025-02-18 00:18:41 422

原创 自建机房无法访问 DockerHub?Harbor 私有镜像仓库搭建全攻略!

由于自建机房无法访问 DockerHub,需要搭建 Harbor 私有镜像仓库,并解决研发团队在本地镜像仓库中拉取镜像的问题。

2025-02-17 11:25:22 359

原创 腾讯云 K8s 集群每晚21点诡异报错,原因竟是这个“定时炸弹”!

最近我们生产环境的几个系统出现了很诡异的现象,每天晚上 21 点之后出现短暂的报错,或者响应超时。例如,系统 A 在 21 点弹出微信预警,提示接口访问异常。系统 B 在 21 点弹出钉钉预警,提示网关探测异常。一开始我们怀疑是数据库、代码、xxl-job 等问题,但是这些想法很快就否决了。

2025-02-17 00:56:19 772

原创 避坑指南:手把手教你搭建 KubeSphere 高可用集群

笔者最近在部署自建机房,准备搭建 KubeSphere 集群,KubeSphere 官网的文档似乎有点小问题,所以用这篇文章来记录一下实际的操作,可以放心食用。

2025-02-16 15:55:11 406

原创 从库性能跟不上主库?5 招优化 MySQL 主从复制延迟!

MySQL 主库使用云厂商较高配置,规格为,数据空间实际使用1.5 T,日志空间使用0.5T,如下图。MySQL 从库通过 K8s 自行搭建,使用 MySQL 原生镜像,规格为4U 24G。由于两者配置差距太大,MySQL 从库经过出现同步延迟或者同步报错的现象。

2025-02-16 00:40:57 355

原创 从 Leaf 到通用插件:Spring Boot 分布式 ID 生成方案

在复杂的分布式系统中,往往需要对大量的数据和消息进行唯一标识。方案和方案。Leaf-snowflake 方案沿用 Twitter 开源的雪花算法,在原有的基础上使用 Zookeeper 持久顺序节点进行优化,如下图。Leaf-segment 方案基于数据库实现,每次获取一批递增号段的值,用完之后再去数据库获取新的号段,可以生成趋势递增的 ID,同时 ID 号是可计算的,因此不适用于订单 ID 生成场景(容易被竞争对手算出一天的订单量),相关原理如下图。

2025-02-14 00:18:39 1765

原创 分布式锁不再复杂:Spring Boot 无缝切换 Redis、Curator 与 Zookeeper

在 Java 中分布式锁的实现框架‌主要包括基于数据库Redis和Zookeeper的实现方式。使用Redis实现的组件可以选择Jedis API或者,使用Zookeeper实现的组件可以选择或者。笔者在项目中看到不少这种混用 API 的情况,维护性较差。

2025-02-13 22:55:10 166

原创 Elasticsearch 批量操作冲突?试试这 2 种优化技巧

使用批量更新或者批量删除,刚好有个_bulk批量写入,并且_bulk的执行更快,导致批量更新或者批量删除的版本比写入的版本要低,造成版本冲突报错。

2025-02-12 00:18:50 196

原创 如何安全备份 Elasticsearch 数据?两种方案任你选

有时候需要对 Elasticsearch 集群进行备份,或者恢复到其他集群。

2025-02-12 00:10:40 375

原创 索引设计不合理?Elasticsearch 零停机迁移救场指南

在对外提供服务的线上环境中,发现 Elasticsearch 集群中核心业务涉及的索引设计不合理,需要做数据迁移,但不允许重启服务。

2025-02-11 23:59:12 323

原创 告别手动赋值!优雅处理 MyBatis-Plus 的创建时间和更新时间

Spring JPA 提供了注解,用于自动赋值实体类的创建时间和更新时间。但我们的团队主要使用 MyBatis-Plus 作为 ORM 框架,需要提供同类的机制支持。

2025-02-11 14:46:18 336

原创 一招搞定! 自定义MyBatis拦截器,SQL日志存储成本直降30%

默认的日志输出格式存在以下不足:1. 缺少日志时间,无法快速定位 SQL 执行时间。2. SQL 语句可读性差,复杂的 SQL 语句难以阅读。3. 日志存储成本高:SQL 模板占用较多字符,增加了日志存储成本。

2025-02-10 23:19:25 793

原创 Sentinel 集成到 Prometheus 监控线上流量

由于 Sentinel Dashboard 开源版本没有实现监控数据的持久化,只能查看 5 分钟的内存数据。在项目初期,我们没有足够的精力对 Sentinel 进行改造,因此,将 Sentinel 的监控数据集成到 Prometheus,并导入到 Grafana 可视化管理。

2025-02-09 23:59:17 453

原创 前后端对接必备!基于 Spring 实现自定义错误信息返回

Spring 提供了用来实现 HTTP 协议的全局异常处理。在异常信息的处理上通常只返回特定的 Response 对象,如下。作为基础框架,笔者就遇到项目A 要求返回 Response1 对象,项目B 要求返回 Response2 对象,这个时候,适配起来就很痛苦,例如下方的代码。另外,只适用于 Web 异常捕获,我们还要考虑其他组件的情况,例如 Dubbo 捕获 RPC 异常、Sentinel 组件触发限流、Spring Security 安全框架抛出认证异常。

2025-02-09 14:20:05 241

原创 生产环境混沌演练模板:实施报告

根据《服务器高可用恢复演练方案》文档介绍,验证基于 CLB 负载均衡下部署多台 CVM 的高可用。通过混沌演练故障注入,验证 A 系统的 RPO 不超过 4 小时,RTO 不超过 12 小时。* 演练实施组:小D* 业务验证组:小E、小FA 系统的 prd1 生产环境2023-06-25 15:00 ~ 18:00在 prd1 服务器节点注入Linux内核故障。控制台显示 “执行中”。等待执行完成后,我们连接这台服务器的 ssh 会话自动退出,说明故障注入已生效。Linux 内核故障注入总共持续了 30

2025-02-05 21:14:53 738

原创 生产环境混沌演练模板:方案设计

演练结束后,点击按钮生成演练报告。

2025-02-05 21:03:28 880

原创 为什么腾讯云数据库设置为 utf8mb4 后仍然出现乱码?

我们使用腾讯云 MySQL 在特定业务场景(帖子、评论、个人签名)存储 emoji 表情。Server 配置和建表语句统一使用utf8mb4。

2025-02-05 20:44:55 407

原创 MySQL 时间相差 5 小时?你可能忽略了这个关键设置

最近经业务部门反馈,我们有个 APP 升级后,在发现,当前账号的最近登录时间为,相差了 5 个小时。

2025-02-05 20:38:32 245

原创 使用 binlog2sql 工具在线恢复数据

生产数据库执行 SQL 脚本,一般会经过正规的审批流程才能运行。但有些情况是例外的,业务部门在提出一些删除数据的需求后打算撤回,或者在运营后台不小心删除了一些数据,然后找到 DBA 团队协助,希望能恢复数据。经调研,binlog2sql 是大众点评开源的一款用于解析 MySQL binlog 的工具,根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL 等,适用于数据快速回滚(闪回)和主从切换后新 Master 丢数据的修复工作。

2025-02-05 20:29:19 744

原创 5 分钟轻松上手 Higress 金丝雀发布

在引入 Higress 云原生网关后,我们去除了,并且可以很方便的实现 A/B 测试、金丝雀发布等场景。单个路由不支持同时设置多个匹配规则,一个后端服务可能存在多个 API 路径,如果 API 规则太多,维护就变得比较困难。APISIX 允许你设置多个匹配规则。路由不支持 APISIX 的上线、下线,使用灰度发布场景,需要手动删除。不支持静态资源代理,只能把静态资源打包为 Pod 暴露出去,而 APISIX 可以通过 Nginx 底层配置实现。

2025-02-05 00:00:53 823

原创 使用 APISIX 轻松解决 Nginx 网络抖动问题

在引入 APISIX 云原生网关后,我们替换了 Nginx,解决了 Nginx reload 的网络抖动问题,并且可以很方便的实现 A/B 测试、金丝雀发布等场景。本文并没有探讨 APISIX Ingress Controller 的使用,因为 APISIX Dashboard 本身的功能已经足够满足我们的需求。

2025-02-04 23:56:42 763

原创 KubeVela 云原生应用交付实践

KubeVela 作为实现 OAM 的开源项目,使用感受如下。支持应用编排多个组件,一键部署,一键回收,实时观测服务状态。允许您修改运维组件,为团队定制服务。不过运维组件扩展不能新增?只能修改现有的组件,而且能修改的位置有限制。需要熟悉 CUE 语法,在配置 ConfigMap 这一块,没有可视化组件,只能自己写代码处理。和商业化 CODING 相比如下。不支持 CODING 勾选某些组件是否更新,不过这个问题不大,只要没有版本变化,不会触发更新。

2025-02-04 23:54:51 991

原创 KubeSphere 持续集成实践

KubeSphere DevOps 基本可以实现 CI/CD 的功能,但是功能不是很完善,单分支模式不支持 Git 事件触发流水线,只能使用 Cron 触发,多分支又不能在控制台管理,可能要等作者慢慢优化了。

2025-02-04 23:52:06 681

原创 CODING 云原生应用交付实践

CODING 整体使用感觉不错,可以满足我们的业务需求,但是 CODING 的发布功能还不太完善,需要后续优化。配置管理不支持在界面添加 Secret,建议在代码仓库新建文件,里面的内容通过 base64 编码保存。配置管理不支持删除 ConfigMap,这个是 CODING 的 Bug,目前只能在代码仓库删除。如果在部署流程选择了失败回滚,发布过程中点击了取消操作,建议等待一段时间,再次发布新版本。否则,有可能上一次版本在回滚,你发布的新版本会被回滚掉。如果在发布应用提示。

2025-02-04 23:46:30 1043

原创 使用 CODING 搭建前后端自动打包部署

由于笔者直接使用 CODING 节点托管部署,无法了解服务器内部的 Maven 细节,并且,Maven 的环境变动可能会影响整个构建计划不可用,因此,建议自定义来控制您的应用。首先,使用-s选项指定项目.coding目录的文件。Maven 配置文件的内容统一使用${env.xxx}变量,表示通过 CODING 的脚本传递环境变量,代码片段如下。

2025-02-04 23:45:42 1014

原创 Dockerfile 构建 Java 应用瘦身优化

早期我们对于 Docker 构建 Spring Boot 工程的方式很简单,直接构建生成 jar 可执行程序,通过启动。在实际的生产环境,可能定义了十几个甚至上百个 Deployment,每个 Deployment 根据不同的负载设置不同的 JVM 参数,没办法共享同一份 ConfigMap 文件。为了解决这个问题,我们应该优化下 Dockerfile 构建模板,把 JVM 参数和运行环境变量分离出去。

2025-02-04 23:38:31 1254 1

原创 Prometheus 动态获取 Pod 监控数据改造

Spring Boot Actuator 提供了一个监控和管理生产环境的端点,可以查看应用的运行状态。由于运维人员对 Prometheus 和 Grafana 的配置不是很熟悉,使用静态 IP 来获取监控数据,并且从 Grafana 模板市场获取的 Dashboard 不能较好的区分运行环境。使用 Prometheus 服务发现动态获取 Pod 的监控数据,支持 K8s 运行环境筛选监控数据。配置 Actuator 端点

2025-02-04 23:35:05 322

原创 log4j2.yaml 动态更新,免重启生效!

有时候生产环境需要临时调整日志级别 Level 或者修改日志输出路径 Appender,使用 Spring Boot 提供的日志刷新不能满足这个需求,最终还是重启服务才能生效。为了解决这个问题,需要实现 log4j2 配置文件的动态加载。

2025-02-04 23:27:49 703

原创 不修改程序,引入 Log4j2 插件实现日志脱敏!

日志脱敏是常见的安全需求。为了金融交易的安全性,国家强制规定对于等信息需要数据脱敏。一般我们会采取注解的形式指定字段进行脱敏处理,但这样对代码的侵入性较高。假设公司有几十个系统要改造,或者采购了一些系统没有源代码,怎么办?还有,日志脱敏后,系统用户需要通过手机号找出对应的日志,怎么匹配?

2025-02-04 23:26:01 662

原创 不重启服务,实现 Spring Bean 注册和销毁

Spring Boot Starters 的自动装配机制给我们提供了非常丰富的扩展点,但有时候需要动态开启或者关闭某些组件,只能修改配置,重启服务才能生效。例如,我们接入了 Arthas 工具,有时候需要关闭,有时候需要开启,但又不能随意重启服务。

2025-02-04 23:22:21 324

原创 分享一个通用的 Spring AOP 日志切面组件

看到有些框架在实现日志切面时,直接编写一个切面类,在@Aspect注解指定好 package 路径,然后通过开启 AOP。业务代码引入这个框架,必须按照框架约定好的 package 路径匹配,才能生效。这样的框架对业务代码有较大的侵入性,不适合所有场景。

2025-02-04 23:21:26 354

原创 教您如何扩展 Spring Boot @AutoConfiguration 开关

Spring Boot Starters 提供了很多常用的组件,有些组件例如Kafka和RocketMQ,引入到工程后会自动装配,它会检查您的配置,跟外部的组件创建一些连接,这个时候,我们很难控制Kafka关闭,RocketMQ开启。

2025-02-04 23:20:03 333

空空如也

空空如也

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

TA关注的人

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