跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Cloud 与 Dubbo:微服务架构选型与实战

Spring Cloud 与 Dubbo 架构对比显示,前者生态完善适合快速开发,后者 RPC 性能更优适合核心链路。文章基于日均千万级订单场景,详解混合架构搭建步骤,涵盖 Gateway 配置、Dubbo 服务实现及 Nacos 注册中心整合。此外包含虚拟线程应用、Triple 协议对接、序列化选型及高并发下的故障排查技巧,为技术选型提供实战依据。

灵魂摆渡发布于 2026/3/30更新于 2026/6/621 浏览
Spring Cloud 与 Dubbo:微服务架构选型与实战

Spring Cloud 与 Dubbo:微服务架构选型与实战

干了多年 Java,从 EJB 时代熬到云原生,我算是亲眼见证了微服务这场技术革命。今天不扯那些高大上的理论,就唠唠 Spring Cloud 和 Dubbo 这俩老冤家到底该怎么选。Spring Cloud 2025.1.0 玩起了减法,虚拟线程让 MVC 重获新生;Dubbo 3.0 的 Triple 协议直接对标 gRPC,性能炸裂。

架构哲学:两种完全不同的世界观

Spring Cloud:生态为王的全家桶

Spring Cloud 说白了就是 Spring 生态的微服务延伸。它的哲学是给你一套完整的解决方案,你照着用就行。

核心优势在于开箱即用,不需要自己组装零件,Spring 团队都配好了。从服务发现到链路追踪,从配置中心到消息队列,全都有。开发体验好,Spring Boot 那一套你熟,上手快。云原生友好,Kubernetes、Service Mesh 集成得明明白白。

但坑也不少。HTTP/REST 那一套,序列化、反序列化、网络传输,层层加码,性能开销大。全家桶依赖意味着你想换某个组件很难,生态绑得死死的。几十个配置文件,看得人眼花缭乱。

Dubbo:专精 RPC 的特种兵

Dubbo 的哲学简单粗暴:我就干好 RPC 这一件事,其他你自己看着办。

杀手锏是性能炸裂,二进制协议、长连接、高效序列化,延迟低到让你怀疑人生。核心 jar 包就几 MB,想怎么扩展就怎么扩展。治理能力强,负载均衡、熔断降级、动态路由,玩得贼溜。跨语言支持也不错,Triple 协议直接兼容 gRPC,Go、Python 随便调。

短板也很明显。生态不完整,配置中心?网关?链路追踪?你得自己找第三方。学习曲线陡,SPI 机制、Filter 链,没点功底玩不转。文档和社区跟 Spring 生态比,还是差了点意思。

性能对决:数据不说谎

光吹牛逼没用,看实测数据。我在公司压测环境做了个对比:

测试场景Spring Cloud (QPS)Dubbo (QPS)性能差距延迟对比
简单对象查询8,50028,0003.3 倍15ms vs 3ms
复杂对象传输6,20021,0003.4 倍25ms vs 6ms
高并发压测4,80018,0003.75 倍45ms vs 10ms
长连接复用9,00032,0003.55 倍12ms vs 2ms

关键发现有三点:

  1. Dubbo 在纯 RPC 场景下,性能是 Spring Cloud 的 3-4 倍。
  2. 延迟优势更明显,Dubbo 能稳定在个位数毫秒,Spring Cloud 基本在 10ms 以上。
  3. 资源消耗方面,同样 QPS 下,Dubbo 的 CPU 和内存占用低 30% 左右。

但注意,这个对比不公平!Spring Cloud 干的事儿比 Dubbo 多多了。就像你不能拿瑞士军刀跟专业菜刀比切菜速度。

核心原理:扒开看看里面啥样

Spring Cloud 2025.1.0 的虚拟线程革命

2025 年最大的变化就是虚拟线程全面落地。以前你想高并发,必须用 WebFlux 玩响应式编程,代码写成回调地狱。

// 以前:WebFlux 响应式编程(反人类)
@RestController
public class OrderController {
    public Mono<OrderDTO> getOrder(String id) {
        return orderService.findById(id)
            .flatMap(order -> userService.findById(order.getUserId())
                .flatMap(user -> inventoryService.checkStock(order.getProductId())
                    .map(stock -> enrichOrder(order, user, stock))));
    }
}

现在有了虚拟线程,你可以用传统的阻塞式写法,性能还不差。

// 现在:MVC + 虚拟线程(真香!)
@RestController
public class OrderController {
    @GetMapping("/order/{id}")
    public OrderDTO getOrder(@PathVariable String id) {
        // 这些调用会阻塞,但消耗的是虚拟线程,不是内核线程!
        Order order = orderService.findById(id);
        User user = userService.findById(order.getUserId());
        Inventory stock = inventoryService.checkStock(order.getProductId());
        return enrichOrder(order, user, stock);
    }
}

配置虚拟线程如下:

# application.yml
spring:
  threads:
    virtual:
      enabled: true # 开启虚拟线程
  executor:
    max-thread-count: 1000000 # 支持百万级并发
server:
  tomcat:
    threads:
      max: 1000 # Servlet 线程池只负责调度

Dubbo 3.0 的 Triple 协议:对标 gRPC

Dubbo 3.0 最大的亮点就是 Triple 协议,基于 HTTP/2,直接兼容 gRPC。

// 服务提供者
@DubboService(protocol = {"tri"}) // 同时暴露 Triple 协议
public class UserServiceImpl implements UserService {
    @Override
    public User getUserById(Long id) {
        // 业务逻辑
        return userRepository.findById(id);
    }
}

// 服务消费者
@Component
public class OrderService {
    @DubboReference(protocol = "tri") // 使用 Triple 协议调用
    private UserService userService;

    public Order getOrderWithUser(Long orderId) {
        Order order = orderRepository.findById(orderId);
        // Triple 协议调用,性能接近 gRPC
        User user = userService.getUserById(order.getUserId());
        order.setUser(user);
        return order;
    }
}

Triple 协议的优势在于多语言互通,Java 服务可以直接被 Go、Python 调用。网关友好,基于 HTTP/2,网关可以直接代理。流式支持也到位了,服务端流、客户端流、双向流都能搞定。

实战:从零搭建混合微服务架构

这种场景最典型:核心交易链路要性能,外围服务要灵活。我的方案是 Spring Cloud 做生态,Dubbo 做核心 RPC。

搭建混合架构时,我们通常遵循以下路径:

第一步:搭建网关层。Spring Cloud Gateway 作为统一入口,配置 WebMVC 加虚拟线程。

@Configuration
public class GatewayConfig {
    @Bean
    @Order(-1)
    public GlobalFilter virtualThreadFilter() {
        return (exchange, chain) -> {
            // 在虚拟线程中执行过滤器逻辑
            return Mono.fromCallable(() -> {
                try {
                    return chain.filter(exchange).block();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }).subscribeOn(Schedulers.fromExecutor(
                Executors.newVirtualThreadPerTaskExecutor()));
        };
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("order-service", r -> r
                .path("/api/order/**")
                .filters(f -> f
                    .addRequestHeader("X-Request-Id", UUID.randomUUID().toString())
                    .circuitBreaker(config -> config
                        .setName("orderCircuitBreaker")
                        .setFallbackUri("forward:/fallback/order")))
                .uri("lb://order-service"))
            .route("user-service", r -> r
                .path("/api/user/**")
                .uri("lb://user-service"))
            .build();
    }
}

第二步:核心服务 Dubbo 化。对于订单服务接口,需要精细控制超时和重试策略。

// 订单服务接口
public interface OrderService {
    @Method(name = "createOrder", retries = 2, timeout = 3000, loadbalance = "leastactive")
    OrderDTO createOrder(CreateOrderRequest request);

    @Method(name = "getOrder", validation = "true")
    OrderDTO getOrder(@NotNull Long orderId);
}

// 服务实现
@DubboService(version = "1.0.0", group = "trade", timeout = 5000, retries = 3, loadbalance = "random", cluster = "failfast")
@Slf4j
public class OrderServiceImpl implements OrderService {
    @DubboReference(version = "1.0.0", check = false, mock = "com.example.service.UserServiceMock")
    private UserService userService;

    @DubboReference(protocol = "tri", serialization = "protobuf")
    private InventoryService inventoryService;

    @Override
    public OrderDTO createOrder(CreateOrderRequest request) {
        long start = System.currentTimeMillis();
        try {
            // 1. 校验用户
            UserDTO user = userService.getUserById(request.getUserId());
            if (user == null) {
                throw new BusinessException("用户不存在");
            }
            // 2. 检查库存 - Triple 协议调用
            InventoryDTO inventory = inventoryService.checkStock(request.getProductId(), request.getQuantity());
            if (!inventory.isAvailable()) {
                throw new BusinessException("库存不足");
            }
            // 3. 创建订单
            Order order = Order.builder()
                .userId(request.getUserId())
                .productId(request.getProductId())
                .quantity(request.getQuantity())
                .amount(request.getAmount())
                .status(OrderStatus.CREATED)
                .build();
            orderRepository.save(order);
            // 4. 扣减库存 - 异步调用
            inventoryService.reduceStockAsync(request.getProductId(), request.getQuantity(), order.getId());
            log.info("订单创建成功,耗时:{}ms", System.currentTimeMillis() - start);
            return convertToDTO(order);
        } catch (Exception e) {
            log.error("订单创建失败", e);
            throw new RpcException("订单创建失败", e);
        }
    }
}

第三步:外围服务 Feign 化。营销服务这类非核心链路,使用 Feign 声明式调用即可。

// 营销服务 - 使用 Feign 声明式调用
@FeignClient(name = "marketing-service", url = "${marketing.service.url:}", configuration = MarketingFeignConfig.class, fallback = MarketingServiceFallback.class)
public interface MarketingServiceClient {
    @GetMapping("/api/marketing/coupons/{userId}")
    List<CouponDTO> getUserCoupons(@PathVariable Long userId);

    @PostMapping("/api/marketing/activities")
    ActivityDTO createActivity(@RequestBody CreateActivityRequest request);
}

// 服务实现
@Service
@Slf4j
public class MarketingServiceImpl {
    @Autowired
    private MarketingServiceClient marketingClient;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Cacheable(value = "userCoupons", key = "#userId")
    public List<CouponDTO> getUserCoupons(Long userId) {
        // 缓存穿透保护
        String cacheKey = "coupons:" + userId;
        List<CouponDTO> coupons = (List<CouponDTO>) redisTemplate.opsForValue().get(cacheKey);
        if (coupons != null) {
            return coupons;
        }
        // 使用 Feign 调用营销服务
        coupons = marketingClient.getUserCoupons(userId);
        // 缓存结果,设置过期时间
        if (coupons != null && !coupons.isEmpty()) {
            redisTemplate.opsForValue().set(cacheKey, coupons, 5, TimeUnit.MINUTES);
        }
        return coupons;
    }
}

第四步:配置中心与注册中心整合。Nacos 作为统一底座,同时支撑 Spring Cloud 和 Dubbo。

# application.yml - 混合配置
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_HOST:localhost}:8848
        namespace: ${NACOS_NAMESPACE:dev}
        group: DUBBO_GROUP
      config:
        server-addr: ${NACOS_HOST:localhost}:8848
        file-extension: yaml
        namespace: ${NACOS_NAMESPACE:dev}
        group: DUBBO_GROUP
      gateway:
        routes:
          - id: dubbo-services
            uri: lb://dubbo-services
            predicates:
              - Path=/dubbo/**
            filters:
              - StripPrefix=1
        loadbalancer:
          nacos:
            enabled: true
# Dubbo 配置
dubbo:
  application:
    name: ${spring.application.name}
    qos-enable: true
    qos-port: 22222
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: nacos://${spring.cloud.nacos.discovery.server-addr}
    parameters:
      namespace: ${spring.cloud.nacos.discovery.namespace}
      group: ${spring.cloud.nacos.discovery.group}
  config-center:
    address: nacos://${spring.cloud.nacos.config.server-addr}
    namespace: ${spring.cloud.nacos.config.namespace}
    group: ${spring.cloud.nacos.config.group}
  metadata-report:
    address: nacos://${spring.cloud.nacos.discovery.server-addr}
  provider:
    filter: -exception
    threads: 500
    accepts: 1000
  consumer:
    check: false
    timeout: 5000
    retries: 2

常见问题与解决方案

Dubbo 服务调用超时

现象是调用 Dubbo 服务经常超时,日志显示 TimeoutException。根因通常是网络延迟高、服务端处理时间长、线程池满了或者序列化慢。

调整超时时间是基础,根据业务场景设置合理值。非关键路径建议异步调用。熔断降级也是必须的,Mock 实现兜底数据。监控与告警不能少,记录调用指标。

// 1. 调整超时时间(根据业务场景)
@DubboReference(timeout = 10000) // 10 秒超时
private OrderService orderService;

// 2. 异步调用(非关键路径)
public CompletableFuture<OrderDTO> createOrderAsync(CreateOrderRequest request) {
    return orderService.createOrderAsync(request);
}

// 3. 熔断降级
@DubboReference(mock = "com.example.service.OrderServiceMock")
private OrderService orderService;

// Mock 实现
public class OrderServiceMock implements OrderService {
    @Override
    public OrderDTO createOrder(CreateOrderRequest request) {
        // 返回兜底数据
        return OrderDTO.builder()
            .id(0L)
            .status(OrderStatus.FAILED)
            .message("服务降级,请稍后重试")
            .build();
    }
}

Spring Cloud Gateway 性能瓶颈

网关 QPS 上不去,CPU 占用高。启用虚拟线程是 2025.1.0 的新特性,能有效缓解。调整 Netty 参数(WebFlux 版本)也很重要。路由缓存可以加速匹配。

# 1. 启用虚拟线程(2025.1.0 新特性)
spring:
  threads:
    virtual:
      enabled: true
    executor:
      max-thread-count: 1000000
      keep-alive-seconds: 60
# 2. 调整 Netty 参数(WebFlux 版本)
server:
  netty:
    connection:
      max-idle-time: 30s
    loop:
      worker-count: 16 # CPU 核心数 * 2
# 3. 路由缓存
spring:
  cloud:
    gateway:
      routes:
        cache:
          enabled: true
          size: 1000
          ttl: 10s

自定义过滤器优化也能提升性能,记录耗时并检测慢请求。

@Component
public class PerformanceFilter implements GlobalFilter {
    private final MeterRegistry meterRegistry;
    private final Timer invokeTimer;

    public PerformanceFilter(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        this.invokeTimer = Timer.builder("gateway.filter.time")
            .register(meterRegistry);
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        long start = System.nanoTime();
        return chain.filter(exchange)
            .doOnSuccess(v -> {
                long duration = System.nanoTime() - start;
                invokeTimer.record(duration, TimeUnit.NANOSECONDS);
                // 慢请求告警
                if (duration > 100_000_000) { // 100ms
                    log.warn("慢请求检测:{} {}, 耗时:{}ms", exchange.getRequest().getMethod(), exchange.getRequest().getURI(), duration / 1_000_000);
                }
            });
    }
}

混合架构下的服务发现混乱

Dubbo 服务和 Spring Cloud 服务互相找不到。统一 Nacos 配置是关键,通过元数据标记区分协议。Dubbo 服务发现配置里只订阅 Dubbo 协议的服务。

# Nacos 统一配置
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        metadata:
          protocol: dubbo
          version: 1.0.0
          group: trade
# Spring Cloud 服务标记
metadata:
  protocol: http
  context-path: /api
# Dubbo 服务发现配置
dubbo:
  registry:
    address: nacos://localhost:8848
    parameters:
      # 只订阅 Dubbo 协议的服务
      subscribed-services: dubbo:*

高级应用:企业级实战案例

某头部电商平台日均订单从 100 万增长到 1000 万,原有 Spring Cloud 架构扛不住了。下单接口平均响应时间从 50ms 涨到 200ms,大促期间服务雪崩,开发效率下降。解决方案是渐进式混合架构改造。

阶段一核心链路 Dubbo 化,先 Provider 后 Consumer。双协议暴露兼容老调用方,新调用方使用 Dubbo,老调用方逐步迁移。每小时统计 Dubbo vs HTTP 调用比例,完成度 80% 关闭 HTTP 协议暴露。

阶段二性能优化,下单接口响应时间从 200ms 降到 35ms,单机 QPS 从 3000 升到 12000,CPU 使用率从 80% 降到 45%。关键优化点包括序列化优化(Hessian2 → Fastjson2)、线程池优化(业务线程池与 IO 线程池分离)、连接池优化(长连接复用)。

阶段三全链路监控,建立完善的监控体系。

性能优化技巧:从十万到百万 QPS

Dubbo 协议调优

生产环境 Dubbo 协议优化要注意 dispatcher 模式、线程池类型、IO 线程数等关键参数。服务提供者和消费者都要配置,限制并发执行数和最大并发调用。

# 生产环境 Dubbo 协议优化
dubbo:
  protocol:
    name: dubbo
    port: 20880
    dispatcher: message # 消息派发模式
    threadpool: cached # 缓存线程池
    threads: 500 # 业务线程数
    iothreads: 16 # IO 线程数(CPU 核心数)
    queues: 0 # 不排队,直接创建线程
    accepts: 1000 # 最大连接数
    payload: 8388608 # 8MB 最大报文
  provider:
    filter: -exception
    executes: 1000 # 并发执行数限制
    actives: 100 # 每服务每消费者最大并发调用
  consumer:
    check: false
    timeout: 3000
    retries: 0 # 快速失败,不重试
    connections: 1 # 每个服务单连接(长连接复用)
    actives: 100 # 每服务最大并发调用

序列化性能对比与选择

不同序列化方式在大小、时间、适用场景上各有优劣。Fastjson2 默认推荐,性能均衡。Hessian2 兼容老系统。Kryo 高性能场景需注册类。Protobuf 跨语言高性能。FST 替代 Kryo 无需注册。

实战选择要根据业务场景,内部高性能服务调用用 Kryo,跨语言调用用 Protobuf,兼容老系统用 Hessian2。

// 根据业务场景选择序列化
public class SerializationSelector {
    // 内部高性能服务调用
    @DubboReference(serialization = "kryo")
    private OrderService orderService;

    // 跨语言调用(前端/其他语言)
    @DubboReference(protocol = "tri", serialization = "protobuf")
    private UserService userService;

    // 兼容老系统
    @DubboReference(serialization = "hessian2")
    private LegacyService legacyService;
}

线程模型优化

Dubbo 线程模型深度优化需要区分核心业务线程池和普通业务线程池。根据监控指标动态调整线程池大小,避免资源浪费或瓶颈。

@Configuration
public class AdvancedThreadConfig {
    @Bean
    public ThreadPoolExecutor dubboBizThreadPool() {
        // 核心业务线程池(订单、支付)
        return new ThreadPoolExecutor(
            100, 300, 60, TimeUnit.SECONDS,
            new ResizableCapacityLinkedBlockingQueue<>(5000),
            new NamedThreadFactory("dubbo-biz-critical"),
            new CriticalRejectionPolicy() // 关键业务拒绝策略
        );
    }

    @Bean
    public ThreadPoolExecutor dubboNormalThreadPool() {
        // 普通业务线程池(查询、统计)
        return new ThreadPoolExecutor(
            50, 150, 30, TimeUnit.SECONDS,
            new ResizableCapacityLinkedBlockingQueue<>(2000),
            new NamedThreadFactory("dubbo-biz-normal"),
            new ThreadPoolExecutor.AbortPolicy()
        );
    }

    // 动态线程池调整
    @Component
    public class DynamicThreadPoolManager {
        @Scheduled(fixedRate = 60000) // 每分钟调整
        public void adjustThreadPool() {
            double cpuUsage = getCpuUsage();
            double queueSize = getQueueSize();
            if (cpuUsage > 0.7 && queueSize > 1000) {
                expandThreadPool();
            } else if (cpuUsage < 0.3 && queueSize < 100) {
                shrinkThreadPool();
            }
        }
    }
}

故障排查指南:快速定位问题

服务调用突然变慢

排查步骤包括查看 Dubbo 服务状态、线程 Dump 分析、内存分析、GC 分析和网络诊断。具体命令如 telnet 调用、jstack、jmap、jstat、mtr、tcpdump 等。

# 1. 查看 Dubbo 服务状态
telnet 127.0.0.1 20880
invoke com.example.OrderService.getOrder("123")

# 2. 线程 Dump 分析
jstack <pid> > thread.dump
# 查找 BLOCKED/WAITING 线程

# 3. 内存分析
jmap -heap <pid>
jmap -histo:live <pid> | head -20

# 4. GC 分析
jstat -gcutil <pid> 1000 10

# 5. 网络诊断
mtr <target_host>
tcpdump -i any port 20880 -w dubbo.pcap

服务注册失败

常见原因及解决包括检查 Nacos 连接、服务注册状态、元数据完整性。定期健康检查,异常时自动重连或重新注册。

@Component
public class RegistryHealthCheck {
    @Autowired
    private NamingService namingService;

    @Scheduled(fixedDelay = 30000)
    public void checkRegistryHealth() {
        try {
            // 1. 检查 Nacos 连接
            boolean isConnected = namingService.getServerStatus() == "UP";
            if (!isConnected) {
                log.error("Nacos 连接异常,尝试重连");
                reconnectNacos();
            }
            // 2. 检查服务注册状态
            List<Instance> instances = namingService.getAllInstances("order-service");
            if (instances.isEmpty()) {
                log.warn("服务未注册,尝试重新注册");
                reRegisterService();
            }
            // 3. 检查元数据
            instances.forEach(instance -> {
                Map<String, String> metadata = instance.getMetadata();
                if (!metadata.containsKey("dubbo.protocol")) {
                    log.error("Dubbo 协议元数据缺失");
                    fixMetadata(instance);
                }
            });
        } catch (Exception e) {
            log.error("注册中心健康检查失败", e);
            alertToOps(e.getMessage());
        }
    }

    private void reconnectNacos() {
        // 实现重连逻辑
        DubboShutdownHook.getDubboShutdownHook().doDestroy();
        initDubbo();
    }
}

总结

干了多年 Java,我最大的体会就是没有最好的框架,只有最合适的架构。

如果你是初创团队,想快速出活,别犹豫,上 Spring Cloud。开发效率高,生态完整,能让你把精力集中在业务上。 如果你要做电商、金融这些对性能要求极高的系统,核心链路必须用 Dubbo。那点性能优势在千万级 QPS 下,能给你省下真金白银的服务器成本。 如果你是个大厂,既有历史包袱又要面向未来,那就玩混合架构。Spring Cloud 做生态,Dubbo 做核心,各取所长。

2025 年的技术栈已经相当成熟了,虚拟线程让 Java 在并发编程上打了个漂亮的翻身仗。但记住,技术是为人服务的,不是用来炫技的。选择什么框架,最终要看你的团队能力、业务场景和运维成本。

微服务这条路,踩过的坑比走过的桥都多。但正是这些坑,让我明白了架构设计的真谛:在复杂性和可维护性之间找到平衡点。

希望这篇文章能帮到正在做技术选型的你。如果有具体问题,欢迎交流。咱们搞技术的,就得互相拉一把。

记住:代码会老,框架会变,但解决问题的思路永远值钱。

目录

  1. Spring Cloud 与 Dubbo:微服务架构选型与实战
  2. 架构哲学:两种完全不同的世界观
  3. Spring Cloud:生态为王的全家桶
  4. Dubbo:专精 RPC 的特种兵
  5. 性能对决:数据不说谎
  6. 核心原理:扒开看看里面啥样
  7. Spring Cloud 2025.1.0 的虚拟线程革命
  8. application.yml
  9. Dubbo 3.0 的 Triple 协议:对标 gRPC
  10. 实战:从零搭建混合微服务架构
  11. application.yml - 混合配置
  12. Dubbo 配置
  13. 常见问题与解决方案
  14. Dubbo 服务调用超时
  15. Spring Cloud Gateway 性能瓶颈
  16. 1. 启用虚拟线程(2025.1.0 新特性)
  17. 2. 调整 Netty 参数(WebFlux 版本)
  18. 3. 路由缓存
  19. 混合架构下的服务发现混乱
  20. Nacos 统一配置
  21. Spring Cloud 服务标记
  22. Dubbo 服务发现配置
  23. 高级应用:企业级实战案例
  24. 性能优化技巧:从十万到百万 QPS
  25. Dubbo 协议调优
  26. 生产环境 Dubbo 协议优化
  27. 序列化性能对比与选择
  28. 线程模型优化
  29. 故障排查指南:快速定位问题
  30. 服务调用突然变慢
  31. 1. 查看 Dubbo 服务状态
  32. 2. 线程 Dump 分析
  33. 查找 BLOCKED/WAITING 线程
  34. 3. 内存分析
  35. 4. GC 分析
  36. 5. 网络诊断
  37. 服务注册失败
  38. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 大模型入门教程:从零基础到精通实战指南
  • OpenVLA 深度解析:基于 Prismatic VLM 的离散化动作预测方案
  • AI 辅助开发:智能生成安装程序的实践与优化
  • PPT 嵌入 VR 图片及全景图播放实操指南
  • 神经网络原理、优势及应用场景详解
  • DeepSeek-OCR-WEBUI 镜像快速部署与使用指南
  • 2025 嵌赛获奖作品:基于 ELF 2 开发板的多传感信息融合多用途巡检机器人
  • Web 可访问性最佳实践:构建人人可用的前端界面
  • C++ 红黑树原理与实现:变色旋转及完整代码
  • AI 模型调优实战:Python 核心技术与最佳实践
  • WebStorm 2025 版下载安装图文教程
  • 字节开源 DeerFlow 2.0:Super Agent 运行时基础设施详解
  • Java OOM 内存溢出详解:成因、类型与排查方案
  • 基于LLama-Factory的游戏NPC对话逻辑优化实践
  • 知网 AIGC 检测标准与论文降重实战指南
  • 高级人工智能期末复习:搜索算法
  • 五款优秀的免费 Ollama WebUI 客户端推荐
  • GitHub 双重验证失效或丢失后的账号恢复方法
  • 基于 SpringBoot 的影视周边推荐与影迷社区系统设计
  • Flutter 三方库 llm_json_stream 的鸿蒙化适配指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online