了解微服务

简介: 本文对比了微服务与单体架构的优缺点,指出单体架构适合小规模系统,开发部署简单,而微服务适合复杂系统,具备良好的扩展性和灵活性。同时介绍了Spring Cloud相关组件如Nacos、OpenFeign、Sentinel的原理与应用,以及微服务中的熔断、降级、限流机制和AT模式的工作原理。



微服务和单体架构

单体架构

当项目规模较小时,这种模式上手快,部署、运维也都很方便,因此早期很多小型项目都采用这种模式。

优点:

1.整个项目只有一个工程,结构简单,开发周期短。

2.部署简单。

缺点:

随着项目的规模越来越大,团队开发人员也不断增加,单体架构就呈现出越来越多的问题:

1.团队协作成本高:试想一下,你们团队数十个人同时协作开发同一个Java工程,由于所有模块都在一个工程中,最终要把所有模块代码合并到一个分支,代码冲突率增加,团队协作成本增加。

2.系统发布效率低:任何模块变更都需要发布整个系统,任何一处出现问题都会导致发布失败,往往一次发布需要数十分钟甚至数小时。

3.扩展困难,在单体架构中,所有功能紧密集成,这意味着当某一部分(如订单处理)需要更多资源时,整个系统必须一起扩展。例如,在双十一期间订单量激增,不仅订单接口需要更多支持,支付接口也是如此。但由于采用了单体架构,我们不能单独扩展这些服务,而是需要增加整个系统的资源或者部署更多服务器节点,这可能会导致其他部分资源的浪费。

使用springboot还是springcloud ,一般要看业务,并发量,以及之后的发展。

总结:小而简的系统用单体(快速落地),大而杂的系统用微服务(灵活扩展);初期用单体验证,后期按需拆分为微服务,是更务实的选择。

nacos心跳机制

  • 服务端→客户端(主动检测):Nacos 服务端会定期(默认 5 秒)向客户端发送健康检查请求,客户端需在 30 秒内响应,否则标记为不健康;
  • 客户端→服务端(主动上报):服务实例启动后,每 5 秒向 Nacos 服务端发送心跳包(包含服务名、实例 IP、端口等),服务端收到后更新实例的最后心跳时间;
  • 健康状态判断:服务端若 15 秒内未收到客户端心跳,将实例标记为 “不健康”;30 秒未收到则从服务列表中剔除(默认配置,可通过 nacos.instance.heart.beat.timeout 等参数调整)。

openfeign的原理与优点

OpenFeign 的核心原理是利用 动态代理注解元数据 在运行时构造和发送 HTTP 请求,并通过与 Ribbon/LoadBalancer 集成实现负载均衡,与 Spring 编解码器 集成实现数据转换。

其最大优势在于 声明式编程模型,通过简单的接口定义取代冗长的 HTTP 客户端代码,显著提升开发效率和代码可读性、可维护性。

springcloud的组件

  • nacos:服务发现与注册 服务与发现
  • Zuul 或 Spring Cloud Gateway:API 网关 [还有很多网关,如:https://konghq.com/]
  • Sentinel:断路器
  • Ribbon,Spring Cloud LoadBalancer:客户端负载均衡。
  • Feign、OpenFeign:声明式服务调用。

你们是怎么做微服务保护的(熔断、降级、限流)?

熔断降级限流的流程,是不是通过sentinel客户端进行设置阈值,然后正常情况下状态机是closed状态,当达到阈值时,熔断开启,所有的请求走降级处理(持续5s)然后会处于half-open状态放一个探测请求,成功则切回closed,反之则回到open状态,对应的降级操作时通过openfeign+fallbackfactory进行实现,限流的操作一般就是设置对应的异常比例阈值,sentinel进行校验判断

说一下AT模式的原理(两阶段、解决脏读的方案)


首先开启全局事务,调用分支,通过 RM注册分支事务,然后执行sql并提交事务,并记录更新前后的数据快照到undo.log文件中,向TC报告事务的状态,tc根据事物的状态进行判断,未失败,直接删除undo.log如果有失败进行回滚,并通过undo.log进行数据的恢复,通过使用全局锁加上双镜像快照进行避免脏写

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)是一张数据库表
  • 执行业务sql并提交,向TC报告事务的状态
  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前
相关文章
|
3月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
3月前
|
消息中间件 存储 缓存
再次了解kafka
Kafka通过offset机制解决消息重复消费问题,支持手动提交偏移量及唯一ID去重。它保证分区内的消息顺序消费,结合集群、副本与重平衡实现高可用。高性能设计包括顺序读写、分区、页缓存、零拷贝等。数据清理依赖保留时间或大小策略,点对点和发布订阅模式则通过消费者组实现。
|
3月前
|
缓存 前端开发 Java
基于最新 Java 技术栈的在线任务管理系统开发实战详解
本项目基于最新Java技术栈开发在线任务管理系统,涵盖任务创建、分配、跟踪、统计等功能。采用Spring Boot 3.2.x、React 18、PostgreSQL 16等主流技术,详解项目架构设计、核心功能实现及部署流程,助力掌握现代Java全栈开发技能。
253 6
|
3月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
354 0
|
3月前
|
SQL JavaScript Java
三层架构理解(实现前后端分离)
本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。
|
3月前
|
算法 关系型数据库 Python
配电网中考虑需求响应(Python代码实现)【硕士论文复现】
基于需求侧响应的配电网供电能力综合评估
|
3月前
|
数据采集 消息中间件 监控
单机与分布式:社交媒体热点采集的实践经验
在舆情监控与数据分析中,单机脚本适合小规模采集如微博热榜,而小红书等大规模、高时效性需求则需分布式架构。通过Redis队列、代理IP与多节点协作,可提升采集效率与稳定性,适应数据规模与变化速度。架构选择应根据实际需求,兼顾扩展性与维护成本。
105 2
|
3月前
|
消息中间件 网络性能优化
了解MQ
消息堆积处理核心在于平衡生产与消费速度,可通过限流生产、优化消费者处理能力及异步机制缓解。RabbitMQ通过持久化、确认机制保障消息可靠性,MQTT则依赖QoS等级确保传输。延迟消息常用死信队列实现,而幂等性可通过唯一ID避免重复消费。MQ广泛用于异步处理、系统解耦及分布式事务等场景。
|
3月前
|
NoSQL Java 数据库
杂项8
缓存三剑客(穿透、击穿、雪崩)解析及解决方案:穿透指请求数据在Redis和数据库均不存在,可通过校验、空值缓存、布隆过滤器应对;击穿针对热点数据失效,可用互斥锁或永不过期策略;雪崩因大量缓存同时失效,可采用随机过期、集群部署、降级机制缓解。
|
3月前
|
存储 算法 安全
对象内存分配机制与垃圾回收
本内容介绍了对象内存分配机制与垃圾回收(GC)原理,涵盖对象在堆与栈中的存储、新生代与老年代的GC策略、常见回收算法及回收器特点,适用于Java等语言的内存管理优化。