找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2126

积分

0

好友

286

主题
发表于 3 天前 | 查看: 31| 回复: 0

互联网时代,面对复杂的业务需求,我们通常采用 分而治之 的策略。将一个庞大的单体系统拆分为多个职责单一的微服务,便于垂直深度扩展。然而,这些独立的微服务如何高效协同,串联起来发挥最大价值呢?

这时,我们就需要一个完整的微服务生态圈。

一个成熟的微服务生态应包含哪些核心模块?它们各自承担什么角色?

  • 服务的注册与发现。服务提供者启动时将自身信息注册上报,调用方通过连接注册中心,结合负载均衡算法即可动态获取服务提供者地址,实现应用间的解耦。
  • 服务调用。通过 HTTP、RPC 等多种协议实现目标服务的实际调用。
  • 负载均衡。提供多种负载算法(如随机、轮询等),服务于集群多实例的选择机制。
  • 服务的稳定性保障。提供服务熔断、限流、降级等能力。
  • 分布式配置中心。统一管理应用配置,支持修改后动态生效。
  • 消息队列。将非核心逻辑从同步流程中抽离,实现解耦和异步化处理,缩短响应时间。
  • 网关。将限流、鉴权、黑白名单、灰度等通用逻辑抽取到前置系统统一处理。
  • 监控。监控系统整体的健康状况。
  • 分布式链路追踪。清晰展示接口调用链路,为性能优化和问题排查提供依据。
  • 自动化部署。实现持续集成,快速部署应用。

围绕这些功能模块,Spring Cloud Alibaba 为我们提供了微服务化开发的一站式解决方案。开发者仅需引入少量依赖,通过 Spring 注解和 YAML 配置,便能快速搭建一套健壮的微服务体系,对于追求效率的团队而言,无疑是极佳的选择。

那么,这套生态具体包含了哪些核心的技术框架呢?

Spring Cloud Alibaba生态圈总览

一、Spring Boot(服务基座)

Spring Boot 是 Spring 框架的扩展,它提供了更为丰富的注解,遵循“约定优于配置”的原则。通过与主流开源框架集成,设计了 StarterAutoConfiguration 机制,极大地简化了配置流程。开发者只需引入简单的 Jar 包,即可快速获得相应组件的集成能力,显著提升开发效率。

主要特点:

  • 提供丰富的注解,告别繁琐的 XML Bean 配置。
  • 内嵌 Web 容器,如 Tomcat(默认)、Jetty、Undertow。
  • 集成主流开源框架,能根据项目依赖自动完成配置。

二、Nacos(注册中心、分布式配置中心)

Nacos 是阿里巴巴开源的项目,全称 Naming Configuration Service,专注于服务发现和配置管理领域。它旨在帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。功能全面,足以替代早期的 Spring Cloud Netflix Eureka、Spring Cloud Config 等组件。其客户端目前支持 Java、Go、Python、C# 等多种主流语言。

开源地址:https://github.com/alibaba/nacos

Nacos 提供了友好的控制台,便于管理服务、监控状态及配置应用。

集群化部署:

无论是作为注册中心还是配置中心,单节点的 Nacos 都存在单点故障风险。如何保障其高可用?Nacos 官方推荐了集群部署方案。

Nacos集群部署架构图

官方集群部署文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

在 Nacos 解压目录的 nacos/conf 下,修改 cluster.conf 配置文件,每行配置一个节点(通常配置 3 个或以上节点)。

# ip:port
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848

这种方式保证了客户端只需连接任一节点,由 Leader 节点将数据同步到其他节点,确保数据一致性。

对于上层的负载均衡(SLB),我们可以采用 Nginx 或 OpenResty,在其 upstream 模块中配置 Nacos 集群的 IP 地址列表。同时,借助 Nginx 的心跳检测机制,当某个 Nacos 实例宕机时,SLB 会自动屏蔽故障节点,将流量切换至健康实例。

为了防止 OpenResty 自身成为单点故障,可以结合 Keepalived 实现高可用。

基于OpenResty与Keepalived的Nacos高可用架构

客户端请求虚拟 IP(VIP),由活跃的 OpenResty 节点接收并转发给后端的 Nacos 集群。当主 OpenResty 节点宕机时,备用节点会自动接管,从而解决单点故障问题。

Keepalived 是一种高性能的服务器高可用解决方案。关于 Keepalived + Nginx 的具体部署步骤,可参考相关技术文档。

三、RestTemplate + Ribbon(远程调用)

Spring Cloud Ribbon 是基于 Netflix Ribbon 封装的负载均衡框架,内部集成了随机、轮询等多种负载算法。它能够与注册中心(如 Nacos)打通,自动获取服务提供者的地址列表,并根据负载算法选择目标实例发起调用。

Ribbon 提供了扩展接口,支持开发者自定义负载均衡算法。

public class CustomRule extends AbstractLoadBalancerRule {
    private AtomicInteger count = new AtomicInteger(0);
    @Override
    public Server choose(Object key) { 
        return choose(getLoadBalancer(), key);
    }

    private Server choose(ILoadBalancer loadBalancer, Object key) {
        List<Server> allServers = loadBalancer.getAllServers(); 
        int requestNumber = count.incrementAndGet(); 
        if (requestNumber >= Integer.MAX_VALUE) { 
            count = new AtomicInteger(0); 
        }
        if (null != allServers) {
            int size = allServers.size();
            if (size > 0) {
                int index = requestNumber % size;                
                Server server = allServers.get(index);
                if (null == server || !server.isAlive()) { 
                    return null;
                }
                return server;
            }
        }
        return null;
    }
}

存在的缺点:

调用方每次发起远程调用时,都需要手动拼接服务地址并配置参数,使用起来较为繁琐。

// 注册到Nacos的应用名称
private final String SERVER_URL = "http://nacos-provider-demo"; 
@Resource
private RestTemplate restTemplate;

@RequestMapping("/hello") 
public String hello() {
 // 远程服务调用
   return restTemplate.getForObject(SERVER_URL + "/hello", String.class);
}

四、OpenFeign(远程调用)

RestTemplate + Ribbon 在每次调用时都需要处理地址拼接的问题。Feign 是一个声明式的 RESTful HTTP 客户端,它内嵌了 Ribbon 作为客户端负载均衡,采用面向接口的编程方式。使用时,只需定义一个接口并添加 @FeignClient 注解,非常便捷。

OpenFeign 是 Feign 的增强版,对 Feign 进行了进一步封装,支持 Spring MVC 的标准注解和 HttpMessageConverts

依赖引入:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

使用示例:

@FeignClient(value = "${provider.name}") 
public interface OrderService {

 // 调用服务提供者的 /create_order 接口
 @RequestMapping(value = "/create_order",method = RequestMethod.GET) 
 public String createOrder();

其中,@FeignClient(value = "${provider.name}") 指定了服务提供方的应用名(对应注册中心的服务名)。底层会自动从注册中心获取该服务的实例列表,并依据负载均衡算法将请求路由到目标服务器。

OpenFeign 默认的接口响应超时时间为 1 秒,可通过配置项 feign.client.config.default.readTimeout 进行调整。

五、Dubbo Spring Cloud(远程调用)

RestTemplate + RibbonOpenFeign 均基于 HTTP 协议进行远程调用。而 Dubbo Spring Cloud 则基于 TCP 协议,相比 HTTP 大量的请求头信息,TCP 协议更加轻量级。

Dubbo Spring Cloud = Spring Cloud + Dubbo

主要特性:

  • 支持多种注册中心,用于服务注册与发现。
  • 内置多种负载均衡策略。
  • 服务粒度为面向接口,支持高性能的 RPC 调用。
  • 采用微内核 + 插件设计,易于扩展。

依赖引入:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

需要注意的是,虽然集成了 Spring Cloud,增加了一些注解和 YAML 配置使其更易开发,但其核心调用模式依然遵循 Dubbo 框架的规范。

几个关键配置项:

  • dubbo.scan.base-packages # Dubbo 服务扫描的基准包
  • dubbo.protocol.name: dubbo # 支持的协议
  • dubbo.protocol.port: -1 # Dubbo 协议端口(-1 表示自增端口,从 20880 开始)
  • dubbo.registry.address # 注册中心地址

六、Spring Cloud Gateway(网关)

在分布式系统中,为每个微服务配置独立域名并不现实。网关应运而生,它作为流量的统一入口,承担了反向代理的角色,将限流、鉴权、监控、路由转发等公共逻辑前置化处理。

API网关架构示意图

Spring Cloud 生态早期的网关 Zuul 已停止维护。官方推出的 Spring Cloud Gateway,其底层基于响应式编程框架 WebFlux,而 WebFlux 的底层采用了高性能网络框架 Netty,性能表现优异。

核心组件:

  1. 路由(Route):定义转发规则。
  2. 断言(Predicate):判断请求是否匹配当前路由。官方提供了丰富的内置断言,也支持自定义断言工厂。自定义类需继承 AbstractRoutePredicateFactory,并按规则命名(如 "配置名"+RoutePredicateFactory),以便在配置中引用。
  3. 过滤器(Filter):在请求或响应前后添加自定义逻辑。分为全局过滤器(作用于所有路由)和局部过滤器(作用于特定路由)。同样支持自定义,局部过滤器需继承 AbstractGatewayFilterFactory 并按规则命名;全局过滤器需实现 GlobalFilterOrdered 接口,其中 Ordered 接口用于定义执行优先级。

依赖引入:

<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

YAML 配置示例:

spring:
  cloud:
    gateway:
      routes:  #路由,可配置多个
        - id: user_route  # 路由id,唯一即可
          uri: lb://user-server-sample # 匹配成功后转发的服务地址
          order: 1 # 路由优先级,数值越小优先级越高
          predicates:
            - Path=/user/**  # 断言,路径匹配
          filters:
            - AddRequestHeader=X-Request-token, 12345678  #为请求添加头部信息

为了动态感知服务实例的变化,通常会引入 Nacos 等注册中心。网关在路由转发时,只需从注册中心动态获取服务实例地址即可。

七、Sentinel(熔断、限流、降级)

Sentinel 是阿里巴巴开源的流量控制框架,提供了直观易用的控制台,其支持的场景比 Hystrix 更为广泛。它集成简单,通过少量配置即可快速接入,并支持 gRPC、Dubbo、Spring Cloud 等多种框架。

同类框架对比:

  • Hystrix 已停止维护。
  • Resilience4j 是一个轻量级容错库,专为 Java 8 和函数式编程设计,通过装饰器模式提供断路器、限速器等功能。

流控规则:

  • 资源名:唯一标识。
  • 针对来源:可针对特定调用方(应用名)进行限流。
  • 阈值类型:QPS(每秒请求数)或线程数。
  • 流控模式:直接、关联(关联资源触发阈值时限流当前资源)、链路(根据调用链路入口限流)。
  • 流控效果:快速失败、Warm Up(预热)、排队等待。

降级规则:

基于响应时间 (RT)、异常比例或异常数。

系统规则:

针对整个应用的所有入口流量进行控制,粒度更大。

授权规则:

根据调用方判断是否允许访问资源,如黑白名单机制。

热点规则:

可以细粒度地针对方法的某个或某几个参数进行流量控制。

@SentinelResource 注解:

类似于 Hystrix 的 @HystrixCommand@SentinelResource 注解允许定制化限流或降级后的处理逻辑。默认的英文提示不够友好,因此通常需要自定义兜底方法。

// 资源名称为handle1 
@RequestMapping("/handle1")
@SentinelResource(value = "handle1", blockHandler = "blockHandlerTestHandler")
public String handle1(String params) { 
    // 业务逻辑处理
    return "success";
}

// 接口方法 handle1 的限流兜底方法
public String blockHandlerTestHandler(String params, BlockException blockException) {
    return "请求过于频繁,请稍后再试";
}

注意:blockHandler 处理的是因限流、降级等规则触发的 BlockException;而 fallback 处理的是业务逻辑抛出的其他异常。

集群流控:

在集群部署环境下,为了防止单机流量不均对下游造成冲击,需要采用集群流控。理想情况下,集群的总 QPS 阈值 = 单机阈值 × 节点数。

八、Seata(分布式事务)

数据库事务能保证单个系统内数据操作的原子性。但在跨系统、跨数据库的交易场景中,就需要引入分布式事务解决方案。Seata 是一款开源的分布式事务解决方案,致力于提供高性能且易用的分布式事务服务,支持 AT、TCC、SAGA 和 XA 等多种事务模式,默认采用 AT 模式。

优点:

  • 对业务无侵入:减少微服务化带来的分布式事务问题对业务代码的侵入。
  • 高性能:降低分布式事务解决方案本身带来的性能损耗。

Seata分布式事务架构图

Seata 的三个核心角色:

  • 事务管理器(TM):定义全局事务边界,负责开启、提交或回滚全局事务。
  • 事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚(Seata-Server)。
  • 资源管理器(RM):管理分支事务的资源,与 TC 通信以注册分支事务并报告状态,驱动分支事务的提交或回滚(集成在客户端)。

AT 模式运行流程:

  1. TM 向 TC 申请开启全局事务,TC 生成全局唯一的 XID。
  2. XID 在微服务调用链路中传播。
  3. RM 向 TC 注册分支事务,并将其纳入对应 XID 的管辖。
  4. RM 执行业务 SQL,并生成 undo_log 回滚日志,提交本地事务。
  5. 所有分支执行完毕后,TM 向 TC 发起针对 XID 的全局提交或回滚决议。
  6. TC 调度该 XID 下的所有分支事务完成提交或回滚。提交则删除 undo_log;回滚则依据 undo_log 进行数据补偿,再删除日志。

九、Spring Cloud Stream(异步消息)

Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它通过统一的编程模型屏蔽了底层消息中间件(如 RabbitMQ、Kafka、RocketMQ)的差异。

常用注解:

  • @Input:声明输入通道,用于消费消息。
  • @Output:声明输出通道,用于生产消息。
  • @StreamListener:监听队列,处理消息。
  • @EnableBinding:绑定消息通道。

依赖引入(以RocketMQ为例):

<dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>

启用绑定:

@SpringBootApplication
@EnableBinding({CustomSource.class})
public class StreamProduceApplication {
 public static void main(String[] args) {
  SpringApplication.run(StreamProduceApplication.class, args);
 }
}

定义输出信道接口:

public interface CustomSource {
    @Output("output1")
    MessageChannel output1();
}

YAML 配置:

spring:
  cloud:
    stream:
      rocketmq:
        binder:
          name-server: 127.0.0.1:9876 # rocketMq服务地址
        bindings:
          output1:
            producer:
              transactional: true    # 开启事务
              group: myTxProducerGroup    # 事务分组
      bindings:
        output1:
          destination: test-transaction-topic # 主题
          content-type: application/json # 消息数据类型

发送消息:

@Service
public class SendMessageService {
    @Resource
    private CustomSource customSource;

    public String sendMessage() { //发送简单字符串消息的方法
        String message = "字符串测试消息";
        // 发送消息
  customSource.output1().send(MessageBuilder.withPayload(message).build());        
  return "发送成功!";
    }
}

十、SkyWalking(分布式链路追踪)

SkyWalking 是一款优秀的 APM(应用性能监控)系统,专为微服务、云原生和容器化环境设计。它通过探针自动收集应用指标,实现分布式链路追踪,帮助开发者清晰地感知服务间的调用关系

主要特性:

  • 支持告警功能。
  • 采用探针技术,实现代码零侵入
  • 轻量高效,无需依赖大数据平台。
  • 支持 Java、.NET Core、Node.js 等多种语言的自动探针。
  • 提供功能强大的可视化管理界面。

SkyWalking可观测性分析平台架构

  • 上半部分 Agent:负责从应用中收集链路追踪数据,并发送给 SkyWalking OAP 服务器。支持接收 SkyWalking、Zipkin、Jaeger 等多种格式的数据。
  • 下半部分 SkyWalking OAP:接收 Agent 上报的数据,进行分析 (Analysis Core),存储到外部存储,并提供查询 (Query) 功能。
  • 右侧 Storage:追踪数据存储。支持 Elasticsearch、MySQL、TiDB、H2 等多种存储,官方生产环境推荐使用 Elasticsearch
  • 左侧 SkyWalking UI:提供 Web 控制台,用于查看链路、指标等信息。

SkyWalking 部署简单,可直接从 Apache 官网下载并解压使用。

官网:https://skywalking.apache.org/
快速入门:https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/

十一、XXL-JOB(分布式任务调度)

单机定时任务存在诸多不足:不支持集群(易导致重复执行)、单点故障、缺乏失败重试、无法动态调整、无报警机制等。XXL-JOB 作为一款分布式任务调度框架,完美解决了这些问题。它依赖简单(仅需 Java 和 MySQL),开箱即用,并提供可视化界面、任务数据统计、动态调度、邮件报警、任务分片及失败重试等功能。

核心模块:

  1. 调度中心:负责任务的调度触发,不执行业务逻辑。
  2. 执行器:接收调度中心的请求,并执行业务逻辑。

依赖引入:

<dependency>
 <groupId>com.xuxueli</groupId>
 <artifactId>xxl-job-core</artifactId>
 <version>2.2.0</version>
</dependency>

YAML 配置:

server:
  port: 8082  #程序端口
xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8002/xxl-job-admin  # 调度中心地址
    accessToken:  # 通信token,调度中心与执行器需一致
    executor:
      appname: xxl-job-executor-sample  #执行器名称
      port: 9989  #执行器端口
      logpath: D:/work/Spring-Cloud-Alibaba/sample/logs # 日志路径
      logretentiondays: 30 # 日志保留天数

执行器初始化 Bean:

@Bean
public XxlJobSpringExecutor xxlJobExecutor() { // XXL-JOB执行器初始化
    XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
    xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
    xxlJobSpringExecutor.setAppname(appname);
    xxlJobSpringExecutor.setAddress(address);
    xxlJobSpringExecutor.setIp(ip);
    xxlJobSpringExecutor.setPort(port);
    xxlJobSpringExecutor.setAccessToken(accessToken);
    xxlJobSpringExecutor.setLogPath(logPath);
    xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
    return xxlJobSpringExecutor;
}

任务开发支持 BEAN模式(使用 @XxlJob 注解,适合复杂业务)和 GLUE模式(代码托管在调度中心,适合简单任务)。

对于大数据量任务,可以采用分片处理机制,将任务分摊到各个执行器节点并行处理。

shardingVO.getIndex()  # 当前执行器的分片序号(从0开始)
shardingVO.getTotal()  # 总分片数,即执行器集群的数量

# dataSource 待处理的所有原始数据
for (Integer val : dataSource) { // 遍历数据
    if (val % shardingVO.getTotal() == shardingVO.getIndex()) { // 取模分片
        //TODO 归属于当前分片处理
    } 
}  

XXL-JOB 官方文档:https://www.xuxueli.com/xxl-job/

总结

Spring Cloud Alibaba 提供了一套功能完善、易于集成的微服务组件生态。从服务发现、配置管理、远程调用,到流量控制、分布式事务、链路追踪,几乎涵盖了微服务架构所需的方方面面。对于希望快速构建稳健、可扩展的分布式系统的团队,尤其是在云原生环境下,深入理解并合理选用这些组件至关重要。技术选型没有绝对的最优解,关键在于结合自身业务场景、团队技术栈和运维能力,做出最适合的决策。





上一篇:Spring Cloud 配置中心实践:手写简化版并整合动态刷新机制
下一篇:微服务架构演进:从单体到分布式,如何设计高可用系统
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-10 12:46 , Processed in 0.417743 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表