MySQL 时区误差 5 小时
问题描述
最近经业务部门反馈,我们有个 APP 升级后,在 2023-01-09 22:47 发现,当前账号的最近登录时间为 2023-01-10 03:47,相差了 5 个小时。
第一轮排查:我们第一印象会认为是刚升级的代码出了问题,有可能是日期格式化没处理好,也有可能是 JSON 序列化没有指定时区,经过 Git diff 排查,我们并没有修改相关代码。
第二轮排查:可能是有人动了生产配置!排除了配置中心的改动,也检查了 K8s 的 Deployment 是否正确设置了 TZ=Asia/Shanghai,依然无果。
第三轮排查:提取线上部署的 jar,经过对比,我们发现 MySQL 驱动从原来的 5.1.45 升级到了 8.0.22 版本。
原因分析
生产数据库的配置是 time_zone=SYSTEM(对应 system_time_zone=CST,CST 时区没有标准,我们在使用 Java 客户端连接默认会把 CST 解析为时区+3,也就是当时事故出现的 5 小时误差)。
应用配置连接数据库的 jdbc-url 没有显示设置时区。MySQL驱动如果升级版本到 8.0 ...
MySQL 存储 emoji 报错
问题描述
在特定业务场景(帖子、评论、个人签名)存储 emoji 表情。如果使用 utf8 字符集存储,会抛出如下错误:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
原因分析
MySQL 的 utf8 编码最多支持 3 个字节,而 emoji 表情需要占用 4 个字节,在早期的版本并没有实现真正意义上的 utf8 字符集。MySQL 从 5.5.3 版本开始支持 utf8mb4 字符集,大多数情况下,我们使用的生产数据库都是 5.7.x 或者 8.0.x 版本,问题不大。
解决方案
备选方案
改造点
优缺点
把 utf8 编码改为 utf8mb4
客户端修改会话字符集服务端调整相关库表的字符集
更改大数据表困难
写入数据时编码,读取数据时解码还原
程序对每一个需要处理的字段进行修改,工作量不可控
不用修改生产数据库,DB 可读性差,额外性能消耗
正常情况下,我们会选择前者来解决这个问题。
查看 MySQL 服务端的字符集 ...
基于 Sentinel 实现历史监控数据回看
Sentinel 流量治理平台Sentinel 是阿里巴巴开源的流量治理平台,提供了 流量控制、熔断降级、系统负载保护、黑白名单访问控制 等功能。在实际的生产需求中,笔者进行了部分扩展:
流控规则持久化:适配 Apollo、Nacos、Zookeeper
监控数据持久化:适配 InfluxDB、Kafka、Elasticsearch
监控面板优化:新增时间控件,允许在任意时刻内查询监控数据。
您可以访问 GitHub 查阅源码。
演示图例改造前
改造后
快捷时间选择
自定义时间选择
如何构建本项目默认使用 Maven 来构建,最快的使用方式是 git clone 到本地。在项目的根目录执行 mvn install -T 4C 完成本项目的构建。
如何启动IDEA 启动本项目默认不依赖外部组件,可以直接启动运行。
在项目目录下运行 mvn install(如果不想运行测试,可以加上 -DskipTests 参数)。
进入 sentinel-dashboard 目录,执行 mvn spring-boot:run 或者启动 SentinelApplication 类。运行成功的话, ...
基于 Arthas 实现服务发现和权限控制
Arthas 在线诊断工具Arthas 是阿里巴巴开源的在线诊断工具,提供了 Dashboard 负载总览、Thread 线程占用、Stack 堆栈查看、Watch 性能观测 等功能。笔者参考原作者 @wf2311 的实现进行了优化:
服务发现:自动获取接入的应用列表 IP 和端口,无须手动输入 AgentId
权限控制:基于 Spring Security 实现登录控制,并支持 Nacos 动态绑定账号与服务
您可以访问 GitHub 查阅源码。
演示图例改造前
改造后
登录控制
配置管理
12345678910arthas: tunnel: users: - name: admin password: 123456 roles: '*' # 全部授权 - name: user password: 123456 roles: - eden-gateway # 特定服务授权
如何构建本项目默认使用 Maven 来构建,最快的使用方式是 git clone 到 ...
基于 CAT 增加链路跟踪和告警通知
CAT 实时监控平台CAT 是美团点评开源的实时应用监控平台,提供了 Tracsaction、Event、Problem、Business 等丰富的指标项。在实际的生产需求中,笔者进行了部分扩展:
链路跟踪:通过 TraceId 搜索消息树,定位问题更高效。
告警优化:支持邮件、钉钉、企业微信、飞书机器人推送,无需部署额外资源。
组件扩展:新增应用大盘、数据库大盘、缓存大盘、服务大盘告警。
您可以访问 GitHub 查阅源码。
演示图例改造前
改造后Dashboard
Tracing可以通过 TraceId 查找整个链路的 HTTP 请求耗时、RPC 调用情况、Log4j2 业务日志、SQL 和缓存执行耗时。
Alert
Transaction
Event
Business相对于 Transaction 和 Event 更宏观的指标,需要业务自己埋点。
推荐使用 eden-cat-spring-boot-starter 提供的 @CatMetric 注解实现埋点,支持 SpEL 表达式,代码示例如下:
1234@CatMetric(name = " ...
阿里巴巴分层应用架构实践
阿里巴巴分层应用架构
本项目使用分层架构构建,分层架构是《阿里巴巴Java开发手册》推荐使用的一种面向数据模型的架构风格,默认上层依赖于下层,例如 Web 层依赖 Service 层、Service 层又依赖 DAO 层,在垂直业务领域能够满足单一职责原则,通过 Maven 多模块化的开发模式,可以帮助降低复杂应用场景的系统熵值,提升系统开发和运维效率。您可以访问 GitHub 查阅源码。
组件构成
eden-demo-layer-api:API层,对外以 jar 包的形式提供接口。
eden-demo-layer-dao:数据持久层,与底层 MySQL、Elasticsearch、MongoDB 等进行数据交互。
eden-demo-layer-service:业务逻辑服务层。
eden-demo-layer-manager:通用业务处理层,对第三方平台进行接口封装,对 Service 层通用能力的下沉,如缓存方案、中间件通用处理,与 DAO 层交互,对多个 DAO 的组合复用。
eden-demo-layer-web:请求处理层,对访问控制进行转发,各类基本参数校验,或者不复用 ...
阿里巴巴 COLA 应用架构实践
阿里巴巴 COLA 应用架构
本项目使用 COLA 架构构建,COLA 架构是一个整洁的,面向对象的,分层的,可扩展的应用架构,可以帮助降低复杂应用场景的系统熵值,提升系统开发和运维效率。不管是传统的分层架构、六边形架构、还是洋葱架构,都提倡以业务为核心,解耦外部依赖,分离业务复杂度和技术复杂度等,COLA 架构在此基础上融合了 CQRS、DDD、SOLID 等设计思想,形成一套可落地的应用架构。您可以访问 GitHub 查阅源码。
组件构成
eden-demo-cola-adapter:适配层,六边形架构中的入站适配器。
eden-demo-cola-app:应用层,负责 CQRS 的指令处理工作,更新指令,调用领域层,查询视图操作,直接绕过领域层调用基础设施层。
eden-demo-cola-client:API层,对外以 jar 包的形式提供接口。
eden-demo-cola-domain:领域层,业务核心实现,不同于传统的分层架构,提供防腐层接口,不依赖基础设施层的技术实现。
eden-demo-cola-infrastructure:基础设施层,六边形架构中的出站适配器 ...
Eden* Business 商业组件
Eden* Business 商业集成Eden* Business 致力于提供企业开发的一站式解决方案,基于 Eden* Architect 构建。此项目包含开发分布式应用服务的必需组件,您只需要添加一些注解和少量配置,就可以将 Spring Boot 应用接入微服务解决方案,通过中间件来迅速搭建分布式应用系统。您可以访问 GitHub 查阅源码。
主要功能
阿里巴巴组件集成:提供了支付宝、阿里云产品组件的集成,例如支付宝、阿里云短信平台。
腾讯组件集成:提供了微信、腾讯云产品组件的集成,例如微信支付、腾讯云短信平台、对象存储、云点播。
梦网组件集成:提供了梦网短信平台组件的集成。
亿美云组件集成:提供了亿美短信平台组件的集成。
组件构成
eden-alibaba-spring-boot-starters: 阿里巴巴商业组件
eden-tencent-spring-boot-starters: 腾讯商业组件
eden-emay-spring-boot-starters: 亿美商业组件
eden-montnets-spring-boot-starters: 梦网商业组件
如何构建由 ...
从零封装 Spring 开发框架
Eden* Architect 开发框架Eden* Architect(伊甸园)致力于提供企业开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,您只需要添加一些注解和少量配置,就可以将 Spring Boot 应用接入微服务解决方案,通过中间件来迅速搭建分布式应用系统。您可以访问 GitHub 查阅源码。
功能特性
依赖管理和插件封装:统一管理依赖版本,解决依赖冲突问题,并提供常用插件的封装,让开发者减少在构建工具所消耗的时间。
常用组件集成与封装:在 Spring 官方的基础上扩展,提供 XxlJob、CAT、Netty、Arthas 等组件的集成。
组件适配及扩展点:针对现有主流技术点进行高级抽象,提供 消息队列、缓存、短信平台、邮件、Excel 等组件的动态适配。
通用场景解决方案:提供多级缓存、分布式锁、分布式唯一ID、幂等性处理、业务流程编排、最终一致性、全链路标记等解决方案工具。
组件构成
eden-dependencies: 依赖管理组件,管理全局依赖的版本。
eden-parent: 构建管理组件,封装常用插件,提供开箱即用的配置。
eden-commo ...