B.50.10.10-微服务与电商应用

微服务架构核心原理与电商应用实战

核心理念: 本文深入对比当前最主流的两大Java微服务框架------Spring Cloud与Dubbo,并剖析其在服务发现、配置管理、网关、熔断限流等服务治理领域的实现原理与最佳实践。我们将重点探讨Nacos作为注册中心与配置中心的核心机制,以及Spring Cloud Gateway与Sentinel的内部工作原理。本文的目标是帮助架构师在复杂的业务场景下,为微服务体系做出最合理的技术选型,并构建出稳定、高可用的分布式系统。


第1章:微服务架构核心概念与价值

1.1. 微服务架构核心概念

微服务架构是一种将大型单体应用拆分为一组小型、独立、可独立部署的服务的架构风格。其目标是提升敏捷性、可扩展性和可维护性。

核心概念包括:

  • 服务拆分 : 遵循单一职责原则,按照业务边界将应用拆分为独立的服务。
  • 去中心化: 每个服务都可以有自己的技术栈、数据库和开发团队。
  • API网关: 所有外部请求的统一入口,负责路由、认证、限流、日志等。
  • 服务注册与发现: 服务实例动态地在注册中心注册自己的地址,消费者从注册中心发现并调用服务。
  • 配置中心: 集中管理所有服务的配置信息,实现配置的动态更新。
  • 服务容错: 通过熔断、降级、限流等机制保障系统稳定性。

服务治理 服务A 注册中心 服务B 服务C 配置中心 服务容错 客户端 API网关 数据库A 数据库B 数据库C

1.2. 微服务架构的优势与挑战

优势:

  1. 技术多样性: 不同服务可以使用不同的技术栈
  2. 独立部署: 服务可以独立开发、测试、部署和扩展
  3. 故障隔离: 单个服务的故障不会影响整个系统
  4. 团队自治: 不同团队可以独立开发和维护各自的服务
  5. 可扩展性: 可以根据业务需求独立扩展特定服务

挑战:

  1. 分布式复杂性: 网络延迟、故障处理、数据一致性等问题
  2. 运维复杂性: 需要管理多个服务实例
  3. 数据一致性: 跨服务的事务处理变得复杂
  4. 测试复杂性: 需要协调多个服务的测试
  5. 通信开销: 服务间通信相比进程内调用开销更大

第2章:主流微服务框架对比:Spring Cloud vs Dubbo

2.1. 框架概述

特性 Spring Cloud Dubbo
出身 Spring家族,Pivotal开源 阿里巴巴开源,后捐赠给Apache
核心优势 生态整合、全家桶方案 高性能RPC、强大的服务治理
通信协议 基于HTTP/RESTful (默认) 基于RPC (默认,如Dubbo协议)
服务调用方式 通过Feign声明式调用,像调用本地方法 传统RPC接口调用
与Spring集成 无缝集成,是Spring Boot的官方推荐 完美集成,但需要额外依赖
生态系统 庞大,组件丰富 (Gateway, Feign, Sentinel等) 聚焦RPC核心,生态相对独立

2.2. 设计哲学的不同

  • Spring Cloud : 它不是一个单一的框架,而是一个微服务治理的规范和解决方案的集合。它将Netflix、Alibaba等公司的成熟组件(如Eureka, Hystrix, Nacos, Sentinel)进行封装和抽象,提供了统一的、基于注解的编程模型。其默认采用HTTP/RESTful风格,使得服务间调用更像是访问Web资源,易于理解和调试。

  • Dubbo : 它从一开始就定位为一个高性能的RPC框架。其核心是解决服务间的远程过程调用问题,追求极致的性能和强大的服务治理能力(如负载均衡、服务路由、优雅停机等)。

2.3. 技术选型指南

选型军规 : "技术选型服务于业务和团队。新建项目、云原生环境、团队熟悉Spring全家桶,优选Spring Cloud Alibaba。存量系统、对性能有极致要求、需要精细化服务治理,Dubbo是强力选项。"

选择Spring Cloud (特别是Spring Cloud Alibaba)的场景:

  • 新项目与初创团队: Spring Cloud提供了从网关、服务发现到配置、熔断的一站式解决方案,开发体验统一,上手快。
  • 云原生与容器化: Spring Cloud对容器化部署、服务网格(Service Mesh)的集成更为友好。
  • 需要与外部系统进行大量HTTP交互: 其基于RESTful的设计天然适合与各种异构系统集成。
  • 团队技术栈统一: 团队熟悉Spring生态,希望使用统一的技术栈。

选择Dubbo的场景:

  • 对性能要求极高的核心业务: 如交易、金融等场景,Dubbo的RPC性能优于HTTP。
  • 需要精细化服务治理: Dubbo提供了丰富的负载均衡策略、服务路由规则、参数调优等高级功能,允许架构师对服务调用行为进行像素级的控制。
  • 从大型单体应用迁移: Dubbo强大的服务化能力,非常适合作为大型单体应用拆分为微服务的利器。
  • 已有Dubbo技术积累: 团队已有Dubbo使用经验,且系统对性能要求较高。

现代趋势:融合与互通

  • Dubbo 3.0引入了基于HTTP/2的Triple协议,并开始拥抱云原生。
  • Spring Cloud也通过集成Dubbo,实现了两者的互联互通。
  • 未来的趋势是,RPC与REST的界限会越来越模糊,框架底层更多地采用gRPC、HTTP/2等高性能协议,而上层提供统一的编程模型。

第3章:微服务核心组件详解

3.1. 核心组件概览

微服务架构依赖于一系列核心组件来实现服务治理,主要包括:

功能 Spring Cloud组件 集成的开源项目 职责
服务注册与发现 Spring Cloud Alibaba (Nacos) Nacos 管理服务实例的地址,实现动态服务发现
服务调用 Spring Cloud OpenFeign OpenFeign 提供声明式的、类型安全的HTTP客户端,简化服务间调用
API网关 Spring Cloud Gateway Project Reactor (Netty) 提供路由、断路、过滤、重试等网关功能
客户端负载均衡 Spring Cloud LoadBalancer - 在客户端层面将请求分发到多个服务实例
服务容错 Spring Cloud Alibaba (Sentinel) Sentinel 实现熔断、降级、限流,防止服务雪崩
配置中心 Spring Cloud Alibaba (Nacos) Nacos 集中管理和动态刷新应用配置
分布式事务 Seata Seata 解决跨服务的分布式事务问题
分布式锁 Redis/Zookeeper Redisson/Curator 实现跨服务的分布式锁机制

3.2. 服务注册与发现:Nacos深度剖析

Nacos (Naming and Configuration Service) 是Spring Cloud Alibaba生态中的核心组件,同时支持服务发现和配置管理。

3.2.1. Nacos作为注册中心

工作原理:

  1. 服务注册 : 服务提供者(Provider)启动时,通过心跳机制向Nacos Server注册自己的实例信息(IP, 端口, 健康状态等)。Nacos支持临时实例永久实例
  2. 服务发现: 服务消费者(Consumer)向Nacos Server订阅(Subscribe)某个服务。Nacos会将该服务的健康实例列表推送给消费者,并缓存在其本地。
  3. 心跳与健康检查: 临时实例通过定时发送心跳来维持注册。如果Nacos在一定时间内没收到心跳,会将其标记为不健康并从列表中剔除。Nacos也会主动进行健康检查。
  4. 实时推送 : 当服务实例列表发生变化时(如上线、下线、宕机),Nacos Server会主动将最新的列表推送给所有订阅的消费者,实现了服务状态的近实时更新。

对比Eureka:

  • 一致性协议: Eureka 1.0采用AP模型(最终一致),节点间相互注册,不区分leader/follower。Nacos支持CP(基于Raft协议)和AP(类Distro协议)两种模式切换。
  • 健康检查: Eureka只依赖客户端心跳。Nacos除了心跳,还支持服务端主动健康检查。
  • 实时性: Nacos的服务状态变更通知是近实时的,而Eureka有30秒的延迟。
  • 功能: Nacos集成了服务发现和配置管理,功能更强大。
3.2.2. Nacos作为配置中心

核心功能:

  • 配置实时更新 : 应用启动时从Nacos拉取配置,并监听配置变化。当管理员在Nacos控制台修改配置并发布后,Nacos会主动将变更推送到应用,应用接收到后动态刷新其上下文(如@Value注入的值,或@ConfigurationProperties绑定的对象),实现配置的热更新
  • 灰度发布与版本管理: 支持配置的版本控制和灰度发布,可以将配置先推送到指定的几台机器,验证通过后再全量发布。
  • 命名空间与分组 :
    • Namespace: 用于多环境隔离(如dev, test, prod)。
    • Group: 用于区分不同的应用或业务模块。
    • Data ID : 通常是具体的配置文件名(如database.properties)。

3.3. 服务间通信:OpenFeign与负载均衡

3.3.1. OpenFeign:优雅的服务调用

OpenFeign让服务间的调用变得像调用本地方法一样简单。

java 复制代码
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/users/{id}")
    UserDTO getUserById(@PathVariable("id") Long id);
}
3.3.2. Spring Cloud LoadBalancer:客户端负载均衡

Spring Cloud LoadBalancer是Spring Cloud提供的客户端负载均衡器,它可以在客户端层面将请求分发到多个服务实例。

主要特性:

  • 支持多种负载均衡策略(随机、轮询等)
  • 与服务发现组件集成
  • 支持自定义负载均衡策略

3.4. 服务容错与流量控制:Sentinel原理

Sentinel是阿里巴巴开源的,面向分布式服务架构的轻量级流量控制框架。

3.4.1. 熔断降级

目的: 当下游服务因故障或延迟过高时,为了防止整个系统的雪崩效应,暂时切断对该服务的调用,并在一段时间后尝试恢复。

策略:

  • 慢调用比例: 在指定时间窗口内,如果慢调用(响应时间 > 阈值)的比例超过设定值,则触发熔断。
  • 异常比例/异常数: 在指定时间窗口内,如果异常请求的比例或数量超过设定值,则触发熔断。

熔断状态:

  • Closed: 关闭状态,正常调用。
  • Open: 打开状态,熔断开启,直接返回错误或执行降级逻辑。
  • Half-Open: 半开状态。在Open状态持续一段时间后进入,会尝试放行少量请求。如果这些请求成功,则回到Closed状态;如果失败,则重新回到Open状态。
3.4.2. 流量控制(限流)

目的: 保护系统不被瞬时的高并发流量冲垮。

核心算法:

  • 令牌桶算法 (Token Bucket) : 系统以一个恒定的速率向桶里放入令牌。请求到来时,必须先从桶里获取一个令牌才能被处理。如果桶里没有令牌,则请求被拒绝或排队。非常适合应对突发流量
  • 漏桶算法 (Leaky Bucket) : 请求像水一样进入桶中,桶以一个固定的速率漏水(处理请求)。如果水流过快,桶会溢出(拒绝请求)。可以强制平滑请求速率

Sentinel的实现: Sentinel内部使用了滑动时间窗口(Sliding Window)算法来统计时间窗口内的请求数,并结合令牌桶等算法实现精准的流量控制。

3.4.3. 对比Hystrix
  • 隔离策略: Hystrix主要通过线程池或信号量进行资源隔离。Sentinel支持线程池、信号量隔离,并提供了更轻量级的并发线程数控制。
  • 熔断策略: Sentinel支持更丰富的熔断策略(慢调用比例、异常比例、异常数)。
  • 实时性: Sentinel的监控和规则配置都是近实时的,而Hystrix需要重启应用。
  • 生态: Sentinel有强大的控制台,可以实时监控、动态配置规则。
  • 结论: Hystrix已停止更新,Sentinel是其完美的替代者和继任者。

第4章:API网关详解

API网关是微服务架构的入口,负责请求路由、认证、限流、日志等。

4.1. Spring Cloud Gateway vs Zuul

  • Zuul 1.x:

    • 模型 : 基于阻塞式I/O和多线程模型。每个请求都会被分配一个线程,直到请求处理完毕。
    • 缺点: 在高并发下,线程是宝贵资源。如果后端服务响应慢,大量线程会被阻塞,导致网关性能瓶颈和资源耗尽。
  • Spring Cloud Gateway:

    • 模型 : 基于非阻塞式I/O的响应式编程模型(Spring WebFlux / Project Reactor)。
    • 原理: 使用少量I/O线程(通常等于CPU核心数)来处理所有请求。当请求需要等待I/O(如调用下游服务)时,线程不会被阻塞,而是去处理其他请求。当I/O操作完成后,通过回调机制继续处理后续逻辑。
    • 优点: 极高的并发性能和资源利用率,是现代微服务网关的首选。

4.2. 核心工作原理

Gateway的工作流程可以概括为:客户端请求 -> Gateway Handler Mapping -> Gateway Web Handler -> 过滤器链 (Filter Chain) -> 代理到后端服务。

  • Route (路由): 网关的基本构建块,由ID、目标URI、一组谓词和一组过滤器定义。
  • Predicate (谓词): 用于匹配HTTP请求的任何内容,如路径、Host、请求头等。
  • Filter (过滤器): 用于在请求转发前后修改请求和响应。

4.3. 实践示例

daily-discover-gateway模块中,我们通过Java Bean的方式配置路由,这比写在配置文件中更灵活。

java 复制代码
@Configuration
public class GatewayRoutesConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user-service-route", r -> r.path("/api/user/**")
                .filters(f -> f.stripPrefix(2))
                .uri("lb://daily-discover-user"))
            .build();
    }
}
  • uri("lb://daily-discover-user"): lb协议表示启用Spring Cloud LoadBalancer进行负载均衡,它会从Nacos等服务发现中心查找名为daily-discover-user的服务实例列表,并选择一个进行请求转发。

4.4. 全局过滤器:实现统一的横切关注点

全局过滤器(GlobalFilter)会应用到所有路由上,是实现认证、授权、日志等横切关注点的最佳位置。

java 复制代码
@Component
@Order(-1) // 保证该过滤器在路由过滤器之前执行
public class AuthGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        
        if (token == null || !isValid(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        
        ServerHttpRequest modifiedRequest = exchange.getRequest().mutate()
            .header("X-User-Id", getUserIdFrom(token))
            .build();
        
        return chain.filter(exchange.mutate().request(modifiedRequest).build());
    }

    private boolean isValid(String token) { /* ... */ }
    private String getUserIdFrom(String token) { /* ... */ }
}

第5章:分布式系统核心问题解决方案

5.1. 分布式事务:Seata解决方案

在微服务架构中,一次业务操作往往需要跨越多个独立的服务。如何保证这些跨服务操作的原子性 ------要么全部成功,要么全部失败?这便是分布式事务要解决的核心难题。

5.1.1. Seata核心概念
  • Transaction Coordinator (TC - 事务协调者) : Seata Server。它是独立的、中心化的服务,负责维护全局事务的状态,接收事务注册,并驱动全局事务的提交或回滚。
  • Transaction Manager (TM - 事务管理器) : 嵌入在事务发起方(通常是业务入口的服务)的 Seata Client 中。负责开启一个全局事务,并最终向 TC 发起全局提交或回滚的决议。
  • Resource Manager (RM - 资源管理器) : 嵌入在事务参与方的 Seata Client 中。负责管理分支事务,与 TC 协同,根据 TC 的指令来驱动分支事务的提交或回滚。
5.1.2. Seata核心事务模式
  1. AT 模式(Automatic Transaction) : AT 模式因其对业务的零侵入性而最为常用。它通过代理数据源,拦截业务 SQL,生成 Undo Log 来实现分布式事务。
  2. TCC 模式(Try-Confirm-Cancel): TCC 模式是一种业务侵入性较强的事务模式,需要开发者为每个业务操作实现三个方法:Try、Confirm、Cancel。
  3. Saga 模式: Saga 模式是一种长事务解决方案,将一个长事务拆分为多个短事务,每个短事务都有对应的补偿操作。

5.2. 分布式锁:Redis与Zookeeper实现

在分布式系统中,应用部署在多台机器上,Java 的内置锁无法跨 JVM 生效,因此需要一种能够协调所有节点的机制,这就是分布式锁。

5.2.1. 基于Redis实现分布式锁

这是目前业界最主流、性能最高的分布式锁实现方式。

  • 核心命令

    shell 复制代码
    SET lock_key random_value NX PX 30000
    • lock_key: 锁的唯一标识。
    • random_value: 一个随机值,用于保证"解铃还须系铃人",只有加锁的客户端才能释放锁。
    • NX: (Not eXists),只在 key 不存在时才设置成功,保证了原子性。
    • PX 30000: 设置锁的过期时间为 30000 毫秒,防止客户端宕机导致死锁。
  • 释放锁: 使用 Lua 脚本保证原子性。

    lua 复制代码
    if redis.call("get", KEYS[1]) == ARGV[1] then
        return redis.call("del", KEYS[1])
    else
        return 0
    end
5.2.2. 基于Zookeeper实现分布式锁
  • 实现原理 : 利用 Zookeeper 的临时有序节点
    1. 加锁: 每个客户端尝试在某个父节点下创建一个临时有序节点。
    2. 创建后,获取父节点下的所有子节点,判断自己创建的节点是否是序号最小的。如果是,则获取锁成功。
    3. 如果不是,则对序号比自己小的前一个节点注册一个 Watcher 监听。
    4. 释放锁: 执行完业务逻辑后,删除自己创建的节点即可。当一个节点被删除时,其后继节点会收到通知,再次尝试获取锁。

5.3. RPC框架:服务间通信基础

RPC (Remote Procedure Call),即远程过程调用,是一种允许一台计算机(客户端)上的程序,调用另一台计算机(服务器)上的子程序(过程或函数),而不需要程序员显式地为这个远程交互编码的协议。

5.3.1. RPC调用流程

Client Client Stub RPC Framework Server Stub Server 调用方法 (如 a.get(id)) 序列化请求 (方法名, 参数) 网络传输 接收数据 反序列化请求 执行本地方法 返回结果 序列化响应 网络传输 接收数据 反序列化响应 得到结果 Client Client Stub RPC Framework Server Stub Server

5.3.2. 主流RPC框架
  1. gRPC (Google): 基于 HTTP/2,性能优越,使用 Protobuf 作为接口定义语言和序列化协议。
  2. Dubbo (Alibaba): 功能丰富,服务治理能力强大,是 Java 领域最流行的 RPC 框架之一。
  3. Thrift (Facebook): 拥有自己的接口定义语言和完整的 RPC 解决方案,跨语言支持优秀。

第6章:微服务架构设计与最佳实践

6.1. 服务拆分原则

  1. 业务边界: 按照业务领域进行拆分,每个服务负责一个明确的业务功能
  2. 数据隔离: 每个服务拥有独立的数据存储,避免数据耦合
  3. 接口契约: 定义清晰的服务接口契约,确保服务间通信的稳定性
  4. 版本管理: 合理管理服务版本,支持平滑升级和回滚
  5. 单一职责: 每个服务只负责一个核心业务功能

6.2. 数据一致性处理

在微服务架构中,数据一致性是一个重要挑战。常见的处理方式包括:

  1. 分布式事务: 使用Seata等分布式事务框架保证强一致性
  2. 最终一致性: 通过消息队列实现最终一致性
  3. 补偿机制: 通过补偿操作来处理异常情况
  4. 幂等性设计: 确保重复操作不会产生副作用

6.3. 监控与运维

微服务架构需要完善的监控和运维体系:

  1. 链路追踪: 使用SkyWalking、Zipkin等工具追踪请求链路
  2. 指标监控: 监控服务的性能指标,如响应时间、错误率等
  3. 日志管理: 集中管理服务日志,便于问题排查
  4. 自动化运维: 使用Kubernetes等容器编排工具实现自动化部署和运维
  5. 健康检查: 实现服务健康检查机制,及时发现和处理问题

第7章:电商系统微服务架构实践

7.1. 典型电商系统架构

RPC RPC RPC RPC 用户端 API网关 用户服务 商品服务 订单服务 支付服务 库存服务 用户数据库 商品数据库 订单数据库 支付数据库 库存数据库 Nacos注册中心 Nacos配置中心 Sentinel Seata事务协调器

7.2. 核心服务设计

  1. 用户服务: 负责用户注册、登录、权限管理等功能
  2. 商品服务: 负责商品信息管理、商品搜索等功能
  3. 订单服务: 负责订单创建、订单查询、订单状态管理等功能
  4. 支付服务: 负责支付处理、退款处理等功能
  5. 库存服务: 负责库存管理、库存扣减等功能

7.3. 关键业务流程

  1. 订单创建流程:

    • 用户下单请求到达订单服务
    • 订单服务调用库存服务检查并扣减库存
    • 订单服务调用支付服务处理支付
    • 订单服务更新订单状态
  2. 库存管理流程:

    • 商品上架时库存服务增加库存
    • 用户下单时库存服务扣减库存
    • 库存不足时触发补货提醒

7.4. 高并发场景优化

  1. 缓存策略: 使用Redis等缓存热点数据,减少数据库压力
  2. 限流降级: 使用Sentinel实现接口限流和降级
  3. 异步处理: 使用消息队列处理非核心业务流程
  4. 数据库优化: 读写分离、分库分表等策略
  5. CDN加速: 静态资源使用CDN加速

第8章:核心概念与题库

Q: 什么是服务雪崩?如何防止?
A: 服务雪崩是指一个服务的故障导致依赖该服务的其他服务也接连发生故障。防止雪崩的核心手段是服务容错,主要有三种方式:服务隔离、服务熔断、服务降级。

Q: Nacos作为注册中心,AP和CP模式有什么区别?
A: AP模式(默认)保证可用性,允许短时间数据不一致。CP模式保证强一致性,但在网络分区时可能无法注册新服务。

Q: Spring Cloud Gateway和Zuul有什么区别?
A: Gateway基于Spring WebFluxNetty ,是非阻塞异步 模型,性能更高。Zuul 1.x是基于Servlet阻塞同步模型。Spring Cloud官方已推荐使用Gateway替代Zuul。

Q: 什么是服务熔断?Sentinel是如何实现的?
A: 服务熔断是一种保护机制,当某个服务出现故障时,暂时切断对该服务的调用,防止故障扩散。Sentinel通过监控服务的响应时间、异常率等指标,在达到阈值时触发熔断,进入熔断状态后直接返回错误或执行降级逻辑。

Q: 微服务架构中如何保证数据一致性?
A: 微服务架构中保证数据一致性的方式包括:

  1. 分布式事务: 使用Seata等框架实现强一致性
  2. 最终一致性: 通过消息队列实现最终一致性
  3. 补偿机制: 通过补偿操作处理异常情况
  4. 幂等性设计: 确保重复操作不会产生副作用

Q: Spring Cloud和Dubbo有什么区别?
A: 主要区别包括:

  1. 通信协议: Spring Cloud默认基于HTTP/RESTful,Dubbo基于RPC
  2. 生态系统: Spring Cloud生态更丰富,Dubbo专注于RPC
  3. 性能: Dubbo的RPC性能通常优于HTTP
  4. 集成性: Spring Cloud与Spring Boot集成更紧密

Q: 什么是分布式锁?有哪些实现方式?
A: 分布式锁是在分布式环境下保证同一时间只有一个客户端能够持有锁的机制。主要实现方式包括:

  1. 基于Redis: 使用SET NX PX命令和Lua脚本
  2. 基于Zookeeper: 利用临时有序节点实现
  3. 基于数据库: 使用唯一索引或行级锁实现

Q: 微服务如何进行服务拆分?
A: 微服务拆分应遵循以下原则:

  1. 业务边界: 按照业务领域进行拆分
  2. 单一职责: 每个服务只负责一个核心功能
  3. 数据隔离: 每个服务拥有独立的数据存储
  4. 接口契约: 定义清晰的服务接口
相关推荐
喂完待续6 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
我真的是大笨蛋7 小时前
K8S-基础架构
笔记·云原生·容器·kubernetes
Lei活在当下8 小时前
【业务场景架构实战】1. 多模块 Hilt 使用原则和环境搭建
性能优化·架构·客户端
歪歪10010 小时前
Qt Creator 打包应用程序时经常会遇到各种问题
开发语言·c++·qt·架构·编辑器
wdxylb10 小时前
Kubernetes实战系列(4)
云原生·容器·kubernetes
我真的是大笨蛋11 小时前
K8S-Pod(上)
java·云原生·容器·kubernetes
海上生明月丿12 小时前
微服务01
java·spring boot·微服务
野生技术架构师12 小时前
开发微服务的9个最佳实践
微服务·云原生·架构