这次我们来看一个 Java 后端开发中非常实用的技术组合MyBatis-Plus 在 JDK 17 和 Spring Boot 3 环境下的集成与应用。这个组合不是新概念但却是当前构建现代化、高性能 Java 应用的主流选择。很多开发者关心的是这套组合到底好不好用从 JDK 8 升级过来有没有坑MyBatis-Plus 那些“开箱即用”的功能在 Spring Boot 3 里还灵不灵性能提升是否明显本文将直接切入核心带你快速验证这套技术栈的可用性。我们会重点关注环境搭建的门槛JDK 17 安装、Spring Boot 3 项目创建、MyBatis-Plus 核心功能的启动与验证CRUD、分页、代码生成、性能与兼容性观察特别是分页限制、枚举映射等热点问题以及如何将其接入更复杂的场景如整合 Kafka 进行日志记录。读完本文你将能独立完成一个基于 JDK 17 Spring Boot 3 MyBatis-Plus 的基础服务搭建并清楚知道在生产环境中需要注意哪些关键点。1. 核心能力速览在深入细节之前我们先通过一个表格快速了解这个技术栈的核心价值和关键信息让你判断是否值得继续往下看。能力项说明技术栈构成JDK 17 (LTS) Spring Boot 3.x MyBatis-Plus 3.5主要优势1.开发效率MyBatis-Plus 提供强大的单表 CRUD 和条件构造器减少大量 SQL 编写。2.运行性能JDK 17 在 GC、容器支持等方面有优化Spring Boot 3 基于 Spring 6支持 Native Image。3.现代特性全面拥抱 Java 17 特性如 Record、Text Block和 Jakarta EE 9 命名空间。环境门槛需安装 JDK 17 或更高版本。IDE如 IntelliJ IDEA 2022.3需支持 Spring Boot 3。启动方式标准 Spring Boot 应用启动方式通过main方法或mvn spring-boot:run命令启动。接口能力通过 Spring MVC 或 WebFlux 暴露 RESTful APIMyBatis-Plus 负责数据持久层。“批量任务”支持支持基于 MyBatis-Plus 的Service和Mapper进行批量插入/更新操作。适合场景新建的微服务或单体应用、从 JDK 8/11 升级的项目、需要快速进行数据层开发的后台系统。2. 适用场景与使用边界这套组合拳并非万能明确其适用边界能帮助你做出更好的技术选型。它非常适合以下场景快速启动新项目你需要快速搭建一个数据驱动型的 Web 服务不想在基础的增删改查上花费太多时间。技术栈升级你的团队计划将现有项目从 JDK 8/11 升级到 JDK 17并同步更新 Spring Boot 和 MyBatis-Plus 以获取新特性和性能提升。追求开发体验你希望使用 Lambda 表达式、Stream API、Record 类等现代 Java 语法并与简洁的 MyBatis-Plus API 结合。中等复杂度的业务系统业务逻辑主要围绕单表操作或虽有联表但复杂度可控MyBatis-Plus 的条件构造器和自定义 SQL 能够较好支持。需要注意或可能不合适的场景极度复杂的动态 SQL如果业务查询条件极其复杂、动态性极高且需要高度优化的 SQL手写 XML 或使用其他更灵活的 SQL 构建器可能是更好选择。MyBatis-Plus 的Wrapper虽强但也有其复杂度上限。对原生 MyBatis 有深度定制如果你的项目重度依赖 MyBatis 的某些内部机制或插件升级到 MyBatis-Plus 可能需要额外的兼容性测试。必须使用 JDK 8 的遗留环境由于 Spring Boot 3 最低要求 JDK 17无法在旧 JDK 环境下运行。合规与安全边界依赖安全确保使用的 MyBatis-Plus、Spring Boot 等依赖来自官方仓库如 Maven Central并关注其安全公告。SQL 注入防护虽然 MyBatis-Plus 的Wrapper使用了预编译语句能有效防止大部分注入但在拼接自定义 SQL 片段时仍需保持警惕。数据隐私在使用 MyBatis-Plus 的字段加解密拦截器等组件时需确保加密算法和密钥管理的安全性符合公司数据安全规范。3. 环境准备与前置条件开始编码前需要准备好以下环境。这是保证后续一切步骤顺利的基础。JDK 17这是 Spring Boot 3 的强制要求。从 Oracle 官网或 Adoptium 等渠道下载并安装。验证安装在终端运行java -version确认输出包含17。环境变量配置好JAVA_HOME和PATH。构建工具Maven (3.6) 或 Gradle (7.x)。本文以 Maven 为例。IDE推荐 IntelliJ IDEA (2022.3 及以上版本) 或 Spring Tools 4 for Eclipse它们对 Spring Boot 3 和 Java 17 有更好的支持。数据库准备一个数据库实例如 MySQL 5.7/8.0。确保你有连接权限并创建一个用于测试的数据库例如mybatis_plus_demo。网络确保能正常访问 Maven 中央仓库以下载项目依赖。4. 安装部署与项目启动我们从一个干净的 Spring Boot 3 项目开始集成 MyBatis-Plus。4.1 创建 Spring Boot 3 项目使用 Spring Initializr 或 IDE 的创建向导。Project: MavenLanguage: JavaSpring Boot: 3.x.x (当前最新稳定版如 3.2.5)Project Metadata按需填写 Group、Artifact。Dependencies: 添加Spring Web,MySQL Driver,MyBatis Framework。注意这里先添加官方的MyBatis Framework我们稍后会用 MyBatis-Plus 替换其依赖。生成项目后用 IDE 打开。4.2 引入 MyBatis-Plus 依赖打开pom.xml文件移除Spring Initializr 生成的mybatis-spring-boot-starter依赖并添加 MyBatis-Plus 的 Spring Boot 3 专用 starter。dependencies !-- Spring Boot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis-Plus Spring Boot 3 Starter -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-spring-boot3-starter/artifactId version3.5.6/version !-- 请使用最新稳定版 -- /dependency !-- MySQL 驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- 其他依赖... -- /dependencies关键点务必使用mybatis-plus-spring-boot3-starter这是为 Spring Boot 3 适配的版本。使用旧的mybatis-plus-boot-starter可能会导致兼容性问题。4.3 配置数据库连接在application.yml或application.properties中配置数据库连接。以下是 YAML 格式示例spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis_plus_demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: yourpassword # MyBatis-Plus 配置 mybatis-plus: configuration: # 控制台打印完整带参数 SQL log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: # 全局逻辑删除字段名如果使用 logic-delete-field: deleted # 逻辑已删除值 logic-delete-value: 1 # 逻辑未删除值 logic-not-delete-value: 0配置中的log-impl对于调试 SQL 非常有用生产环境建议关闭。4.4 启动项目验证创建一个简单的实体类和 Mapper 接口。实体类User.java:import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; // 需要 lombok 依赖 Data TableName(user) // 指定表名如果表名与类名一致可省略 public class User { TableId(type IdType.AUTO) // 主键自增 private Long id; private String name; private Integer age; private String email; }Mapper 接口UserMapper.java:import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; Mapper // 或在启动类加 MapperScan public interface UserMapper extends BaseMapperUser { // 继承 BaseMapper 后基本的 CRUD 方法已自动拥有 }在数据库创建user表:CREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT, name varchar(255) DEFAULT NULL, age int DEFAULT NULL, email varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB;启动主类运行 Spring Boot 的main方法。如果控制台没有报错并且看到Tomcat started on port(s): 8080类似的日志说明基础环境已成功启动。5. 功能测试与效果验证环境跑通了接下来我们实测 MyBatis-Plus 的核心功能。我们将通过编写一个简单的 Service 和 Controller 来测试。5.1 基础 CRUD 测试创建一个UserService和UserController。// UserService.java import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; Service public class UserService extends ServiceImplUserMapper, User { // 继承 ServiceImpl 后获得了 save, getById, updateById, removeById, list 等方法 }// UserController.java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; RestController RequestMapping(/user) public class UserController { Autowired private UserService userService; // 1. 新增 PostMapping public boolean saveUser(RequestBody User user) { return userService.save(user); } // 2. 根据ID查询 GetMapping(/{id}) public User getById(PathVariable Long id) { return userService.getById(id); } // 3. 条件查询使用LambdaQueryWrapper类型安全 GetMapping(/list) public ListUser listUsers(RequestParam(required false) Integer minAge) { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); if (minAge ! null) { wrapper.ge(User::getAge, minAge); // age minAge } return userService.list(wrapper); } // 4. 分页查询重点测试 GetMapping(/page) public PageUser pageUsers(RequestParam(defaultValue 1) long current, RequestParam(defaultValue 10) long size) { PageUser page new Page(current, size); return userService.page(page); } // 5. 更新 PutMapping public boolean updateUser(RequestBody User user) { return userService.updateById(user); } // 6. 删除 DeleteMapping(/{id}) public boolean deleteUser(PathVariable Long id) { return userService.removeById(id); } }测试步骤启动应用。使用 Postman 或 curl 测试/userPOST 接口插入几条数据。测试/user/list和/user/page接口观察返回结果。观察控制台MyBatis-Plus 是否打印出了执行的 SQL 语句。这是验证其是否正常工作的最直观方式。预期结果所有接口应能正常返回数据控制台打印出类似 Preparing: SELECT id,name,age,email FROM user LIMIT ?的 SQL 日志。5.2 分页功能深度测试应对“单页500条限制”网络热词中提到了“接触mybatisplus单页500条限制”这是一个常见问题。MyBatis-Plus 的分页插件默认有最大单页数量限制吗我们来验证。实际上MyBatis-Plus 分页插件本身没有硬编码的 500 条限制。这个限制通常来源于前端或客户端自己设定的请求参数。业务逻辑在 Service 层手动限制了size参数。数据库性能考虑DBA 或架构师建议的单页查询上限。如何验证和设置MyBatis-Plus 的分页参数size直接映射到 SQL 的LIMIT。如果你需要调整或设置一个全局最大限制可以通过自定义分页插件来实现。import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); PaginationInnerInterceptor paginationInnerInterceptor new PaginationInnerInterceptor(); // 设置数据库类型 paginationInnerInterceptor.setDbType(DbType.MYSQL); // 设置最大单页限制数量默认无限制-1表示不受限。这里设为1000。 paginationInnerInterceptor.setMaxLimit(1000L); // 开启 count 查询优化例如根据情况智能不进行 count 查询 // paginationInnerInterceptor.setOptimizeJoin(true); interceptor.addInnerInterceptor(paginationInnerInterceptor); return interceptor; } }通过setMaxLimit(1000L)你可以确保通过 MyBatis-Plus 分页查询时size参数不会超过 1000。如果查询超过此限制会自动修正为最大值。这解释了为什么有时感觉有“限制”。5.3 枚举映射功能测试“mybatisplus 映射枚举有什么好处”也是搜索热点。MyBatis-Plus 提供了优雅的枚举类型与数据库字段的映射。好处类型安全在代码中使用枚举避免魔法数字或字符串。可读性强业务状态如ORDER_STATUS.PAID比数字1更清晰。减少错误编译器会检查枚举值运行时错误减少。如何实现假设User有一个状态字段status在数据库中存储为整数。定义枚举public enum UserStatus { INACTIVE(0, 未激活), ACTIVE(1, 已激活), LOCKED(2, 已锁定); private final int code; private final String desc; UserStatus(int code, String desc) { this.code code; this.desc desc; } public int getCode() { return code; } // 可以根据 code 获取枚举的静态方法... }修改实体类public class User { // ... 其他字段 private UserStatus status; // 直接使用枚举类型 }配置枚举处理器Spring Boot 3 MyBatis-Plus 3.5 通常已自动配置通用枚举处理器。为了确保生效可以在application.yml中显式配置mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler测试插入和查询一个User对象观察status字段是否能在 Java 枚举和数据库int之间正确转换。5.4 自动生成代码功能测试“mybatisplus自动生成代码”是提升效率的利器。MyBatis-Plus 提供了一个代码生成器模块。添加生成器依赖在pom.xml中作用域设为test或单独的工具模块dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version3.5.6/version scopetest/scope /dependency !-- 默认引擎是 Velocity也可以用 Freemarker 或 Beetl -- dependency groupIdorg.apache.velocity/groupId artifactIdvelocity-engine-core/artifactId version2.3/version scopetest/scope /dependency编写一个简单的生成器类例如在test目录下import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine; import java.util.Collections; public class CodeGenerator { public static void main(String[] args) { String url jdbc:mysql://localhost:3306/mybatis_plus_demo; String username root; String password yourpassword; FastAutoGenerator.create(url, username, password) .globalConfig(builder - { builder.author(YourName) // 作者 .outputDir(System.getProperty(user.dir) /src/main/java) // 输出目录 .disableOpenDir(); // 生成后不打开目录 }) .packageConfig(builder - { builder.parent(com.example.demo) // 父包名 .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty(user.dir) /src/main/resources/mapper)); // XML 位置 }) .strategyConfig(builder - { builder.addInclude(user) // 要生成的表 .addTablePrefix(t_, sys_) // 过滤表前缀 .entityBuilder() // 实体策略 .enableLombok() // 使用 Lombok .controllerBuilder() // Controller 策略 .enableRestStyle(); // 生成 RestController }) .templateEngine(new VelocityTemplateEngine()) .execute(); } }运行执行main方法即可在指定包下生成User的Entity,Mapper,Service,Controller等全套代码。6. 接口 API 与“批量任务”实现MyBatis-Plus 的 Service 层提供了批量操作方法可以方便地实现“批量任务”。6.1 批量插入与更新// 在 UserService 中新增方法 public boolean saveBatchUsers(ListUser userList) { // 参数1实体列表参数2每批插入的数量默认 1000 return saveBatch(userList, 500); } public boolean updateBatchUsers(ListUser userList) { return updateBatchById(userList, 500); }saveBatch方法内部会进行分批提交避免单次 SQL 语句过长。这对于数据导入等场景非常有用。6.2 整合 Kafka 记录日志响应热词“mybatisplus整合kafuka记录日志”是一个具体的应用场景。我们可以利用 Spring Boot 3 的事件监听机制在 MyBatis-Plus 执行 SQL 前后将日志发送到 Kafka。添加 Kafka 依赖dependency groupIdorg.springframework.kafka/groupId artifactIdspring-kafka/artifactId /dependency创建一个事件监听器监听 SQL 执行事件简化示例实际需捕获更多信息import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.producer.ProducerRecord; import org.springframework.context.event.EventListener; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; Component Slf4j public class SqlExecutionLogger { private final KafkaTemplateString, String kafkaTemplate; public SqlExecutionLogger(KafkaTemplateString, String kafkaTemplate) { this.kafkaTemplate kafkaTemplate; } // 可以监听 MyBatis 的特定事件这里用自定义事件举例 // 实际中你可能需要自定义一个切面Aspect来捕获 MyBatis-Plus Mapper 方法的执行 EventListener TransactionalEventListener(phase TransactionPhase.AFTER_COMPLETION) public void handleSqlEvent(/* 自定义事件对象包含 SQL、参数、执行时间等 */) { String sqlLog SQL executed: ...; // 构造日志信息 log.info(Sending SQL log to Kafka: {}, sqlLog); // 发送到 Kafka 主题 kafkaTemplate.send(new ProducerRecord(sql-execution-logs, sqlLog)); } }注意更常见的做法是使用MyBatis-Plus 的插件机制如InnerInterceptor来捕获 SQL 执行信息然后将信息发布为 Spring 事件再由上述监听器发送到 Kafka。这实现了业务逻辑与日志上报的解耦。7. 资源占用与性能观察对于 Java 后端服务资源占用主要体现在内存JVM Heap和CPU。JDK 17 配合 Spring Boot 3在合理的 JVM 参数下通常有不错的表现。JVM 参数建议在application.yml或启动命令中设置。spring: application: name: mybatis-plus-demo # JVM 参数可以通过环境变量或启动脚本设置例如 # JAVA_OPTS-Xms512m -Xmx1024m -XX:UseG1GC-Xms和-Xmx设置堆内存初始大小和最大值。根据应用负载调整微服务建议-Xms512m -Xmx1024m起步。-XX:UseG1GCJDK 9 以后的默认 GC在 JDK 17 上表现良好。数据库连接池Spring Boot 默认使用 HikariCP性能很好。关注spring.datasource.hikari.*配置如maximum-pool-size默认 10避免过大导致数据库连接耗尽。MyBatis-Plus 性能观察SQL 打印开发环境开启log-impl有助于观察 SQL 是否合理是否存在 N1 查询问题。分页查询 Count大数据量表分页时SELECT COUNT(*)可能很慢。考虑使用Page对象的setSearchCount(false)来禁用 count 查询或者使用 MyBatis-Plus 分页插件的optimizeJoin等优化。批量操作务必使用saveBatch而非循环save性能差异巨大。如何监控本地使用 JConsole、VisualVM 或更现代的 JDK Mission Control 连接本地进程观察堆内存、GC 和线程状态。生产集成 Micrometer 和 Prometheus暴露/actuator/metrics端点监控 JVM 和数据库连接池指标。8. 常见问题与排查方法以下是集成和使用过程中可能遇到的典型问题及解决思路。问题现象可能原因排查方式解决方案启动报错java.lang.UnsupportedClassVersionErrorJDK 版本不匹配。Spring Boot 3 需要 JDK 17。运行java -version确认版本。安装并配置 JDK 17 或更高版本。启动报错Failed to configure a DataSource数据库连接配置错误或数据库服务未启动。1. 检查application.yml中的url,username,password。2. 检查数据库服务是否运行网络是否通畅。修正配置确保数据库可连接。如果无需数据源可排除DataSourceAutoConfiguration。MyBatis-Plus 的 CRUD 方法不生效1. Mapper 接口未扫描。2. 实体类与表映射不正确。1. 检查 Mapper 接口是否有Mapper注解或启动类是否有MapperScan。2. 检查TableName,TableId注解是否正确表名、字段名是否匹配。1. 添加注解或扫描。2. 修正实体类注解或数据库表结构。分页查询结果不对或没生效1. 未配置分页插件。2. 分页参数未正确传递。1. 检查是否在配置类中定义了MybatisPlusInterceptor并添加了PaginationInnerInterceptor。2. 检查 Controller 中是否使用了Page对象接收参数。1. 正确配置分页插件见 5.2。2. 确保使用Page对象。控制台不打印 SQL 日志日志配置未开启。检查application.yml中mybatis-plus.configuration.log-impl是否设置为StdOutImpl。添加或修正配置。生产环境请关闭。枚举字段插入/查询为null枚举处理器未配置或配置不正确。1. 检查application.yml中的default-enum-type-handler配置。2. 检查枚举类是否实现了getCode()方法或使用了EnumValue注解标记存储字段。1. 确认配置正确。2. 按照 MyBatis-Plus 枚举处理规范定义枚举。使用代码生成器时报错或生成文件为空1. 数据库连接信息错误。2. 表名不存在或无权访问。3. 输出目录不可写。1. 检查生成器代码中的 JDBC URL、用户名、密码。2. 检查addInclude中的表名是否正确。3. 检查outputDir路径权限。1. 修正连接信息。2. 确认表存在且有权限。3. 使用绝对路径或检查目录权限。整合 Kafka 后日志发送失败1. Kafka 服务未启动或连接不上。2. 主题不存在。3. 生产者配置错误。1. 检查 Kafka 服务状态和连接地址。2. 检查 KafkaTemplate 的配置如bootstrap-servers。3. 查看应用日志中的 Kafka 相关错误。1. 启动 Kafka确保网络连通。2. 创建对应的 Kafka 主题。3. 检查并修正 Spring Kafka 配置。9. 最佳实践与使用建议为了让项目更健壮、更易维护遵循以下实践会大有裨益。版本管理在pom.xml中使用properties统一管理关键依赖版本特别是 Spring Boot 和 MyBatis-Plus 的版本确保兼容性。多数据源配置如果项目需要连接多个数据库使用DS注解需要引入dynamic-datasource-spring-boot-starter是比手动配置多个SqlSessionFactory更优雅的方式。注意DS可以标记在类或方法上。字段加解密对于敏感数据如手机号、身份证号可以使用 MyBatis-Plus 的字段加解密拦截器。实现IEncryptor接口并在实体字段上使用FieldEncrypt注解。确保密钥的安全管理不要硬编码在代码中。逻辑删除使用TableLogic注解实现逻辑删除而非物理删除。这能保留数据历史便于审计和恢复。记得在查询时MyBatis-Plus 会自动过滤掉已逻辑删除的数据。避免过度使用 Wrapper对于非常复杂的多表关联查询不要强行用QueryWrapper拼接。此时在 XML 中编写清晰的 SQL 或使用 MyBatis 的动态 SQL 标签if,choose是更可读、更易维护的选择。测试为 Mapper 层编写单元测试可使用MybatisPlusTest确保基本的 CRUD 和自定义 SQL 正确无误。这能有效防止因重构或升级导致的回归问题。监控与告警在生产环境中除了监控 JVM还要监控数据库连接池状态如活跃连接数、等待连接数和慢 SQL。MyBatis-Plus 的 SQL 打印日志可以接入 ELK 等日志系统进行分析。10. 总结与下一步这次我们完整地走通了 MyBatis-Plus 在 JDK 17 和 Spring Boot 3 环境下的集成、配置、核心功能验证以及问题排查。这套组合的核心价值在于用现代 Java 技术栈的标准大幅提升数据持久层开发的效率和代码质量。你最应该立即尝试的几点是验证分页创建一个分页查询通过配置PaginationInnerInterceptor.setMaxLimit()理解所谓的“500条限制”并观察分页 SQL 的执行。体验代码生成器找一张现有的业务表运行代码生成器感受一下一分钟内生成全套增删改查代码的效率。测试枚举映射定义一个业务状态枚举实现与数据库tinyint字段的自动映射体会类型安全带来的好处。最容易踩的坑通常集中在起步阶段JDK 版本不对、数据库连接配置错误、Mapper 扫描遗漏。按照本文第 3、4、8 章的步骤可以避开绝大多数启动问题。接下来你可以基于这个基础项目继续探索深入 MyBatis-Plus 高级特性如多租户插件、性能分析插件、乐观锁插件等。整合其他组件如 Spring Security 做权限控制Spring Cache 做缓存Redis 做分布式会话存储。构建微服务以此为基础模块尝试构建 Spring Cloud 微服务体验 JDK 17 和 Spring Boot 3 在云原生环境下的表现。建议将本文作为一份实操手册收藏在搭建新项目或升级旧项目时按图索骥能帮你节省大量摸索时间。