目录
Eureka、Nacos、Zookeeper(ZK)、Consul、Apollo 和 ETCD 相同点 不同点
Spring Cloud 核心组件
Spring Cloud 和 Alibaba 是微服务架构中常用的两个技术栈,它们提供了丰富的组件来解决微服务开发中的各种问题。以下是它们的核心组件及其功能对比:
Spring Cloud
是一个开源的微服务工具集,基于 Spring Boot 构建,提供了服务注册与发现、配置管理、负载均衡、断路器等一站式解决方案。
服务注册与发现
- Eureka:Netflix 开源的服务注册中心,支持服务自动注册与发现。
- Consul:HashiCorp 开发的分布式服务网格,提供服务注册、健康检查和键值存储。
- ZooKeeper:Apache 开源的分布式协调服务,也可用于服务注册与发现。
配置管理
- Spring Cloud Config:集中管理应用配置,支持版本控制和动态刷新。
- Bus:配合 Config 使用,通过消息总线(如 RabbitMQ)实现配置的实时更新。
负载均衡
- Ribbon:客户端负载均衡器,与 Eureka 结合实现服务间的负载分发。
- Spring Cloud LoadBalancer:替代 Ribbon 的轻量级负载均衡器。
API 网关
- Zuul:Netflix 开源的 API 网关,提供路由、过滤和负载均衡功能。
- Spring Cloud Gateway:基于 WebFlux 的响应式 API 网关,性能更高。
断路器
- Hystrix:Netflix 开源的熔断器,防止级联故障,提供服务降级和熔断机制。
- Resilience4j:轻量级容错框架,替代 Hystrix,支持熔断、限流、重试等。
服务调用
- Feign:声明式 HTTP 客户端,简化服务间的调用(基于 Ribbon 和 Hystrix)。
- OpenFeign:Spring Cloud 对 Feign 的增强版,支持 Spring MVC 注解。
链路追踪
- Sleuth:提供分布式请求链路追踪,配合 Zipkin 或 ELK 实现日志聚合。
Alibaba 微服务组件
Alibaba 开源的微服务组件在国内应用广泛,提供了高性能、高可用的解决方案,与 Spring Cloud 无缝集成。
服务注册与发现
- Nacos:阿里巴巴开源的服务注册中心和配置管理平台,支持动态服务发现、配置管理和服务治理。
- 优势:比 Eureka 功能更丰富,支持多环境配置、服务元数据管理和流量控制。
配置管理
- Nacos Config:与 Nacos 集成的配置中心,支持配置动态刷新和版本管理。
- 优势:界面友好,支持配置分组和命名空间,性能优于 Spring Cloud Config。
负载均衡与服务调用
- Dubbo:阿里巴巴开源的高性能 RPC 框架,支持多种协议(如 Dubbo、REST)。
- Spring Cloud Alibaba Dubbo:与 Spring Cloud 集成的 Dubbo,简化服务间调用。
限流与熔断
- Sentinel:阿里巴巴开源的流量控制和熔断降级组件,提供实时监控和规则配置。
- 优势:支持多种限流策略(QPS、线程数),可视化界面更友好。
消息队列
- RocketMQ:阿里巴巴开源的高性能消息队列,支持事务消息、顺序消息和分布式事务。
- Spring Cloud Stream:与 RocketMQ 集成,简化消息驱动微服务的开发。
分布式事务
- Seata:阿里巴巴开源的分布式事务解决方案,支持 AT、TCC、SAGA 等模式。
- 优势:对业务代码侵入性小,支持多种数据库和微服务框架。
分布式调度
- ScheduledX:阿里巴巴开源的分布式任务调度平台,支持任务编排和分布式执行。
对比与选择建议
功能 | Spring Cloud | Alibaba |
---|---|---|
服务注册 | Eureka/Consul/ZooKeeper | Nacos |
配置中心 | Spring Cloud Config | Nacos Config |
负载均衡 | Ribbon/LoadBalancer | Dubbo + Nacos |
API 网关 | Zuul/Gateway | Spring Cloud Gateway + Sentinel |
断路器 | Hystrix/Resilience4j | Sentinel |
服务调用 | Feign/OpenFeign | Dubbo + Feign |
分布式事务 | 需第三方整合(如 Atomikos) | Seata |
消息队列 | RabbitMQ/Kafka | RocketMQ |
监控与链路 | Sleuth + Zipkin/ELK | Sentinel + Skywalking |
- 选择 Spring Cloud:如果项目更倾向于 Netflix 生态,或需要与国际技术栈兼容。
- 选择 Alibaba:如果项目更注重国内生态,需要高性能组件(如 Sentinel、Nacos)和分布式事务支持。
整合方案
实际项目中,两者常结合使用,例如:
- 使用 Nacos 作为服务注册中心和配置中心。
- 使用 Sentinel 进行流量控制和熔断降级。
- 使用 Dubbo 或 Feign 实现服务间调用。
- 使用 Seata 处理分布式事务。
- 使用 Spring Cloud Gateway 作为 API 网关。
这种组合既能享受 Spring Cloud 的标准化生态,又能获得 Alibaba 组件的高性能特性。
Spring Cloud Alibaba有哪些核心组件?
Spring Cloud Alibaba 是阿里巴巴开源的微服务解决方案,与 Spring Cloud 无缝集成,提供了一系列高性能、高可用的组件。以下是其核心组件及其功能:
1. Nacos:服务注册与配置中心
- 服务注册与发现:支持服务的自动注册与发现,提供健康检查、服务元数据管理等功能。
- 动态配置管理:支持配置的集中管理、动态刷新和版本控制,界面友好且性能优异。
- 服务路由与流量控制:支持基于权重、元数据的智能路由,以及流量控制和灰度发布。
- 优势:替代 Eureka、Consul 和 Spring Cloud Config,功能更全面,支持多环境配置隔离。
2. Sentinel:流量控制与熔断降级
- 流量控制:支持基于 QPS、线程数、响应时间等多种指标的限流策略。
- 熔断降级:当服务出现异常时,自动熔断并提供降级逻辑,防止级联故障。
- 实时监控:提供实时监控数据和可视化界面,支持动态规则配置。
- 优势:替代 Hystrix,功能更强大,支持热点参数限流、系统自适应保护等。
3. Dubbo:高性能 RPC 框架
- 多协议支持:支持 Dubbo、REST 等多种协议,提供高性能的远程调用。
- 服务治理:集成 Nacos 实现服务注册与发现,支持负载均衡、集群容错等。
- 与 Spring Cloud 集成:通过 Spring Cloud Alibaba Dubbo,无缝接入 Spring Cloud 生态。
- 优势:适合对性能要求高的场景,替代 Feign/Ribbon 实现服务间通信。
4. Seata:分布式事务解决方案
- AT 模式:无侵入的分布式事务解决方案,基于全局锁实现。
- TCC 模式:支持补偿型事务,需要业务方实现 Try-Confirm-Cancel 接口。
- SAGA 模式:长事务解决方案,通过事件驱动实现最终一致性。
- 优势:替代传统 XA 事务,性能更高,对业务代码侵入性小。
5. RocketMQ:高性能消息队列
- 丰富的消息模式:支持顺序消息、事务消息、定时消息等。
- 高吞吐量:单机写入 TPS 可达百万级,支持海量消息堆积。
- 与 Spring Cloud Stream 集成:简化消息驱动微服务的开发。
- 优势:适合高并发场景,替代 Kafka、RabbitMQ。
6. Sentinel Dashboard:可视化监控与管理
- 实时监控:展示服务的实时流量、熔断、异常等指标。
- 规则配置:通过界面动态配置限流、降级、系统保护等规则。
- 集群限流:支持集群环境下的统一限流策略。
- 优势:提供直观的监控和管理界面,便于运维。
7. Alibaba Cloud 整合组件
- OSS(对象存储):与阿里云 OSS 集成,提供文件存储服务。
- SCS(短信服务):集成阿里云短信服务,简化短信发送。
- 其他云服务:支持与阿里云的其他服务(如 RDS、Redis 等)无缝对接。
8. Gateway 扩展
- Sentinel Gateway Filter:为 Spring Cloud Gateway 提供限流和熔断支持。
- Nacos Gateway Route Definition:基于 Nacos 动态配置网关路由规则。
监控
指标监控
- 使用 Sentinel Dashboard:Sentinel 不仅提供流量控制和熔断降级功能,其 Dashboard 还能实时展示服务的各种指标,如 QPS、线程数、响应时间、熔断次数等。通过可视化界面,运维人员可以快速了解服务的运行状况,及时发现潜在的性能问题。
- 结合 Prometheus 和 Grafana:Spring Cloud Alibaba 应用可以通过配置将指标数据暴露给 Prometheus,Prometheus 负责收集和存储这些数据,然后利用 Grafana 进行可视化展示,用户可以自定义各种图表和仪表盘,更灵活地分析和监控微服务的各项指标。
日志监控
- 使用 Logback 或 Log4j2:在 Spring Cloud Alibaba 微服务中,通常使用 Logback 或 Log4j2 作为日志框架,它们可以将日志输出到文件、控制台等。通过配置不同的日志级别,可以记录不同详细程度的日志信息,便于排查问题。
- 集成 Elasticsearch 和 Kibana:为了实现更高效的日志管理和查询,可以将微服务的日志数据发送到 Elasticsearch 进行存储和索引,然后通过 Kibana 进行可视化查询和分析。Kibana 提供了强大的搜索和过滤功能,能够帮助运维人员快速定位到特定的日志记录,对于排查系统故障和分析用户行为非常有帮助。
- ELK
性能监控
- 使用 Arthas:Arthas 是一款在线诊断工具,它可以在不重启应用的情况下,实时查看方法的执行情况,包括方法的调用次数、执行时间、参数和返回值等信息。通过 Arthas,开发人员可以快速定位到性能瓶颈所在的方法,从而有针对性地进行优化。
- 结合 Skywalking:Skywalking 是一个分布式追踪系统,它可以收集微服务之间的调用链路信息,包括请求的发起、传播和响应过程。通过分析这些链路数据,可以直观地了解整个系统的性能状况,发现潜在的性能问题,如服务间的调用延迟、资源消耗等。同时,Skywalking 还提供了告警功能,可以在性能指标超出阈值时及时发出通知。
通过这些监控手段,Spring Cloud Alibaba 微服务架构能够实现对系统的全面监控,帮助运维人员和开发人员及时发现问题、解决问题,保障系统的稳定运行和性能优化。
组件
注册中心
Eureka
Eureka 是 Spring Cloud Netflix 中的一个核心组件,也是 Spring Cloud Alibaba 中用于服务注册与发现的重要工具,以下是关于它的详细介绍:
基本概念
Eureka 是一个基于 REST(Representational State Transfer)的服务,主要用于定位运行在 AWS(Amazon Web Services)区域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。在 Spring Cloud Alibaba 微服务架构中,它作为服务注册中心,为各个微服务提供服务注册与发现的功能,使得微服务之间能够相互通信。
工作原理
- 服务注册:微服务在启动时会向 Eureka Server 发送注册请求,将自己的相关信息(如服务名称、IP 地址、端口号、健康状态等)注册到 Eureka Server 中。Eureka Server 会将这些信息存储在内存中,并维护一个服务注册表。
- 服务发现:当其他微服务需要调用某个服务时,会向 Eureka Server 发送服务发现请求,Eureka Server 会根据请求返回相应的服务实例列表。调用方根据一定的负载均衡策略从列表中选择一个服务实例进行调用。
- 心跳机制:微服务会定期向 Eureka Server 发送心跳包,以表明自己仍然处于运行状态。如果 Eureka Server 在一定时间内没有收到某个微服务的心跳包,就会认为该微服务已经下线,并将其从服务注册表中移除。
核心组件
- Eureka Server:作为服务注册中心,负责接收微服务的注册请求,存储服务实例信息,处理服务发现请求,并通过心跳机制监控服务实例的健康状态。它可以集群部署,以提高系统的可用性和可靠性。
- Eureka Client:是一个 Java 客户端,集成在各个微服务中。它负责与 Eureka Server 进行通信,实现服务的注册、发现和心跳上报等功能。Eureka Client 会在本地缓存服务注册表信息,以便在无法连接到 Eureka Server 时仍能进行服务发现。
作用
- 解耦服务调用关系:通过 Eureka,微服务之间不需要硬编码对方的 IP 地址和端口号等信息,而是通过服务名称进行调用。当服务实例的地址发生变化时,只需要在 Eureka Server 中进行更新,调用方无需修改代码,从而实现了服务调用关系的解耦,提高了系统的可维护性和可扩展性。
- 实现负载均衡:Eureka Server 返回的服务实例列表包含了多个相同服务的实例信息,调用方可以根据负载均衡算法(如轮询、随机、加权轮询等)选择一个合适的实例进行调用,从而实现负载均衡,提高系统的性能和可用性。
- 服务健康监控:通过心跳机制,Eureka Server 能够实时监控服务实例的健康状态。当某个服务实例出现故障时,Eureka Server 会将其从服务注册表中移除,避免调用方将请求发送到故障实例上,从而保证了系统的稳定性。
@EnableEurekaServer注解 服务端
@EnableEurekaClient注解 客户端
服务提供者
服务注册:启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,
同时带上了自身服务的一些元数据信息。
服务续约:在注册完服务之后,服务提供者会维护一个心跳用来持续
告诉Eureka Server: "我还活着 ”。
服务下线:当服务实例进行正常的关闭操作时,它会触发一个服务下线的
REST请求给Eureka Server, 告诉服务注册中心:“我要下线了 ”。
服务消费者
获取服务:当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,
来获取上面注册的服务清单
服务调用:服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和
该实例的元数据信息。在进行服务调用的时候,优先访问同处一个
Zone中的服务提供方。
Eureka Server(服务注册中心):
失效剔除: 默认每隔一段时间(默认为60秒)
将当前清单中超时(默认为90秒)没有续约的服务剔除出去。
自我保护:EurekaServer 在运行期间,会统计心跳失败的比例在15分钟之内
是否低于85%(通常由于网络不稳定导致)。Eureka Server会将当前的实例
注册信息保护起来, 让这些实例不会过期,尽可能保护这些注册信息。
eureka服务续约
1、Eureka Client通过发送心跳进行续约
2、默认情况下每30秒发送一次心跳
3、如90秒内Eureka Server未收到续约,则进行服务剔除
eureka服务剔除
1、Eureka Client优雅退出时会发送cancel命令
2、Eureka Server收到cancel命令时会删除该节点
eureka自我保护
1、Eureka Server会自动更新续约更新阀值
2、Eureka Server续约更新频率低于阈值则进入保护模式
3、自我保护模式下Eureka Server不会剔除任何注册信息
工作流程
- Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过复制同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息。
- Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务。
- Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常。
当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例。
- 单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端。
- 当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式。
- Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地。
- 服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。
- Eureka Client 获取到目标服务器信息,发起服务调用。
- Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除。
Eureka 为了保障注册中心的高可用性,容忍了数据的非强一致性,服务节点间的数据可能不一致, Client-Server 间的数据可能不一致。比较适合跨越多机房、对注册中心服务可用性要求较高的使用场景。
EurekaClient
是一个Java客户端, 用于简化Eureka Server的交互,客户端同时也具备一个内置的、 使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒),以证明当前服务是可用状态。如果Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,EurekaServer将会从服务注册表中把这个服务节点移除。
自我保护机制
如果在15分钟内超过 85% 的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
- Eureka不再从注册表中移除因为长时间没有收到心跳而过期的服务;
- Eureka仍然能够接受新服务注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
- 当网络稳定时,当前实例新注册的信息会被同步到其它节点中。
心跳机制
- 可用性(AP原则):Eureka 在设计时就紧遵AP原则,Eureka的集群中,只要有一台Eureka还在,就能保证注册服务可用,只不过查到的信息可能不是最新的(不保证强一致性)。
- 去中心化架构:Eureka Server 可以运行多个实例来构建集群,不同于 ZooKeeper 的选举 leader 的过程,Eureka Server 采用的是点对点对等通信。这是一种去中心化的架构,无 master/slave 之分,每一个 Peer 都是对等的。节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的 serviceUrl 指向其他节点。每个节点都可被视为其他节点的副本。
- 请求自动切换:在集群环境中如果某台 Eureka Server 宕机,Eureka Client 的请求会自动切换到新的 Eureka Server 节点上,当宕机的服务器重新恢复后,Eureka 会再次将其纳入到服务器集群管理之中。
- 节点间操作复制:当节点开始接受客户端请求时,所有的操作都会在节点间进行复制操作,将请求复制到该 Eureka Server 当前所知的其它所有节点中。
- 自动注册&心跳:当一个新的 Eureka Server 节点启动后,会首先尝试从邻近节点获取所有注册列表信息,并完成初始化。Eureka Server 通过 getEurekaServiceUrls() 方法获取所有的节点,并且会通过心跳契约的方式定期更新。
- 自动下线:默认情况下,如果 Eureka Server 在一定时间内没有接收到某个服务实例的心跳(默认周期为30秒),Eureka Server 将会注销该实例(默认为90秒, eureka.instance.lease-expiration-duration-in-seconds 进行自定义配置)。
- 保护模式:当 Eureka Server 节点在短时间内丢失过多的心跳时,那么这个节点就会进入自我保护模式。
Nacos
Nacos保护阈值:服务容灾与负载均衡策略解析-CSDN博客
java面试题——Nacos常见面试题_java nacos面试题-CSDN博客
注册中心的核心作用是:服务注册和发现
- 服务提供者:在启动时,向服务注册中心注册自身服务,并向服务注册中心定期发送心跳汇报存活状态。
- 服务消费者:在启动时,向服务注册中心订阅服务,定时拉取服务注册中心服务节点列表缓存在本地内存中,并与服务提供者建立连接。
服务注册中心:用于保存服务提供者的注册信息,当服务提供者节点发生变更时,服务注册中心会同步变更,并推送给服务消费者。最后,服务消费者从本地缓存的服务节点列表中,基于负载均衡算法选择一台服务提供者发起调用。[随机、轮询、加权轮询、最优可用]
链接:https://juejin.cn/post/7068065361312088095服务注册和发现
- 服务注册:服务提供者需要把自己的信息注册到注册中心,有注册中心保存这些信息,比如服务名称、ip、端口等。
- 服务发现:服务消费者向注册中心拉取服务列表信息,如果服务提供者有集群,则消费者会利用负载均衡算法,选择一个发起调用。
- 服务监控:服务提供者会每隔30秒向注册中心发送心跳,报告健康状态,如果注册中心服务90秒没有收到心跳,从注册中心中移除。
1、服务注册:每个服务客户端通过rest方式,向服务端进行注册自己的信息
2、服务心跳:每个服务客户端都会维护一个定时心跳,向服务到证明自己是健康的,默认5s发送一次
3、服务同步:服务器集群之间相互进行通讯,来保证服务信息的一致性,同时提高注册中心的高可用
4、服务发现:客户端有一个定时任务,定时的去注册中心拉取各个服务的信息列表到本地5、服务健康检查:注册中心定时检查各个服务的健康状态
6、雪崩保护:通过给每个服务实例进行配置阈值,从而实现雪崩保护
7、临时实例:当服务宕机时,注册中心会进行删除注册的服务实例
8、永久实例:即使服务宕机了,服务实例也不会被删除,和前面我们一起讨论的zookepper的持久性节点很像
服务注册表结构
Nacos采用了数据的分级存储模型,最外层是Namespace,用来隔离环境。然后是Group,用来对服务分组。接下来就是服务(Service)了,一个服务包含多个实例,但是可能处于不同机房,因此Service下有多个集群(Cluster),Cluster下是不同的实例(Instance)。
对应到Java代码中,Nacos采用了一个多层的Map来表示。
结构为Map<String, Map<String, Service>>
其中最外层Map的key就是namespaceId,值是一个Map。
内层Map的key是group拼接serviceName,值是Service对象。
Service对象内部又是一个Map,key是集群名称,值是Cluster对象。而Cluster对象内部维护了Instance的集合。
Nacos 的服务注册表采用了一种层次化的结构,主要由服务(Service)、集群(Cluster)和实例(Instance)三个层次组成。
Eureka、Nacos、Zookeeper(ZK)、Consul、Apollo 和 ETCD 相同点 不同点
相同点
- 分布式系统支持:都为分布式系统提供服务,用于解决分布式环境下的服务管理、配置管理等问题,帮助构建可靠、可扩展的分布式应用架构。
- 数据存储与共享:都具备数据存储功能,可用于存储服务信息、配置数据等,并且能在分布式节点之间实现数据共享,使各个节点能够获取到一致的信息。
- 集群管理:都支持集群部署,通过集群方式来提高系统的可用性、可靠性和性能,能够在部分节点出现故障时保证整个系统的正常运行。
不同点
- 功能侧重
- Eureka:主要专注于服务注册与发现,为微服务架构提供服务实例的注册和查询功能,让服务消费者能够方便地找到服务提供者。
- Nacos:集服务注册与发现、配置管理、服务治理等功能于一体,功能较为全面,尤其在云原生应用场景下表现出色。
- ZK:功能较为底层和通用,除了服务注册与发现外,还常用于实现分布式锁、分布式队列等功能,在分布式协调领域应用广泛。
- Consul:重点在于服务注册与发现,同时提供多数据中心支持、健康检查等功能,适用于大规模分布式系统的服务管理。
- Apollo:专门的配置管理平台,提供强大的配置管理功能,包括配置的发布、更新、版本管理、灰度发布等,服务发现功能相对较弱。
- ETCD:主要用于键值对数据的存储和分布式一致性管理,常被用于服务注册与发现以及配置管理等基础场景。
- 一致性算法
- Eureka:采用去中心化的架构,通过相互复制数据来保证一致性,不依赖特定的一致性算法,在大规模集群中可能出现数据不一致情况。
- Nacos:支持 CP(一致性优先)和 AP(可用性优先)模式,CP 模式下采用 Raft 算法保证数据一致性,AP 模式通过分布式存储和数据同步机制保证高可用性。
- ZK:使用 Zab(Zookeeper Atomic Broadcast)协议保证数据一致性,基于 Paxos 算法优化,能在集群中快速达成一致性。
- Consul:采用 Raft 算法保证数据一致性,将一致性问题分解为选举、日志复制和安全等子问题,易于理解和实现。
- Apollo:通过数据库存储配置信息,使用分布式锁等机制保证配置的一致性和并发访问的正确性。
- ETCD:基于 Raft 算法实现分布式一致性,能在分布式环境中快速选举领导者,并保证数据在多个节点之间的一致性复制。
- 性能与可用性
- Eureka:性能较好,能处理大量服务注册和发现请求。通过集群部署实现高可用,但在网络分区等情况下可能出现数据不一致问题。
- Nacos:性能较高,支持大规模服务注册与发现。通过多种高可用策略和数据持久化机制,保证在各种故障场景下的服务可用性。
- ZK:性能出色,能处理高并发请求。采用分布式架构和 Zab 协议,具有较高的可用性和可靠性,但节点数量较多时性能可能下降。
- Consul:性能良好,能满足大多数分布式系统需求。通过多数据中心支持和 Raft 算法保证,提供高可用的服务注册与发现功能。
- Apollo:在配置管理方面性能较好,能快速加载和更新配置。通过集群部署和数据缓存等机制,保证配置管理的高可用性。
- ETCD:性能高,支持大量并发读写操作。基于 Raft 算法和分布式存储,具有较高的可用性和可靠性,常用于关键分布式系统。
- 使用场景
- Eureka:适用于 Spring Cloud 体系下的微服务架构,对服务注册与发现功能要求简单,注重服务高可用性和快速失败转移的场景。
- Nacos:适合云原生应用和大规模微服务架构,既需要服务注册与发现,又对配置管理和服务治理有较高要求的场景。
- ZK:适用于各种分布式系统,如分布式锁、分布式队列、服务注册与发现等场景,需要开发者具备一定的分布式系统知识和开发经验。
- Consul:在大规模分布式系统中,尤其是需要多数据中心支持和对服务健康检查要求较高的场景下表现出色。
- Apollo:主要用于配置管理场景,特别是对配置的发布、管理和灰度发布等功能有较高要求的微服务架构。
- ETCD:常用于关键的分布式系统中,如 Kubernetes 集群的配置存储和服务注册与发现,对数据一致性和性能要求较高的场景。
https://juejin.cn/post/7068065361312088095
配置中心
- 功能特性
- 配置管理:支持将各种类型的配置信息,如数据库连接字符串、系统参数、日志级别等,集中存储在 Nacos 服务器上,方便统一管理和维护。
- 动态更新:当配置信息发生变化时,Nacos 能够实时将新的配置推送给相关的微服务实例,无需重启服务,实现配置的动态生效,提高了系统的灵活性和可维护性。
- 环境隔离:通过命名空间、分组等概念,可以很好地实现不同环境(如开发、测试、生产)以及不同应用之间配置的隔离和管理,确保各个环境的配置相互独立,互不影响。
- 版本控制:对配置的修改进行版本记录,方便查看配置的变更历史,并且在出现问题时可以快速回滚到指定的历史版本,保证系统的稳定性。
- 多格式支持:支持多种配置文件格式,如 properties、yaml、json 等,满足不同项目和开发人员的使用习惯。
- 数据模型
- 命名空间:用于隔离不同租户或不同环境的配置数据,每个命名空间下可以有多个配置分组和配置项。不同命名空间之间的配置相互隔离,具有不同的访问权限和配置范围。
- 配置分组:将相关的配置项进行逻辑分组,便于对配置进行分类管理。例如,可以按照微服务的模块或功能将配置分为不同的组,如用户服务配置组、订单服务配置组等。
- 配置项:具体的配置信息,由键值对组成,例如
server.port=8080
,其中server.port
是键,8080
是值。每个配置项都有唯一的标识符,方便在应用中进行引用和获取。
Nacos 配置中心与其他配置中心比较
- 与 Spring Cloud Config 比较
- 集成性:Spring Cloud Config 与 Spring Cloud 体系紧密集成,对于使用 Spring 框架开发的微服务项目来说,集成和使用非常方便。Nacos 也能很好地与 Spring Cloud 集成,同时还支持其他非 Spring 框架的应用,适用范围更广。
- 配置存储:Spring Cloud Config 支持多种配置源,如 Git、SVN、本地文件系统等,配置的存储和管理较为灵活。Nacos 将配置数据存储在自身的数据库中,通过内置的存储和管理机制实现配置的持久化和查询,相对来说更集中和统一。
- 动态更新:两者都支持配置的动态更新,但 Nacos 在实现方式上更为简洁直观,通过客户端的长轮询或推送机制,能够更及时地将配置变更推送给服务实例。
- 与 Apollo 比较
- 功能完整性:Apollo 具有非常完善的配置管理功能,包括配置发布、灰度发布、版本管理、权限控制等,功能较为全面。Nacos 也具备这些核心功能,并且在服务注册与发现和配置管理的结合方面有独特的优势,能够为微服务提供一站式的解决方案。
- 易用性:Nacos 提供了简洁易用的 Web 界面,方便进行配置的管理和操作。Apollo 的界面也较为友好,并且在配置的分组、命名等方面有详细的设计,两者在易用性方面都有不错的表现。
- 社区活跃度:Apollo 由携程开源,在国内有一定的用户基础和社区活跃度。Nacos 是阿里巴巴开源的项目,在社区活跃度和生态建设方面也非常活跃,有大量的开发者参与和贡献,相关的文档和资料也比较丰富。
Nacos 配置中心具有功能强大、使用方便、与微服务架构集成度高等优点,在与其他配置中心的比较中也展现出了自身的特色和优势,能够很好地满足微服务项目中对配置管理的需求。
远程调用 OpenFeign
OpenFeign 是 Spring Cloud 提供的声明式、模板化的 HTTP 客户端,用于简化微服务之间的远程调用。它通过接口和注解的方式定义服务调用,使开发者可以像调用本地方法一样调用远程服务,无需手动编写 HTTP 请求代码。
为了简化我们的开发,Spring Cloud Feign出现了!它基于 Netflix Feign 实现,
整合了 Spring Cloud Ribbon 与 Spring Cloud Hystrix,
除了整合这两者的强大功能之外,它还提供了声明式的服务调用(不再通过RestTemplate)。
优雅调用
一、核心特性
声明式调用
- 通过定义接口和注解,声明需要调用的远程服务方法,无需手动编写 HTTP 请求。
集成 Ribbon 和 LoadBalancer
- 内置负载均衡功能,支持多种负载均衡策略(轮询、随机、加权等)。
集成 Hystrix/Sentinel
- 支持熔断、降级和限流,提高系统的容错能力。
支持多种注解
- 兼容 Spring MVC 注解(如
@GetMapping
、@PostMapping
等),降低学习成本。
- 兼容 Spring MVC 注解(如
请求与响应处理
- 支持自定义编码器、解码器和拦截器,处理请求参数和响应结果。
二、工作原理
接口代理
- OpenFeign 通过动态代理技术,为定义的接口生成代理对象。
请求模板生成
- 根据接口方法上的注解(如
@GetMapping
),生成 HTTP 请求模板(URL、方法、参数等)。
- 根据接口方法上的注解(如
负载均衡
- 集成 Ribbon 或 Spring Cloud LoadBalancer,根据服务名从注册中心获取服务实例列表,并选择一个实例进行调用。
HTTP 请求发送
- 通过 HTTP 客户端(如 Apache HttpClient、OKHttp)发送请求,并处理响应。
三、使用步骤
1. 添加依赖
<!-- Maven -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 启用 OpenFeign
@SpringBootApplication
@EnableFeignClients // 启用 Feign 客户端
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3. 定义 Feign 客户端接口
@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserServiceClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable("id") Long id);
@PostMapping("/users")
User createUser(@RequestBody User user);
}
4. 注入并使用客户端
@Service
public class OrderService {
@Autowired
private UserServiceClient userServiceClient;
public Order createOrder(Long userId) {
// 像调用本地方法一样调用远程服务
User user = userServiceClient.getUser(userId);
// 业务逻辑...
}
}
四、关键注解
@FeignClient
name
:指定服务名,对应注册中心的服务 ID。url
:指定服务的具体 URL(用于测试或直连)。fallback
:指定熔断降级时的回调类。configuration
:指定自定义配置类。
请求映射注解
@GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
:定义 HTTP 请求方法和路径。
参数注解
@PathVariable
:路径变量。@RequestParam
:查询参数。@RequestBody
:请求体。@RequestHeader
:请求头。
五、高级配置
1. 自定义编码器 / 解码器
@Configuration
public class FeignConfig {
@Bean
public Decoder feignDecoder() {
return new ResponseEntityDecoder(new SpringDecoder(objectMapper()));
}
private ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
}
2. 配置拦截器
@Configuration
public class FeignConfig {
@Bean
public RequestInterceptor requestInterceptor() {
return requestTemplate -> {
// 添加请求头
requestTemplate.header("Authorization", "Bearer token");
// 添加请求参数
requestTemplate.query("timestamp", String.valueOf(System.currentTimeMillis()));
};
}
}
3. 配置超时时间
feign:
client:
config:
default:
connectTimeout: 5000 # 连接超时时间(毫秒)
readTimeout: 5000 # 读取超时时间(毫秒)
六、与其他组件的集成
1. 与 Sentinel 集成(熔断降级)
@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserServiceClient {
// 接口方法
}
@Component
public class UserServiceFallback implements UserServiceClient {
@Override
public User getUser(Long id) {
return new User(-1L, "fallback-user");
}
}
2. 与 Spring Cloud Gateway 集成
- 在 API Gateway 中使用 Feign 调用下游服务,实现统一路由和负载均衡。
七、优缺点
优点
- 代码简洁:通过接口和注解定义服务调用,减少样板代码。
- 集成方便:与 Spring Cloud 生态无缝集成,支持服务发现和负载均衡。
- 功能丰富:支持熔断、降级、拦截器等,满足复杂场景需求。
- 可维护性高:接口清晰,便于理解和维护。
缺点
- 学习曲线:需要理解注解和配置的使用方式。
- 依赖 Spring Cloud:对 Spring 生态有较强依赖,非 Spring 项目集成难度较大。
- 调试复杂:远程调用的调试相对本地调用更复杂。
八、适用场景
- 微服务架构:服务间的内部调用。
- 声明式 REST 客户端:简化与第三方 REST API 的交互。
- 需要熔断降级的场景:提高系统容错能力。
总结
OpenFeign 通过声明式的方式简化了微服务之间的远程调用,使代码更加简洁易读。结合 Spring Cloud 的服务发现和负载均衡功能,能够高效地构建分布式系统。同时,通过集成 Sentinel 等组件,进一步增强了系统的稳定性和容错能力。
openFeign 用于实现服务之间的调用 实现原理
OpenFeign 是 Spring Cloud 提供的声明式 HTTP 客户端,其核心设计目标是让服务间的远程调用变得像调用本地方法一样简单。以下是其实现原理的详细解析:
一、核心机制:动态代理 + 注解解析
OpenFeign 的核心是通过 Java 动态代理 和 注解解析 技术,将接口方法调用转化为 HTTP 请求。具体流程如下:
接口扫描与代理生成
- 启动时,Spring Cloud 扫描所有被
@FeignClient
注解标记的接口。 - 使用 JDK 动态代理(或 CGLIB)为每个接口生成代理类。
- 启动时,Spring Cloud 扫描所有被
注解解析
- 解析接口方法上的注解(如
@GetMapping
、@RequestBody
),构建 HTTP 请求模板。 - 将方法参数映射到 HTTP 请求的路径变量、查询参数或请求体。
- 解析接口方法上的注解(如
请求执行
- 代理对象拦截方法调用,根据请求模板生成 HTTP 请求。
- 通过 HTTP 客户端(如 Apache HttpClient、OKHttp)发送请求并处理响应。
二、关键组件与流程
1. FeignClientFactoryBean
- 负责创建 Feign 客户端代理对象的工厂类。
- 从 Spring 容器中获取配置和依赖(如编码器、解码器、拦截器)。
2. Contract
- 解析接口方法上的注解,生成请求模板(
MethodMetadata
)。 - 默认实现支持 Spring MVC 注解(如
@GetMapping
)。
3. Target
- 表示远程服务的目标地址,包含服务名和 URL 信息。
- 集成服务发现(如从 Eureka、Nacos 获取服务实例列表)。
4. Client
- 实际执行 HTTP 请求的客户端,支持多种实现:
LoadBalancerFeignClient
:集成 Ribbon/LoadBalancer 的负载均衡客户端。OkHttpClient
/ApacheHttpClient
:基于 OkHttp 或 Apache HttpClient 的实现。
5. RequestInterceptor
- 请求拦截器,可用于添加公共请求头(如认证信息)、修改请求参数等。
三、执行流程详解
1. 服务发现与负载均衡
// 示例接口
@FeignClient(name = "user-service")
public interface UserService {
@GetMapping("/users/{id}")
User getUser(@PathVariable("id") Long id);
}
name = "user-service"
对应注册中心的服务名。- 调用时,Feign 通过
LoadBalancerClient
从注册中心获取服务实例列表,并选择一个实例(如http://192.168.1.10:8080
)。
2. 请求模板生成
- 解析
@GetMapping("/users/{id}")
生成:- HTTP 方法:GET
- URL 模板:
http://user-service/users/{id}
- 参数映射:
@PathVariable("id")
绑定到路径变量。
3. 请求拦截与发送
- 应用所有
RequestInterceptor
(如添加认证头)。 - 通过负载均衡后的实际 URL(如
http://192.168.1.10:8080/users/1
)发送请求。
4. 响应处理
- 使用
Decoder
将 HTTP 响应转换为 Java 对象。 - 若发生异常,触发熔断降级逻辑(若配置了
fallback
)。
四、源码关键类与流程
1. 核心流程类
FeignClientsRegistrar
:扫描@FeignClient
注解并注册 Bean。FeignClientFactoryBean
:创建 Feign 客户端代理。SynchronousMethodHandler
:处理方法调用的核心类。
2. 关键方法调用链
// 简化的调用链示意
User user = userService.getUser(1L); // 调用代理方法
-> SynchronousMethodHandler.invoke() // 拦截方法调用
-> Target.apply() // 获取服务实例地址
-> Client.execute() // 执行 HTTP 请求
-> LoadBalancerFeignClient.execute() // 负载均衡
-> ApacheHttpClient.execute() // 实际发送请求
-> ResponseHandler.decode() // 解码响应
五、与其他组件的集成
1. 服务发现(如 Eureka/Nacos)
- 通过
DiscoveryClient
获取服务实例列表。 - 负载均衡客户端(如
RibbonLoadBalancerClient
)选择实例。
2. 熔断降级(如 Sentinel/Hystrix)
- 通过 AOP 拦截 Feign 方法调用,在异常时执行降级逻辑。
- 示例配置:
@FeignClient(name = "user-service", fallback = UserServiceFallback.class) public interface UserService { ... }
3. 请求压缩与日志
- 通过
Encoder
/Decoder
实现请求 / 响应压缩。 - 通过
Logger
记录请求和响应信息。
六、自定义扩展点
1. 自定义编码器 / 解码器
@Configuration
public class FeignConfig {
@Bean
public Encoder feignEncoder() {
return new GsonEncoder(); // 自定义 JSON 编码器
}
}
2. 自定义拦截器
public class AuthRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
template.header("Authorization", "Bearer token");
}
}
3. 自定义负载均衡策略
@Bean
public IRule ribbonRule() {
return new RandomRule(); // 随机负载均衡策略
}
七、性能优化建议
连接池配置
feign: httpclient: enabled: true max-connections: 200 max-connections-per-route: 50
超时设置
ribbon: ConnectTimeout: 2000 ReadTimeout: 5000
使用 OkHttp 替代默认客户端
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency>
总结
OpenFeign 通过 动态代理 + 注解解析 + 服务发现 的组合,将接口方法调用转化为 HTTP 请求,实现了服务间的声明式调用。其核心优势在于:
- 代码简洁:避免手动编写 HTTP 客户端代码。
- 无缝集成:与 Spring Cloud 生态(服务发现、负载均衡、熔断)深度整合。
- 可扩展性:通过自定义拦截器、编码器 / 解码器等组件,满足多样化需求。
理解其实现原理有助于更高效地使用 OpenFeign,并在遇到问题时快速定位和解决。
负载均衡
算法:轮询、随机、轮询重试、响应速度决定权重、最优可用、并发连接最小
Ribbon [ˈrɪbən]
在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是Ribbon+RestTemplate,另一种是OpenFeign @loadBlanced
负载均衡流程
Ribbon 是一个客户端的负载均衡器,它可以与 Eureka 配合使用轻松地实现客户端的负载均衡。Ribbon 会先从 Eureka Server(服务注册中心)去获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务端,从而达到负载均衡的目的。
负载均衡策略
Spring Cloud Ribbon 提供了一个 IRule 接口,该接口主要用来定义负载均衡策略,它有 7 个默认实现类,每一个实现类都是一种负载均衡策略。
实现策略,常见的有:轮询 (RoundRobin)默认、随机 (Random),权重,响应时间。
实现类 |
负载均衡策略 |
RoundRobinRule |
轮询策略 |
WeightedResponseTimeRule |
WeightedResponseTimeRule 是 RoundRobinRule 的一个子类,它对 RoundRobinRule 的功能进行了扩展。 |
RandomRule |
随机选取一个可用服务实例 |
BestAvailableRule |
忽略那些断路的服务器,并选择并发数低的服务器。 |
RetryRule |
重试机制的选择逻辑。 |
AvailabilityFilteringRule |
可用性敏感策略,先过滤掉故障,再选择并发量较小的服务实例。 |
ZoneAvoidanceRule |
区域(zone)网络就近原则,来选择服务实例。在没有区域的环境下,该策略与轮询(RandomRule)策略类似。 |
自定义负载均衡策略
//1、服消费者(客户端)的配置类中,将IRule的其他实现类注入到容器中。
@Bean
public IRule myRule() {
// RandomRule 为随机策略 全局生效
return new RandomRule();
}
2、自定义负载策略
public class MyRandomRule extends AbstractLoadBalancerRule {
}
3.配置类,将我们定制的负载均衡策略实现类注入到容器中
@Configuration
public class MySelfRibbonRuleConfig {
@Bean
public IRule myRule() {
//自定义 Ribbon 负载均衡策略
return new MyRandomRule(); //自定义,随机选择某一个微服务,执行五次
}
}
负载均衡方式有两种
服务端负载均衡
客户端负载均衡
Ribbon和Nginx的区别
服务器端负载均衡 Nginx
nginx 是客户端所有请求统一交给 nginx,由 nginx 进行实现负载均衡请求转发,属于服务器端负载均衡。既请求由 nginx 服务器端进行转发。
客户端负载均衡 Ribbon
Ribbon 是从 eureka 注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮询负载均衡策略。既在客户端实现负载均衡。
应用场景的区别:
Nginx 适合于服务器端实现负载均衡 比如 Tomcat。
Ribbon 适合与在微服务中 RPC 远程调用实现本地服务负载均衡,比如 Dubbo、SpringCloud 中都是采用本地负载均衡。
断路器 Hystrix/Sentinel
Hystrix 和 Sentinel 都是用于处理分布式系统中服务熔断、降级和限流等问题的工具,以下是它们的详细介绍:
Hystrix
- 基本概念:Hystrix 是由 Netflix 开源的一款用于处理分布式系统的延迟和容错的库。它通过隔离服务之间的访问点,阻止级联失败,从而提高系统的弹性和稳定性。
- 主要功能:
- 服务熔断:当某个服务的错误率达到一定阈值时,Hystrix 会自动熔断该服务,不再向其发送请求,而是直接返回一个预设的 fallback 结果,避免因单个服务故障导致整个系统崩溃。
- 服务降级:当系统资源紧张或服务出现问题时,Hystrix 可以主动降低某些非核心服务的功能或性能,以保证核心服务的正常运行。
- 线程隔离:Hystrix 为每个服务调用分配独立的线程池,当某个服务的线程池已满时,不会影响其他服务的线程池,从而避免了因一个服务的阻塞导致整个系统的线程耗尽。
- 应用场景:适用于各种分布式系统架构,尤其是微服务架构中,用于防止服务之间的故障传播,提高系统的可靠性和稳定性。例如,在一个电商系统中,当商品评论服务出现故障时,Hystrix 可以熔断该服务,让用户仍然能够正常浏览商品、下单等核心业务,而不会因为评论服务的故障影响整个系统的运行。
Sentinel
- 基本概念:Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
- 主要功能:
- 流量控制:可以根据不同的规则对服务的入流量进行控制,如基于 QPS(每秒请求数)、并发线程数等指标进行限流,防止系统因流量过大而崩溃。
- 熔断降级:与 Hystrix 类似,当服务的响应时间过长或错误率过高时,Sentinel 会熔断该服务,停止向其发送请求,并返回降级结果。
- 系统自适应保护:Sentinel 能够根据系统的负载情况,如 CPU 使用率、内存使用率等,自动调整流量控制策略,以保证系统在高负载情况下的稳定性。
- 应用场景:在大规模分布式系统中,特别是在高并发、流量波动较大的场景下表现出色。例如,在电商促销活动期间,流量会瞬间爆发式增长,Sentinel 可以通过流量控制和熔断降级等功能,确保核心业务服务的稳定运行,避免因流量过大导致系统崩溃,同时保证用户体验。
两者的区别
- 功能侧重点:Hystrix 更侧重于通过线程隔离和服务熔断来防止级联故障,保障系统的容错性;Sentinel 则更专注于流量控制,提供了丰富的流量控制规则和灵活的配置方式,能更好地应对高并发场景下的流量问题。
- 实现原理:Hystrix 基于线程池隔离和信号量机制来实现服务的隔离和熔断;Sentinel 通过对方法的拦截和规则引擎来实现流量控制和熔断降级,其底层采用了高效的滑动窗口算法来统计流量信息。
- 社区支持和生态:Hystrix 是 Netflix 开源的项目,在国外的开源社区有较高的知名度和广泛的应用;Sentinel 是阿里巴巴开源的项目,在国内的互联网公司中应用较为广泛,并且随着阿里巴巴在开源领域的影响力不断扩大,Sentinel 的社区也越来越活跃,生态也越来越完善。
Sentinel
Sentinel 是阿里巴巴开源的分布式系统流量防卫组件,主要用于流量控制、熔断降级、系统负载保护,保障微服务稳定性。以下是 Sentinel 的核心特性和使用场景的详细介绍:
核心特性
流量控制
- 多种限流模式:支持 QPS、并发线程数、响应时间等维度的限流。
- 预热模式:应对突发流量,逐步增加限流阈值。
- 排队等待:平滑处理流量峰值,避免瞬间拒绝大量请求。
熔断降级
- 错误率熔断:当服务错误率超过阈值时自动熔断。
- 慢调用熔断:响应时间过长时触发熔断,快速失败。
- 熔断恢复:自动进入半开状态,尝试恢复服务。
系统自适应保护
- 基于系统负载(CPU、内存、线程池)自动调节流量,防止系统过载。
热点参数限流
- 针对特定参数值(如热门商品 ID)单独限流,保护核心资源。
黑白名单控制
- 基于调用来源(如 IP、用户角色)进行访问控制。
集群限流
- 分布式环境下的统一限流,共享限流配额。
工作原理
Sentinel 通过 AOP 拦截 调用链路,结合 规则引擎 判断是否需要限流或降级:
- 资源定义:通过注解或 API 定义需要保护的资源(如接口、方法)。
- 规则配置:配置限流、熔断、系统保护等规则(支持动态配置)。
- Slot 链处理:
- 统计 Slot:记录请求数据(QPS、响应时间等)。
- 规则检查 Slot:根据规则判断是否放行或执行降级。
典型应用场景
高并发保护
- 秒杀活动、促销期间限制访问流量,防止系统崩溃。
服务降级
- 当依赖服务不可用时,快速返回默认结果(如商品详情页降级为静态缓存)。
系统负载保护
- 当系统 CPU 使用率超过 80% 时,自动拒绝部分请求,保障核心功能。
热点数据防护
- 对热门商品的访问单独限流,避免打爆后端服务。
集成方式
Sentinel 支持与主流框架无缝集成:
- Spring Cloud:通过 Sentinel Starter 自动集成,支持 Gateway、Feign 等组件。
- Dubbo:集成 Dubbo 服务调用,保护 RPC 接口。
- Servlet:拦截 HTTP 请求,保护 Web 服务。
- Redis、MySQL:对缓存和数据库访问进行限流。
示例代码
以下是 Sentinel 基本用法的示例:
// 1. 定义资源
public class ResourceDemo {
public static void main(String[] args) {
// 配置规则
initFlowRules();
// 模拟请求
while (true) {
try (Entry entry = SphU.entry("resourceName")) {
// 资源保护的业务逻辑
System.out.println("执行正常业务");
} catch (BlockException ex) {
// 被限流或降级时的处理
System.out.println("请求被拦截: " + ex.getClass().getSimpleName());
}
}
}
// 2. 配置限流规则
private static void initFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("resourceName"); // 资源名
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 基于 QPS 限流
rule.setCount(10); // 阈值:每秒 10 次请求
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
}
控制台与动态配置
Sentinel 提供可视化控制台,支持:
- 实时监控流量数据(QPS、响应时间、熔断次数)。
- 动态修改限流规则,无需重启应用。
- 查看系统负载和资源使用情况。
与 Hystrix 的对比
特性 | Sentinel | Hystrix |
---|---|---|
限流能力 | 更强大,支持多种限流模式 | 仅支持信号量 / 线程池隔离 |
熔断策略 | 支持慢调用、异常比例熔断 | 仅支持异常比例熔断 |
动态配置 | 支持实时动态调整规则 | 需重启或依赖其他配置中心 |
可视化 | 提供完整的控制台 | 需集成 Turbine 监控 |
社区活跃度 | 国内社区活跃,更新频繁 | 已进入维护模式 |
总结
Sentinel 适合需要精细化流量控制、高并发场景的项目,尤其在国内微服务生态(如 Spring Cloud Alibaba)中应用广泛。相比 Hystrix,Sentinel 提供更丰富的限流策略、更友好的可视化界面和动态配置能力,是当前分布式系统流量治理的首选方案之一。