微服务实战系列
文章平均质量分 86
微服务实战系列
冰糖心书房
Hi:欢迎来到"冰糖心书房",人个目前就职于一家外企业500强公司担任架构师一职,在这里我会着重分享我多年来在Java开发领域的实战经验和心得体会。从企业级项目架构设计、高并发处理到微服务架构的落地实施。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring Boot 项目中判断集合(List、Set、Map)不能为空且不为 null的注解使用
在 Spring Boot (结合 Bean Validation / Hibernate Validator) 中,判断集合(List、Set、Map)不能为空且不为 null,最常用且语义最准确的注解是 @NotEmpty。原创 2025-11-25 14:21:15 · 253 阅读 · 0 评论 -
Spring Boot mybatis-plus 多数据源配置
创建一个注解,用于在需要切换数据源的方法上进行标识。原创 2025-08-26 15:54:47 · 1422 阅读 · 0 评论 -
@PostMapping 之争:@RequestParam 与 @RequestBody 的深入解析
总而言之,与和的选择取决于客户端发送数据的方式和数据的复杂性。适用于从 URL 查询参数或表单中获取简单的键值对数据,而则专注于处理请求主体中的复杂、结构化的数据,如 JSON,并将其无缝地转换为 Java 对象。理解并正确运用这两者,是构建高效、清晰的 Spring Boot 应用程序的关键一步。原创 2025-08-19 11:42:32 · 656 阅读 · 0 评论 -
Spring Boot @Validated 和@Valid 区别
如果只需要简单的校验,不涉及复杂的分组场景,使用@Valid就足够了。当需要根据不同的业务场景应用不同的校验规则时,@Validated的分组功能是最佳选择。在进行嵌套对象校验时,务必在嵌套对象的字段上使用@Valid注解。若要校验或这类方法参数,需要在对应的类上标注@Validated注解。原创 2025-08-11 10:45:13 · 1409 阅读 · 0 评论 -
HPA 策略优化
HPA(Horizontal Pod Autoscaler,水平 Pod 自动伸缩)是 Kubernetes 中用于根据观察到的 CPU 利用率或其他自定义指标自动调整 Pod 副本数量的机制。优化 HPA 策略对于确保应用程序的性能、可用性和资源利用率至关重要。优化 HPA 策略需要根据应用程序的特点、负载模式和性能目标进行调整。通过合理的 HPA 策略优化,可以提高应用程序的性能、可用性和资源利用率,降低成本。(选择影响最小的策略), 或者是。(选择影响最大的策略) 或。选择策略的方式,可以是。原创 2025-07-23 11:22:29 · 989 阅读 · 0 评论 -
WAF(Web Application Firewall,Web 应用防火墙)的作用
WAF(Web Application Firewall,Web 应用防火墙)是一种部署在 Web 服务器或 Web 应用程序之前的安全设备或软件,用于保护 Web 应用程序免受各种网络攻击。WAF 是保护 Web 应用程序免受各种网络攻击的重要安全措施。它可以防御 SQL 注入、XSS、CSRF、DoS/DDoS 等多种攻击,并提供流量过滤、监控、负载均衡、虚拟补丁等功能。原创 2025-07-23 11:20:03 · 1056 阅读 · 0 评论 -
应该为所有微服务提供一个共享的 Redis 集群,还是每个(或每组)微服务部署独立的 Redis 实例/集群?
因为它更符合微服务的核心理念(松耦合、独立部署、故障隔离)。只有在成本或管理复杂度成为绝对制约因素,且能接受共享带来的风险时,才考虑共享集群,并必须实施严格的监控、治理和 Key的 命名规范。优势(性能、数据、故障域)对于保证微服务架构的韧性和可维护性至关重要,可以有效避免“一点故障,全局瘫痪”的风险。这是一个经典的架构决策问题,没有绝对的“正确”答案,选择哪种方式取决于多种因素的权衡。原创 2025-07-22 17:23:24 · 1125 阅读 · 0 评论 -
Spring Boot 项目中 JSONException: Unterminated string at 3297 [character 3298 line 1] 分析?
除了上述原因,JSON数据中可能还存在其他不符合规范的地方,例如多余的逗号、错误的括号匹配等,这些也可能间接导致解析器在某个位置报出“未结束的字符串”错误。这个错误明确地指向了JSON数据中的一个字符串没有被正确地关闭。您需要根据错误提示的位置,检查并修复JSON字符串的语法问题。这通常意味着您正在尝试解析的JSON字符串存在语法错误,导致解析器无法正确识别字符串的结束。可能是在构建JSON字符串时,某个字符串类型的值忘记了末尾的双引号。您可能只收到了部分JSON数据,导致最后一个字符串没有正常结束。原创 2025-07-21 09:54:52 · 715 阅读 · 0 评论 -
Spring Boot 项目中数据同步之binlog和MQ
如果写数据库成功了,但应用在发送 MQ 前宕机了,消息就会丢失。反之,如果消息发送成功了,但数据库事务回滚了,就会产生一个“虚假”的事件。任何对数据库的修改都能被捕获,无论是来自你的 Spring Boot 应用、另一个微服务、数据订正脚本,还是DBA的直接操作。对于一个已经存在的庞大系统,想增加数据同步功能,使用 Canal 是一个绝佳选择,因为它不需要去修改成百上千个已经在线上运行的业务代码。如果你想通知另一个服务“去执行某个动作”,binlog 模式就不合适了,因为它传递的是“状态”而不是“意图”。原创 2025-07-16 15:17:01 · 1002 阅读 · 0 评论 -
MongoTemplate findAndRemove 的那些事
方法removedeleteMany目的原子地查找并删除一个文档删除所有匹配的文档删除数量最多 1 个0 到 N 个返回值被删除的文档对象(T),如果没找到则返回null删除结果(),包含删除的数量使用场景当你需要像处理队列一样,取出一个数据并立即处理,同时确保其他线程不会取到同一个数据时。当你需要批量清理或删除符合特定条件的数据时。需要原子地取走一个文档并处理它:用。需要删除所有符合条件的文档:用remove。原创 2025-07-10 17:38:58 · 940 阅读 · 0 评论 -
Spring Boot 项目中多数据源配置使用场景
这种方式更灵活,适用于读写分离等需要在同一个 Service 中切换数据源的场景。创建一个注解,用于标记方法应该使用哪个数据源。// 默认使用 master 数据源如果你的业务模块和数据库绑定关系固定,方案一(静态方式)更简单、更直观。如果你需要实现读写分离,或者在业务逻辑中频繁切换数据源,方案二(动态方式)提供了更高的灵活性。原创 2025-07-09 16:23:10 · 1117 阅读 · 0 评论 -
Canal 中配置 Kafka详解
在 Canal 中配置 Kafka 是一个非常常见的应用场景,通常用于将 MySQL 的数据变更实时同步到 Kafka 消息队列中,供下游系统进行消费。下面我将重点介绍的配置步骤,因为它更强大和灵活。原创 2025-07-07 08:54:47 · 1580 阅读 · 0 评论 -
构造函数注入在spring boot 中怎么使用详解
我们来详细讲解一下在 Spring Boot 中如何使用构造函数注入,并通过一个完整的、可运行的例子来演示。构造函数注入是 Spring 官方的依赖注入方式,因为它能保证对象的不可变性和依赖的完整性。原创 2025-07-06 16:10:28 · 973 阅读 · 0 评论 -
面试官:SpringApplication.run(...) 这一行代码执行后,背后发生了什么?
Spring Boot Starters (购物清单)你只需要在pom.xml中加入。这不仅仅是加了一个依赖,而是加了一份“搭建 Web 应用所需的全套工具和材料”的清单,包括 Spring MVC 框架、Tomcat 服务器、JSON 解析库 (Jackson) 等。它帮你管理了所有繁琐的依赖和版本。Auto-Configuration (智能厨师)注解开启了自动配置功能。Spring Boot 就像一个聪明的厨师,它会检查你购物清单里有哪些材料(检查 classpath 上有哪些库)。原创 2025-06-29 11:22:40 · 961 阅读 · 0 评论 -
SpringQueryMap 注解的作用
是一个注解,用在 OpenFeign 的接口方法上,它的作用是将一个复杂的 Java 对象(POJO)自动展开成多个 URL 查询参数。简单来说,它解决了当查询参数过多时,在接口方法中写大量的烦恼。作用:将一个 POJO 对象展开为 URL 的?查询参数。何时使用:当你的 Feign 接口需要传递多个、可选的查询参数时,强烈推荐使用。例如,各种列表的筛选、搜索功能。何时不使用:如果你的接口只需要一两个固定的、必填的参数,直接使用会更清晰直观。原创 2025-06-25 10:53:45 · 652 阅读 · 0 评论 -
Ingress 和apisix组件的区别
定位一种 Kubernetes API 资源(),是一个标准规范。作用:它定义了从集群外部访问集群内部服务的规则,主要是 L7 的 HTTP/HTTPS 路由规则,如 Host、Path 匹配。实现:Ingress 资源本身不具备任何功能。它必须由一个来实现。常见的 Ingress Controller 有 Nginx Ingress Controller, Traefik, HAProxy Ingress 等。选择不同的 Ingress Controller,相应的功能和性能也不同。定位。原创 2025-06-23 10:29:34 · 952 阅读 · 0 评论 -
Spring Boot 项目启动优化
分析先行: 立即为你的项目集成actuator的startup功能,找到启动耗时最长的 Top 5 Bean。低成本优化尝试全局懒加载,并测试对首次请求的影响。根据启动日志,exclude掉明确不需要的自动配置。清理pom.xml中的无用依赖。针对性优化对耗时长的 Bean 使用@Lazy或将其初始化逻辑改为@Async。检查并收紧的范围。开发提效: 本地开发环境务必引入。极限挑战。原创 2025-06-16 17:05:10 · 1132 阅读 · 0 评论 -
在微服务架构中,怎么搭建Maven私服
在需要发布到私服的微服务项目(尤其是共享库、API 包、父 POM)的。),使其指向你的 Nexus 私服。最常用的 Maven 私服工具是。或 Maven 安装目录的。为例,介绍搭建步骤。修改 Maven 的。原创 2025-06-10 14:56:57 · 1130 阅读 · 0 评论 -
什么是无状态服务
每次客户端请求对于服务来说都是一个全新的、独立的交互,服务处理请求所需的所有信息要么包含在请求本身中,要么从外部共享存储(如数据库、缓存、消息队列等)中获取。总而言之,无状态服务是一种强大的架构模式,特别适用于构建可伸缩、高可用的云原生应用和微服务。它通过将状态管理从服务实例本身剥离,从而简化了服务的许多方面。无状态服务(Stateless Service)是一种设计理念,指的是。原创 2025-06-03 11:01:36 · 1198 阅读 · 0 评论 -
ServletComponentScan 注解的作用
这种方式的好处是你可以更细致地控制它们的属性(如顺序、初始化参数等),并且它们本身就是 Spring Bean,完全由 Spring 管理。它简化了配置,使得我们在开发过程中可以专注于业务逻辑,而不是繁琐的 XML 配置或编程式注册。注册的组件,它们主要是由 Servlet 容器直接管理,Spring Boot 提供了桥梁让容器能够发现它们,并辅助进行依赖注入。注解是 Spring Boot 提供的一个非常方便的注解,它的主要作用是。注解添加到你的主 Spring Boot 应用类上(即带有。原创 2025-05-31 16:58:24 · 1183 阅读 · 0 评论 -
Spring Boot 项目中什么时候会抛出 FeignException?
是 Feign 客户端在执行 HTTP 请求过程中可能抛出的基础异常。它有很多子类,分别对应不同类型的错误。以下是一些常见的会抛出。上述这些场景有助于我们更好的设计错误处理逻辑、配置重试和熔断机制,以及调试 Feign 客户端的调用问题。在 Spring Boot 项目中使用 Feign 时,原创 2025-05-13 11:01:24 · 1069 阅读 · 0 评论 -
微服务中怎么获取请求头信息
Controller 层优先使用。清晰、简洁,是 Spring 推荐的方式。使用参数可以获取所有头信息。: 用于处理横切关注点,如日志、认证、追踪、多租户等,获取相关头信息,并可以设置请求/线程上下文(如 MDC, SecurityContext, 自定义 ThreadLocal)。Service 层及以下优先通过方法参数传递从 Controller 获取的头信息。如果信息是全局上下文(如追踪 ID、用户 ID、租户 ID),则通过 Filter/Interceptor 设置并在需要时从线程本地上下文。原创 2025-05-05 17:23:57 · 1297 阅读 · 0 评论 -
为什么选择 Spring Boot? 它是如何简化单个微服务的创建、配置和部署的?
它并不是要取代 Spring Framework,而是构建在其之上,通过一系列“约定优于配置”的原则和自动化手段,让开发者能够更快的创建出独立、生产级别的基于 Spring 的应用程序。它让开发者可以更专注于业务逻辑本身,而不是花费大量时间在繁琐的基础设施搭建和配置上,从而显著提高了开发效率和应用的交付速度,使其成为构建现代微服务应用的热门选择。等核心特性,极大的简化了基于 Spring 的 Java 应用(尤其是微服务)的。Spring Boot 的核心目标就是。Spring Boot 通过。原创 2025-04-27 15:40:00 · 790 阅读 · 0 评论 -
微服务中FeignException 和DecodeException 区别和联系
理解它们的区别有助于我们更精确的捕获和处理 Feign 调用中不同类型的错误。是Feign 客户端在远程调用过程中可能抛出的两种异常,它们发生的。专门检查响应体格式或目标对象定义,而针对 4xx/5xx 的。子类则可能需要检查请求参数或协调服务提供方。原创 2025-04-26 09:00:00 · 760 阅读 · 0 评论 -
MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?
与传统的 MyBatis 在 XML 文件中编写动态 SQL 相比,使用。) 是其核心特性之一,它允许我们在开发时以面向对象的方式构建 SQL 的。还是 XML dynamic SQL,关键在于根据查询的。MyBatis-Plus (MP) 提供的。原创 2025-04-23 16:41:11 · 1011 阅读 · 0 评论 -
MyBatis-Plus 中 ServiceImpl与BaseMapper的关系
的通用方法),保持了清晰的分层结构,并允许开发者在 Service 层轻松地添加业务逻辑和事务控制,同时极大地简化了数据访问层的开发工作。在 MyBatis-Plus (MP) 中,通过这种设计,MP 实现了代码的复用(,它们分别代表了软件分层架构中的。之间存在着紧密且明确的。原创 2025-04-19 08:00:00 · 810 阅读 · 0 评论 -
RestControllerAdvice 和 ControllerAdvice 两个注解的区别与联系
这个组合带来的核心区别在于。原创 2025-04-17 15:41:44 · 745 阅读 · 0 评论 -
HikariCP 连接池的最佳实践
遵循这些实践,可以帮助你充分发挥 HikariCP 的优势,构建高性能、高可用的数据库访问层。没有绝对通用的“最佳”配置,最终的调优需要结合你的具体应用场景和监控数据来进行。原创 2025-04-17 10:27:51 · 2090 阅读 · 0 评论 -
MyBatis-Plus 中BaseMapper接口是如何加速微服务内部开发的?
即使后期需要更复杂的查询,也可以平滑的补充自定义方法和 XML。,直接提供了丰富、标准化的数据访问方法,使得微服务内部数据访问层的开发变得极其高效。由于基础 SQL 是框架自动生成的,减少了人为编写 SQL 时的拼写错误、语法错误。大量预先实现好的、通用的数据访问方法。的接口,就可以立即拥有强大的单表操作功能,从而大幅缩短了开发周期,减少代码量,降低错误率。的 Mapper 都拥有相同的方法,使得整个微服务的数据访问层接口更加统一和规范。需要为接口中的每个方法编写对应的 SQL 语句。这是最直接的加速点。原创 2025-04-16 16:30:55 · 1093 阅读 · 1 评论 -
Spring Boot 微服务中集成 MyBatis-Plus 与集成原生 MyBatis 有哪些配置上的不同?
总的来说,在 Spring Boot 微服务中,MyBatis-Plus 通过其 Boot Starter 和丰富的配置属性,极大的简化了 MyBatis 的集成和配置工作,尤其是对于全局设置和常用插件的使用。总体来说,MyBatis-Plus 是在 MyBatis 基础上进行的增强,它兼容 MyBatis 的所有配置方式,并提供了更简洁、更强大的配置选项,尤其是在利用 Spring Boot 的自动配置方面做得更好。原创 2025-04-15 16:22:50 · 1381 阅读 · 0 评论 -
MyBatis-Plus 相对于原生 MyBatis,在微服务项目中主要简化了哪方面的工作?
在微服务项目中,由于服务数量多,每个服务都需要建立自己的数据访问层,MyBatis-Plus 通过自动化的 CRUD、简化条件构造、内置常用功能插件、优化配置注解以及提供代码生成器,极大的减少了每个服务中重复、繁琐的编码工作量,提高了开发效率,降低了出错的可能性,并有助于在众多服务间保持数据访问层实现方式的一致性。原创 2025-04-14 13:48:32 · 689 阅读 · 0 评论 -
Java常用连接池 (HikariCP, Tomcat Pool, Druid) 的配置和比较
在应用程序中,每次需要与数据库交互时都建立一个新的数据库连接是非常耗时且消耗资源的操作(涉及网络通信、数据库认证、资源分配等)。连接池通过预先创建并维护一组数据库连接,当应用程序需要连接时,直接从池中获取一个可用连接;使用完毕后,不是关闭连接,而是将其归还到池中,以供后续请求复用。这极大地提高了应用程序的性能和响应速度,并减少了数据库服务器的负载。特性HikariCPDruid性能极高(通常最优)良好良好 (监控开启时可能略低)稳定性高 (设计简洁)高 (广泛使用)高 (功能复杂需仔细配置)原创 2025-04-13 13:15:00 · 1089 阅读 · 0 评论 -
如何在 Spring Boot 项目中使用 MyBatis 进行批量操作以提升性能?
在 Spring Boot 项目中使用 MyBatis 的 ExecutorType.BATCH 进行批量操作,可以显著提升处理大量数据的性能。关键在于正确配置 ExecutorType.BATCH,编写高效的批量 SQL 语句,合理设置批量大小,并结合事务管理和错误处理机制。 性能优化是一个迭代过程,需要根据实际应用场景和性能测试结果进行调整和完善。原创 2025-04-11 16:21:46 · 1472 阅读 · 0 评论 -
策略模式在微服务中的使用
我们可以利用 Spring 将同一接口的所有 Bean 注入到一个 Map 中,其中 Key 是 Bean 的名称,Value 是 Bean 实例。在 Spring Boot 中,我们可以利用其强大的依赖注入(DI)和组件扫描(Component Scan)特性,非常优雅地实现和管理策略模式。假设我们要实现一个订单处理系统,根据不同的订单类型(普通订单、促销订单、会员订单)有不同的处理逻辑(例如计算折扣、积分等)。(“NORMAL”, "VIP"等) 作为 Key,需要结合其他方式,比如上面的。原创 2025-04-12 09:45:00 · 631 阅读 · 0 评论 -
Java 如何实现类的热加载和热部署?
Java 提供了多种实现热加载和热部署的方式,包括自定义类加载器、Java Instrumentation API、Spring Boot DevTools 以及其他工具。 选择哪种方式取决于开发时的具体需求,在生产环境中,通常不建议使用热部署,而是使用更可靠的部署策略,例如蓝绿部署、滚动更新或金丝雀发布。原创 2025-04-10 09:40:16 · 1433 阅读 · 0 评论
分享