了解微服务

简介: 本文对比了微服务与单体架构的优缺点,指出单体架构适合小规模系统,开发部署简单,而微服务适合复杂系统,具备良好的扩展性和灵活性。同时介绍了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恢复数据到更新前
相关文章
|
消息中间件 NoSQL Java
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
1388 0
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
|
负载均衡 Java 微服务
OpenFeign原来是这么基于Ribbon来实现负载均衡的
大家好,我是三友~~ 前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理,这篇文章来继续剖析SpringCloud组件原理,来看一看OpenFeign是如何基于Ribbon来实现负载均衡的,两组件是如何协同工作的。
OpenFeign原来是这么基于Ribbon来实现负载均衡的
|
5月前
|
移动开发 人工智能 安全
VMware ESX 9.1 发布 - 云计算操作系统
VMware ESX 9.1 发布 - 云计算操作系统
462 0
VMware ESX 9.1 发布 - 云计算操作系统
|
Ubuntu Windows
双系统必备:Ubuntu自动挂载Windows分区
在双系统环境下,手动挂载Windows硬盘十分繁琐。本文介绍如何配置Ubuntu开机自动挂载Windows硬盘,包括硬盘识别、挂载点创建、fstab配置及验证步骤,帮助您节省时间,实现高效操作。
1072 1
|
消息中间件 Java 中间件
RocketMQ实战—2.RocketMQ集群生产部署
本文主要介绍了大纲什么是消息中间件、消息中间件的技术选型、RocketMQ的架构原理和使用方式、消息中间件路由中心的架构原理、Broker的主从架构原理、高可用的消息中间件生产部署架构、部署一个小规模的RocketMQ集群进行压测、如何对RocketMQ集群进行可视化的监控和管理、进行OS内核参数和JVM参数的调整、如何对小规模RocketMQ集群进行压测、消息中间件集群生产部署规划梳理。
RocketMQ实战—2.RocketMQ集群生产部署
|
负载均衡 Java 开发者
OpenFeign的工作原理
OpenFeign的工作原理
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
799 8
|
开发框架 负载均衡 算法
SpringCloud微服务实战——搭建企业级开发框架(十二):OpenFeign+Ribbon实现负载均衡
Ribbon是Netflix下的负载均衡项目,它主要实现中间层应用程序的负载均衡。为Ribbon配置服务提供者地址列表后,Ribbon就会基于某种负载均衡算法,自动帮助服务调用者去请求。Ribbon默认提供的负载均衡算法有多种,例如轮询、随即、加权轮训等,也可以为Ribbon实现自定义的负载均衡算法。 Ribbon有以下特性:
1015 57
SpringCloud微服务实战——搭建企业级开发框架(十二):OpenFeign+Ribbon实现负载均衡
|
网络协议 程序员 数据库
什么是公网IP和内网IP
【10月更文挑战第27天】公网IP与内网IP是网络通信中的两个重要概念。公网IP是互联网上的唯一标识,而内网IP仅在局域网内部有效,用于局域网内的设备通信。由于IPv4地址资源有限,通常一个公司或家庭只有一个公网IP,内部设备通过NAT(网络地址转换)技术共享该公网IP访问互联网。这样不仅节省了IP资源,还提高了网络安全性和稳定性。
1994 0
|
机器学习/深度学习 算法 C语言
【C语言基础】:函数递归详解
【C语言基础】:函数递归详解

热门文章

最新文章