首页 文章 精选 留言 我的

精选列表

搜索[SpringBoot],共4561篇文章
优秀的个人博客,低调大师

《SpringBoot4进阶实战》第13招 数据库升级不能靠ddl-auto

# 数据库迁移:Entity 改字段为何不等于生产库已升级 ```text 旧方案:Hibernate ddl-auto 自动改表 → 生产库结构失控 → 数据丢失与发布事故 ``` 我是老李,在深圳做架构师,常年跟 Spring Boot 应用和 MySQL 打交道。 Petclinic 项目跑得好好的,可每次改个 Entity 字段,测试环境一切正常,一到生产就出幺蛾子。 Java Entity 改一个字段,为什么完全不能代表生产数据库已经安全升级? 选择 ddl-auto、schema.sql 还是 Flyway,哪种方式才能让 Schema 变更可控、可追溯、可回滚? 如果选错迁移方案,百万行数据的表升级失败,你拿什么恢复业务? # 01、故事 ```text 周五 17:50 → 深圳科兴科学园 3 栋 11 层 → 任务是给 Petclinic 的 owners 表加一个 email 字段 → 产品经理催着上线,测试环境一切正常,生产却报错 ``` 周五傍晚,我正准备收拾东西下班,产品经理小跑过来,说下周要给宠物主发营销邮件,owners 表必须加 email 字段。 任务是给 Petclinic 的 owners 表加一个 email 字段,改动不大,Entity 加个属性,数据库加一列,半小时搞定。 可我刚把代码提交,测试环境跑得飞起,生产数据库却直接抛异常,说 owners 表不存在 email 列。 我盯着屏幕,心里发毛:明明 Entity 改了,为什么生产库没跟上? > 代码改一行, > 数据库无响, > 生产报错急, > 谁在管 Schema? # 02、问题 ```text 需求变化:owners 表新增 email 字段 → 冲突:Entity 改了但生产库结构没变 → 后果:应用启动失败,查询报错,业务中断 ``` Petclinic 一直用 Hibernate 的 ddl-auto=update 管理表结构,开发时很方便,加个字段自动建列。 但生产环境我早就把 ddl-auto 设为 none,因为自动改表太危险,可能锁表、误删数据。 结果就是:代码里 Entity 加了 email,生产库还是老结构,应用一启动,Hibernate 校验失败,直接抛异常。 影响范围是全部依赖 owners 表的接口,比如查询宠物主列表、编辑宠物主信息,全部 500。 可验证的验收标准:应用启动时能自动执行数据库迁移,把 owners 表从 V1 升级到 V2,且迁移过程有日志、有版本记录。 > 开发一时爽, > 生产火葬场, > 结构无人管, > 升级全靠撞。 # 03、原理 ```text 核心机制:Schema 版本管理 = 把数据库结构变更当作代码,用版本化脚本顺序执行,记录当前版本,保证可重复、可审计 ``` 先看三种常见方式的职责边界。 Hibernate ddl-auto 是 ORM 层的自动建表工具,适合开发期快速原型,但生产环境必须关闭,因为它无法感知已有数据,可能删列、改类型导致数据丢失。 schema.sql 是 Spring Boot 启动时执行的 SQL 脚本,适合初始化表结构,但它是全量执行,没有版本概念,每次启动都跑一遍,无法增量升级。 Flyway 和 Liquibase 是专门的迁移工具,用版本号管理每个变更脚本,记录已执行版本,只执行未执行的脚本,保证幂等和可追溯。 反直觉判断:很多人以为 schema.sql 能替代 Flyway,其实 schema.sql 每次启动都执行,如果脚本里有 INSERT 语句,会导致重复数据; 而 Flyway 只执行一次,靠版本表记录。 另一个反直觉判断:数据库回滚通常比代码回滚复杂,因为代码回滚是替换文件,数据库回滚要处理数据变更,比如删了一列,回滚要恢复数据,可能涉及大量数据操作。 > 自动建表一时快, > 生产数据埋祸根, > 版本脚本管增量, > 迁移工具定乾坤。 # 04、架构 ```text 输入:Schema 变更需求(加字段、加约束、加索引) → 本模块:Flyway 迁移引擎 → 输出:数据库结构升级到目标版本,版本表记录历史 ``` 引入 Flyway 后,Petclinic 的数据库管理分三层。 第一层是应用代码层,Entity 定义 Java 对象,只负责 ORM 映射,不直接改表。 第二层是迁移脚本层,每个版本一个 SQL 文件,放在 src/main/resources/db/migration 下,Flyway 按版本号顺序执行。 第三层是数据库层,Flyway 创建 flyway_schema_history 表,记录每个脚本的执行状态,保证不重复执行。 边界很清晰:应用启动时,Flyway 先检查版本,执行未执行的脚本,然后 Hibernate 再启动,此时表结构已就绪,不会校验失败。 收益是 Schema 变更可审计、可回滚(通过编写反向脚本)、可协作(多个开发者各自加版本)。 代价是每个变更都要写 SQL 脚本,不能只改 Entity 就完事,增加了开发成本。 适用条件是团队有数据库变更规范,能接受 SQL 脚本作为变更的唯一入口。 > 三层各司其职, > 迁移脚本管版本, > 应用代码管映射, > 数据库稳定运行。 # 05、第一版实战 ```text 环境:Spring Boot 3.2 + MySQL 8 + Flyway 9.22 → 配置:添加依赖和配置 → 代码:编写 V1、V2、V3 迁移脚本 → 启动:应用启动时自动执行 → 验证:查询版本表和表结构 ``` 先看当前 Petclinic 的 pom.xml,添加 Flyway 依赖。 ```xml org.flywaydb flyway-core 9.22.3 org.flywaydb flyway-mysql 9.22.3 ``` 在 application.properties 中配置 Flyway,并关闭 Hibernate 的 ddl-auto。 ```properties spring.jpa.hibernate.ddl-auto=none spring.flyway.enabled=true spring.flyway.locations=classpath:db/migration spring.flyway.baseline-on-migrate=true ``` baseline-on-migrate=true 表示如果数据库已有表但没有版本表,Flyway 会创建基线,避免报错。 现在创建第一个迁移脚本 V1__init_schema.sql,初始化 Petclinic 的核心表。 ```sql -- V1__init_schema.sql CREATE TABLE owners ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(30) NOT NULL, last_name VARCHAR(30) NOT NULL, address VARCHAR(255), city VARCHAR(80), telephone VARCHAR(20) ); CREATE TABLE pets ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, birth_date DATE, owner_id INT NOT NULL, CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners(id) ); ``` V2 脚本添加 email 字段,并加唯一约束。 ```sql -- V2__add_email_to_owners.sql ALTER TABLE owners ADD COLUMN email VARCHAR(100); ALTER TABLE owners ADD CONSTRAINT uk_owners_email UNIQUE (email); ``` V3 脚本添加索引,优化按姓氏查询。 ```sql -- V3__add_index_on_owners_last_name.sql CREATE INDEX idx_owners_last_name ON owners(last_name); ``` 启动应用,观察日志。 ```text 示例输出: Flyway Community Edition 9.22.3 Successfully validated 3 migrations Current version of schema: 1 Migrating schema to version 2 Migrating schema to version 3 Successfully applied 2 migrations ``` 验证版本表。 ```sql SELECT version, description, success FROM flyway_schema_history; ``` ```text 示例输出: version | description | success 1 | init schema | 1 2 | add email to owners | 1 3 | add index on owners last | 1 ``` 验证表结构。 ```sql SHOW COLUMNS FROM owners; ``` ```text 示例输出: Field | Type | Null | Key | Default id | int | NO | PRI | NULL first_name | varchar(30) | NO | | NULL last_name | varchar(30) | NO | | NULL address | varchar(255) | YES | | NULL city | varchar(80) | YES | | NULL telephone | varchar(20) | YES | | NULL email | varchar(100) | YES | UNI | NULL ``` 成功标准:应用启动时自动执行迁移,owners 表新增 email 列和唯一约束,版本表记录 V1-V3。 未在当前环境实测,以上为预期结果,需按当前官方文档核验。 > 版本脚本写清楚, > 启动自动执行, > 表结构升级好, > 数据安全有保障。 # 06、排查 ```text 诊断树:迁移失败 → 检查版本表 → 检查 SQL 语法 → 检查权限 → 检查连接 ``` 问题一:应用启动报错,提示 Flyway 迁移失败。 现象:启动日志出现 ERROR,说 Migration V2 failed。 怀疑:SQL 语法错误或约束冲突。 检查:查看详细日志。 ```bash mvn spring-boot:run ``` ```text 示例输出: Migration V2__add_email_to_owners.sql failed SQL State : 23000 Error Code : 1062 Message : Duplicate entry 'john@example.com' for key 'owners.uk_owners_email' ``` 证据:owners 表已有重复 email 数据,导致唯一约束创建失败。 根因:生产数据不干净,直接加唯一约束会失败。 修复:先清理重复数据,再创建约束。 ```sql -- V2__add_email_to_owners.sql 修改版 ALTER TABLE owners ADD COLUMN email VARCHAR(100); UPDATE owners SET email = CONCAT('user', id, '@example.com') WHERE email IS NULL; ALTER TABLE owners ADD CONSTRAINT uk_owners_email UNIQUE (email); ``` 问题二:Flyway 校验失败,提示已应用的迁移被修改。 现象:启动报错,说 Migration checksum mismatch。 怀疑:有人改了已执行的 V1 脚本。 检查:查看版本表。 ```sql SELECT installed_rank, version, checksum FROM flyway_schema_history; ``` 证据:V1 的 checksum 与文件当前不一致。 根因:团队有人改了 V1 脚本,但 V1 已在生产执行过。 修复:禁止修改已执行的脚本,只能新增版本。如果必须改,用 Flyway repair 命令更新校验和。 ```bash mvn flyway:repair ``` **错误尝试:** 我一开始以为 Flyway 失败是数据库连接问题,反复检查连接池配置,浪费了半小时。后来看日志才发现是 SQL 约束冲突,教训是先看错误码和消息,别瞎猜。 > 迁移失败莫慌张, > 日志里面找真相, > 重复数据先清理, > 校验和变要 repair。 # 07、优化 ```text V1:直接加唯一约束 → 证据:生产数据有重复 → V2:先清理数据再加约束,并增加回滚脚本 ``` V1 的迁移脚本太天真,没考虑生产数据质量。 优化方案:在 V2 脚本中增加数据清理步骤,并编写 V2__rollback.sql 用于回滚。 修改后的 V2 脚本。 ```sql -- V2__add_email_to_owners.sql ALTER TABLE owners ADD COLUMN email VARCHAR(100); -- 清理重复数据,保留 id 最小的记录 UPDATE owners o1 JOIN owners o2 ON o1.email = o2.email AND o1.id > o2.id SET o1.email = CONCAT('user', o1.id, '@example.com'); ALTER TABLE owners ADD CONSTRAINT uk_owners_email UNIQUE (email); ``` 同时创建回滚脚本,放在 db/rollback 目录。 ```sql -- V2__rollback.sql ALTER TABLE owners DROP INDEX uk_owners_email; ALTER TABLE owners DROP COLUMN email; ``` Flyway 本身不支持自动回滚,但我们可以通过编写反向脚本,在需要时手动执行。 优化后,迁移脚本更健壮,能处理脏数据,且具备回滚能力。 > 数据质量先保证, > 约束才能建得稳, > 回滚脚本备一手, > 生产升级不慌张。 # 08、演进 ```text V2:Flyway 管理 Schema → 能力:版本化迁移、失败回滚、数据清理 → 遗留:百万数据表的兼容升级策略 ``` 引入 Flyway 后,Petclinic 的 Schema 变更有了版本控制,每次发布都自动执行迁移。 收益是开发、测试、生产环境结构一致,不再出现 Entity 改了但库没改的问题。 代价是每个变更都要写 SQL,且要维护回滚脚本,增加了工作量。 适用场景是任何需要长期演进的数据库应用,尤其是多人协作的项目。 遗留问题是:如果 owners 表已有百万行数据,加字段或加索引时,直接 ALTER TABLE 会锁表,导致业务中断。 用 V1 同一组请求验证:启动应用,查询 owners 列表,返回正常,说明迁移成功。 ```http GET /api/owners ``` ```text 示例输出: HTTP/1.1 200 OK [{"id":1,"firstName":"George","lastName":"Franklin","email":"george@example.com"}] ``` > 版本管理已就绪, > 百万数据待处理, > 锁表风险要规避, > 兼容升级需策略。 # 09、洞见 ```text 从现象到判断:Entity 改字段只是代码层变化,数据库结构必须通过迁移脚本显式变更,否则生产环境必然不一致 ``` ## 代码与数据库是两套生命周期 ```text 代码:编译 → 打包 → 发布 → 回滚(秒级) 数据库:结构变更 → 数据迁移 → 验证 → 回滚(分钟到小时级) ``` 代码和数据库的变更速度不同步,代码可以快速迭代,但数据库结构变更涉及数据安全,必须谨慎。 反直觉判断:很多人以为改 Entity 就等于改数据库,实际上 Entity 只是映射,数据库结构不会自动跟随。 ## 数据库回滚比代码回滚复杂得多 ```text 代码回滚:替换 jar 包 → 重启应用 → 完成(分钟级) 数据库回滚:执行反向 SQL → 数据恢复 → 验证一致性 → 可能丢失新数据(小时级) ``` 代码回滚是替换文件,数据库回滚要处理数据变更,比如删了一列,回滚要恢复数据,但新写入的数据可能无法恢复。 反直觉判断:Flyway 不支持自动回滚,因为自动回滚可能造成数据丢失,所以通常用 forward 修复,而不是 backward 回滚。 ## 迁移脚本是团队契约 ```text 开发 A:V2 加字段 开发 B:V3 加索引 生产:按顺序执行 V1→V2→V3 ``` 迁移脚本是团队协作的契约,每个版本只能追加,不能修改已执行的脚本,否则校验和会失败。 ## 生产环境必须用迁移工具 ```text ddl-auto=update:开发方便,生产危险 schema.sql:初始化可以,增量不行 Flyway:版本化,可追溯,适合生产 ``` 生产环境必须用 Flyway 或 Liquibase,因为只有它们能保证 Schema 变更的可控性。 > 代码库是代码, > 数据库是数据, > 迁移脚本连两者, > 版本管理保平安。 # 10、系统落地 ```text 入口:Petclinic 应用启动 → 服务:Flyway 迁移引擎 → 本模块:Schema 版本管理 → 存储:MySQL 数据库 → 未实现:百万数据表的在线迁移策略 ``` 原来 Petclinic 用 Hibernate ddl-auto 管理表结构,开发方便但生产不可控。 本篇增加了 Flyway 依赖和配置,创建了 V1-V3 迁移脚本,实现了 Schema 版本管理。 现在 Petclinic 启动时会自动执行迁移,表结构变更可追溯、可回滚。 下一篇将处理百万数据表的兼容升级,比如用 Expand/Contract 模式,先加字段(Expand),再迁移数据,最后删旧字段(Contract)。 官方文档:Spring Boot 参考文档、Flyway 官方文档。 > 版本管理已落地, > 百万数据待挑战, > Expand 再 Contract, > 在线升级不中断。 # 11、小结 ```text 三问三答:Entity 改字段不等于数据库升级;选择 Flyway 而非 ddl-auto;选错会导致生产事故 ``` 第一问:Java Entity 改一个字段,为什么不能代表生产数据库已经安全升级? 因为 Entity 只是 Java 对象,数据库结构不会自动跟随,必须通过迁移脚本显式变更。 第二问:选择 ddl-auto、schema.sql 还是 Flyway? 生产环境必须用 Flyway,因为它有版本记录、可重复执行、可回滚,而 ddl-auto 危险,schema.sql 无版本。 第三问:选错迁移方案会有什么后果? 选错会导致生产库结构不一致,应用启动失败,甚至数据丢失,回滚复杂且耗时。 当前状态:Petclinic 已引入 Flyway,Schema 变更纳入版本管理,启动自动迁移。 > 三问三答已清晰, > 迁移工具选 Flyway, > 版本脚本管变更, > 生产升级有保障。 # 12、作业 ```text 理解 → 实战 → 排障 → 架构判断 ``` ## 理解题:为什么 Hibernate ddl-auto=update 不适合生产环境? 因为 ddl-auto=update 会在启动时自动修改表结构,可能删除列、改变数据类型,导致数据丢失,且无法控制执行顺序,没有版本记录。 ## 实战题:给 Petclinic 的 visits 表添加一个 visit_date 索引,并创建 V4 迁移脚本。 创建 V4__add_index_on_visits_visit_date.sql。 ```sql CREATE INDEX idx_visits_visit_date ON visits(visit_date); ``` 启动应用,验证版本表新增 V4。 ## 排障题:Flyway 迁移失败,提示 Duplicate column name 'email',如何排查? 先查看版本表,确认 V2 是否已执行。 ```sql SELECT version, success FROM flyway_schema_history; ``` 如果 V2 已成功,但表里没有 email 列,可能是有人手动删了列,导致 Flyway 认为已执行。 修复:手动添加列,或用 Flyway repair 更新状态。 ## 架构判断题:百万数据表加索引,直接 CREATE INDEX 会锁表,如何设计兼容升级? 使用 Expand/Contract 模式:先创建索引(用 ALGORITHM=INPLACE, LOCK=NONE),然后逐步迁移数据,最后删除旧索引。 > 作业四题练一练, > 理解实战加排障, > 架构判断想清楚, > 迁移技能更上一层。 # 13、升华 ```text 工程结论:数据库迁移是生产级应用的必备能力,版本化脚本是唯一可靠的方式,Entity 只是代码层,不能替代数据库变更管理 ``` 从 Petclinic 的实战中,我们验证了 Flyway 的价值:它让 Schema 变更像代码一样可版本化、可审计、可回滚。 但真正的挑战在百万数据表的在线迁移,需要结合 Expand/Contract 模式、在线 DDL 和 CI/CD 流程。 下一篇将深入探讨如何让迁移进入 CI/CD,以及如何设计零停机升级。 > 迁移工具已就位, > 百万数据待处理, > CI/CD 集成好, > 生产升级零停机。 **系列项目:** Spring Petclinic 生产级演进,服务对象是宠物诊所业务。 **已完成:** 环境搭建、启动机制、依赖与自动配置、配置体系、Web 安全、数据访问、事务管理、远程调用、数据库迁移基础(Flyway 版本管理)。 **本篇:** 将 Petclinic Schema 纳入 Flyway 版本管理,建立 V1→V3 迁移链,处理脏数据与回滚脚本。 **下一篇:** 百万数据表的 Expand/Contract 兼容升级与 CI/CD 集成。

优秀的个人博客,低调大师

IG-REPORT企业智能报表 基于springboot+vue 轻松实现30s出报表

传统报表方式的弊端 报表是所有企业都必要的分析决策工具,传统的展示报表的方式特别麻烦,还记得两年前我入职的时候,领导让我做一个报表,步骤大概要经历1、数据库中创建一个目的表 存储SQL跑批后的结果 2、开发后端代码 从service到dao层都要开发 还要实现定时调度 3、开发前端代码 htmlcssjqueryajax等这些步骤从技术的角度来看算简单的、但却永远在做重复的事情。大概需要花费一小时时间和500行+代码。除了繁琐的程序、无意义的重复代码和工作,还有很多痛点:1、没有统一的调度平台、如果不看代码我就不知道今天要执行多少报表任务、不知道何时执行、不知道执行是否成功、失败了没有告警机制、失败了要登录服务器看日志才知道错误信息等。2、不能实时的对报表任务进行管理、比如一个大sql跑了20分钟我需要kill掉,要去服务器操作、很麻烦;不能实时查看报表日志掌握第一手消息。3、报表数据其实没有必要新建一个表来存储、这样未免太浪费资源和时间。。等等。。。而这些,在IG-REPORT中你都可以解决。 IG-REPORT智能报表 github地址:https://github.com/LYL41011/igreportIG-REPORT智能报表适用于任何企业、支持多种数据源、只需要30s就可以完成一个报表的配置。大概功能如下: 1、首页总体概览、清晰知道整个公司目前一个报表的数量、调度的次数、并且有耗时统计、失败统计等,方便揪出那些异常的报表 2、web界面一键化配置报表、支持多种数据源(MYSQLTIDBPrestoPgxl 其他也都行 自己开发就好)、只要把sql和sql对应的元数据信息配上去,其他所有事都交给IG-REPORT去完成 3、如果通用报表配置不能满足您的要求、完全可以自行开发某些特定报表,比如我的需求不仅仅是写个sql跑出数据来就行,我数据来源是kafka,那么你可以自行开发一个kafkaHandler。 3、分布式调度平台,基于quartz做了很多改造。(注:调度这块大部分是直接用的xxl-job源码,这是一个非常好的分布式调度平台)4、统一的任务管理平台,动态修改任务参数、启动、禁用任务 5、在线查看调度结果,可动态终止运行中任务,即时生效;并且实时的展示完整的调度日志。 6、任务失败告警、可以配置多人的邮箱。 7、报表具有权限控制、创建报表的时候需指定授权用户,其他用户则无法看见。 8、管理员可以查看和操控所有的任务、可以管理用户、普通用户只可以查看自己的任务

优秀的个人博客,低调大师

java B2B2C Springboot仿淘宝电子商城系统--Spring Cloud Gateway

1.Spring Cloud Gateway 是什么 Spring Cloud Gateway 基于 Spring Boot 2, 是 Spring Cloud 的 全新 项目, 该项 目 提供 了 一个 构建 在 Spring 生态 之上 的 API 网关, 包括 Spring 5、 Spring Boot 2 和 Project Reactor。 Spring Cloud Gateway 旨在 提供一种简单而有效的途径来转发 请求,并为它们提供横切 关注点, 例如: 安全性/监控/ 指标和弹性。愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三 2.Spring Cloud Gateway 特性基于 Java 8 编码;基于Spring Framework 5,Project Reactor和Spring Boot 2.0构建支持动态路由,能够匹配任何请求属性上的路由。支持 内置 到 Spring Handler 映射 中的 路 由 匹配;支持 基于 HTTP 请求 的 路 由 匹配( Path、 Method、 Header、 Host 等);集成了Hystrix断路器过滤器 作用于 匹配 的 路 由;过滤器可以修改 HTTP 请求和HTTP 响应( 增加/ 修改 头部、 增加/ 修改 请求 参数、 改写 请求 路径 等);支持 Spring Cloud DiscoveryClient 配置路由,与服务发现与注册配合使用。支持限流支持地址重写3.Spring Cloud Gateway 词汇Route(路由): 路由网关的基本构建块。 它由ID,目标URI,谓词集合和过滤器集合定义。 如果聚合谓词为真,则匹配路由。 Predicate: 这是一个Java 8函数谓词。 输入类型是Spring Framework ServerWebExchange。 这允许开发人员匹配HTTP请求中的任何内容,例如标头或参数。 Filter: 这些是使用特定工厂构建的Spring Framework GatewayFilter实例。 这里,可以在发送下游请求之前或之后修改请求和响应。 4.Spring Cloud Gateway 与 Zuul的区别在 Finchley 正式版之前,Spring Cloud 推荐的网关是 Netflix 提供的Zuul: 1、Zuul 1.x,是一个基于阻塞 I/ O 的 API Gateway 2、Zuul 1.x 基于Servlet 2. 5,使用阻塞架构,它不支持任何长连接,如 WebSocket。 Zuul 的设计模式和Nginx较像,每次 I/ O 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是Nginx 用C++ 实现,Zuul 用 Java 实现,而 JVM 本身会有第一次加载较慢的情况,使得Zuul 的性能相对较差。 3、Zuul 2.x,基于 Netty 非阻塞、支持长连接,但 Spring Cloud 目前还没有整合。 Zuul 2.x的性能较 Zuul 1.x 有较大提升。在性能方面,根据官方提供的基准测试, Spring Cloud Gateway 的 RPS(每秒请求数)是Zuul 的 1. 6 倍。 4、Spring Cloud Gateway 建立 在 Spring Framework 5、 Project Reactor 和 Spring Boot 2 之上, 使用 非 阻塞 API。 5、Spring Cloud Gateway 还 支持 WebSocket, 并且 与 Spring 紧密集成, 拥有更好的开发体验技术架构图:资料和源码来源

优秀的个人博客,低调大师

SpringBoot应用和PostgreSQL数据库部署到Kubernetes上的一个例子

创建一个名为ads-app-service的服务: 上述Service的yaml文件里每个字段,在Kubernetes的API文档里有详细说明。 https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#servicespec-v1-core 如何找到这个url呢? Reference->API Reference->v1.12: 比如Service yaml文件里Spec区域需要出现的字段,每个字段在帮助文档里有详细说明: Spec部分的子区域ports可以定义多个port,通过符号"-"代表一个类似数组的结构: ports数组里每个元素包含的字段: name nodePort port protocol targetPort 用kubectl create -f

优秀的个人博客,低调大师

【熵增教育】Jacob-你所遗漏的SpringBoot日志管理知识——熵增学院

Spring Boot对所有内部日志记录使用了Commons Logging,但是底层日志实现是开放的。可以为 Java Util日志、Log4J2和Logback。对于每种日志都预先配置为使用控制台输出和可选的文件输出。默认为Logback 日志配置 通过将相应的库添加到classpath可以激活各种日志系统,然后在classpath根目录下提供合适的配置文件可以进一步定制日志系统,配置文件也可以通过Spring Environment的logging.config属性指定。 以下文件会根据你选择的日志系统进行加载: 日志系统 定制配置 Logback logback-spring.xml,logback-spring.groovy,logback.xml或logback.groovy Log4j log4j.properties或log4j.xml Log4j2 log4j2-spring.xml或log4j2.xml JDK (Java Util Logging) logging.properties 注 如果可能的话,建议你使用-spring变种形式定义日志配置(例如,使用logback-spring.xml而不是logback.xml)。如果你使用标准的配置路径,Spring可能不能够完全控制日志初始化。 注 Java Util Logging从可执行jar运行时会导致一些已知的类加载问题,我们建议尽可能不使用它。 以下是从Spring Envrionment转换为System properties的一些有助于定制的配置属性: Spring Environment System Property Comments logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD 记录异常使用的关键字 logging.file LOG_FILE 如果指定就会在默认的日志配置中使用 logging.path LOG_PATH 如果指定就会在默认的日志配置中使用 logging.pattern.console CONSOLE_LOG_PATTERN 日志输出到控制台(stdout)时使用的模式(只支持默认的logback设置) logging.pattern.file FILE_LOG_PATTERN 日志输出到文件时使用的模式(如果LOG_FILE启用,只支持默认的logback设置) logging.pattern.level LOG_LEVEL_PATTERN 用来渲染日志级别的格式(默认%5p,只支持默认的logback设置) PID PID 当前的处理进程(process)ID(能够找到,且还没有用作OS环境变量) 所有支持的日志系统在解析配置文件时都能获取系统属性的值,具体可以参考spring-boot.jar中的默认配置。 log4j2配置 一份史诗级配置 /home/logs/log/dev \ \ \ \ </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console"/> <AppenderRef ref="debug"/> <AppenderRef ref="info"/> <AppenderRef ref="warn"/> <AppenderRef ref="error"/> </Root> </Loggers> 各个文件输出到不同级别的目录 设置最大保存时间为15天 每个文件最大50M tomcat的日志 在properties文件添加如下配置: server.tomcat.basedir=/home/logs/log-api/tomcat-logs server.tomcat.accesslog.enabled=true server.tomcat.accesslog.pattern=%t %a "%r" %s %D (%D ms) server.use-forward-headers=true lombok的神组合 使用lombok的@Slf4j 注解,省去配置声明log的繁琐,提高开发效率。 idea的 grep console组合 Grep Console 自定义设置控制台输出颜色,这样控制台就能比较明显的看到警告或者错误的信息,方便查找问题 视频:https://space.bilibili.com/313762729/#/

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册