首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

10-Spring Cloud Alibaba 之 Dubbo 深度剖析与实战

  • 25-04-17 23:28
  • 3466
  • 6941
juejin.cn

Spring Cloud Alibaba 之 Dubbo 深度剖析与实战

在这里插入图片描述

一、Dubbo 核心定位与架构解析

1.1 微服务架构中的高性能通信引擎

在微服务架构体系中,服务间高效通信是系统性能的关键。Dubbo 作为一款高性能的 RPC 框架,专注于解决分布式系统中服务调用的问题,提供了高性能、透明化的远程方法调用方案,以及服务治理功能,极大提升了微服务架构的可扩展性与稳定性,在电商、金融等对性能要求极高的领域广泛应用。

1.2 核心架构分层探秘

  1. 服务提供者(Provider):实现业务接口,并将服务注册到注册中心。服务提供者启动时,读取配置文件中的服务定义,通过 RPC 协议将服务接口暴露给注册中心,供消费者发现和调用。例如在电商系统中,商品服务作为提供者,将商品查询、库存管理等接口注册到注册中心。

  2. 注册中心(Registry):负责服务的注册与发现,维护服务提供者和消费者的地址列表。常见的注册中心有 Zookeeper、Nacos 等。当服务提供者注册服务时,注册中心记录服务的元数据信息;服务消费者订阅服务时,注册中心推送可用的服务提供者地址列表给消费者。

  3. 服务消费者(Consumer):从注册中心获取服务提供者地址,通过代理方式调用远程服务。消费者启动时,根据配置文件中的服务引用信息,从注册中心订阅所需服务,生成服务代理对象。当应用程序调用服务接口时,实际是通过代理对象进行远程方法调用。

  4. 监控中心(Monitor):收集服务调用的统计信息,如调用次数、响应时间、失败率等,用于服务治理和性能优化。服务提供者和消费者在调用过程中,会将相关统计信息发送给监控中心,管理员可通过监控中心的可视化界面查看服务运行状况。

1.3 核心组件协同机制

组件交互交互流程应用场景
Provider 与 RegistryProvider 启动时向 Registry 注册服务,并定时心跳续约;Registry 存储 Provider 地址信息电商商品服务启动,将商品查询接口注册到 Nacos 注册中心
Consumer 与 RegistryConsumer 启动时从 Registry 订阅服务,获取 Provider 地址列表;Registry 推送地址变更通知订单服务启动,从 Nacos 订阅商品服务地址,实时感知商品服务节点变化
Consumer 与 ProviderConsumer 根据负载均衡策略选择 Provider 发起 RPC 调用;Provider 接收请求并返回结果订单服务调用商品服务查询商品详情,完成订单创建流程
Provider/Consumer 与 MonitorProvider 和 Consumer 在调用前后向 Monitor 发送统计信息;Monitor 汇总分析数据通过监控中心查看商品服务每天的调用次数、平均响应时间,评估服务性能

二、Dubbo 核心功能深度解析

2.1 服务注册与发现机制

  1. 注册流程详解:服务提供者启动时,Dubbo 框架读取dubbo-service.xml(或注解配置)中的服务定义,根据注册中心地址(如zookeeper://127.0.0.1:2181),将服务接口名称、版本、方法列表等元数据信息发送给注册中心。注册中心验证信息后,将服务注册到内部数据结构中,并为服务提供者分配唯一标识。例如:
xml
代码解读
复制代码
<dubbo:service interface="com.example.GoodsService" ref="goodsServiceImpl" version="1.0.0" registry="zookeeperRegistry" />
  1. 发现流程揭秘:服务消费者启动时,根据dubbo-reference.xml(或注解配置)中的服务引用信息,向注册中心订阅所需服务。注册中心根据订阅信息,查询已注册的服务提供者列表,将符合条件(如版本匹配)的提供者地址返回给消费者。消费者缓存地址列表,并通过负载均衡算法选择提供者进行调用。例如:
xml
代码解读
复制代码
<dubbo:reference id="goodsService" interface="com.example.GoodsService" version="1.0.0" registry="zookeeperRegistry" />

2.2 高性能 RPC 调用原理

  1. 通信协议选择:Dubbo 支持多种通信协议,如 Dubbo 协议、HTTP 协议、RMI 协议等。Dubbo 协议基于 Netty 实现,采用 NIO 异步通信,具有高性能、低延迟的特点,适用于内部服务调用;HTTP 协议则便于与外部系统集成。可在配置文件中指定协议,如:
xml
代码解读
复制代码
<dubbo:protocol name="dubbo" port="20880" />
  1. 序列化机制解析:为提高数据传输效率,Dubbo 支持多种序列化方式,如 Hessian2、JSON、Protobuf 等。Hessian2 是默认序列化方式,具有高效、跨语言的特性。通过配置文件可切换序列化方式,例如:
xml
代码解读
复制代码
<dubbo:service interface="com.example.UserService" ref="userServiceImpl" serialization="protobuf" />
  1. 远程调用流程:消费者调用服务接口时,Dubbo 框架通过动态代理生成代理对象,代理对象根据负载均衡算法选择一个服务提供者地址,将调用参数进行序列化,通过网络发送到提供者。提供者接收请求,反序列化参数,调用本地服务方法,将结果序列化后返回给消费者。

2.3 服务治理功能矩阵

在这里插入图片描述

Dubbo 提供了一套全面且灵活的服务治理功能,帮助开发者在复杂的分布式环境中确保服务的稳定运行、高效调用以及灵活管控。以下详细介绍其核心的服务治理功能:

2.3.1 负载均衡

功能描述:在存在多个服务提供者实例时,负载均衡机制决定了消费者请求具体被路由到哪个提供者。Dubbo 支持多种负载均衡策略,包括随机(Random)、轮询(RoundRobin)、权重轮询(WeightedRoundRobin)、最少活跃调用数(LeastActive)等。这些策略能够根据不同的业务场景和服务特性,将请求均匀且合理地分配到各个服务实例上,避免单个实例因负载过高而性能下降,同时充分利用集群资源,提升整体服务的吞吐量和响应速度。

应用场景:以电商大促活动为例,大量用户同时涌入系统进行商品查询、下单等操作。此时,将商品服务部署为多个实例,采用负载均衡策略可以将海量请求均匀分发。例如,对于热门商品的查询服务,可采用权重负载均衡,根据各个商品服务实例的硬件配置、性能表现等因素设置不同的权重,将更多流量导向性能强劲的实例,确保用户能够快速获取商品信息,提升购物体验。

配置示例:在 Dubbo 的配置文件中,通过dubbo:reference标签的loadbalance属性来指定负载均衡算法。如使用随机负载均衡策略调用订单服务:

xml
代码解读
复制代码
<dubbo:reference interface="com.example.OrderService" loadbalance="random" />

若要使用权重负载均衡,则配置为loadbalance="weighted" 。

2.3.2 服务降级

功能描述:当服务出现故障(如服务器宕机、网络异常)或面临高并发压力而响应缓慢甚至不可用时,服务降级机制发挥作用。它允许系统在紧急情况下返回一个预先定义好的默认值、错误提示信息或简单的备用数据,而不是让消费者长时间等待或抛出异常,从而避免因单个服务的问题引发整个系统的级联故障,保障核心业务的基本可用。

应用场景:在电商系统中,商品服务可能由于数据库故障无法正常查询商品详情。此时,订单服务作为消费者调用商品服务时,通过服务降级机制,订单服务可以直接返回诸如 “商品查询失败,请稍后重试” 的提示信息给用户,防止订单流程因商品服务不可用而阻塞,保证用户仍能进行部分操作,如放弃当前商品选择其他商品,或者继续完成订单流程但标记商品信息待更新。

配置示例:在消费者的 Dubbo 配置文件中,通过dubbo:reference标签的mock属性来配置服务降级。当商品服务不可用时,直接返回空值:

xml
代码解读
复制代码
<dubbo:reference interface="com.example.GoodsService" mock="return null" />

若需要自定义降级逻辑,可配置mock="true" ,并在项目中实现对应的MockService类,在其中编写具体的降级处理代码,如返回默认商品信息等。

2.3.3 服务容错

功能描述:服务容错旨在确保服务调用的可靠性,通过设置调用重试次数、超时时间等参数,在调用过程中出现短暂故障时,系统能够自动采取补救措施。当一次服务调用失败(如网络闪断导致请求未成功发送到提供者),在设置的重试次数内,Dubbo 会自动重新发起调用;同时,设置合理的超时时间可以避免消费者长时间等待无响应的服务,及时释放资源并进行相应处理。

应用场景:在调用第三方物流接口获取物流信息时,由于外部网络环境复杂或第三方服务不稳定,可能会出现调用失败的情况。通过配置服务容错参数,如重试 3 次,超时 5 秒,当首次调用失败时,系统自动重试,增加获取物流信息成功的可能性。若在 5 秒内仍未收到响应,则终止等待,返回错误提示给用户,告知物流信息获取暂时失败。

配置示例:在 Dubbo 配置文件中,在dubbo:reference标签下设置retries(重试次数)和timeout(超时时间,单位毫秒)属性。以调用物流服务为例:

xml
代码解读
复制代码
<dubbo:reference interface="com.example.LogisticsService" retries="3" timeout="5000" />
2.3.4 动态路由

功能描述:动态路由功能允许根据请求参数(如商品类别、用户等级)、消费者来源(如不同的业务线、地区)等多样化条件,灵活地将请求路由到特定的服务提供者实例。这使得服务调用能够更加贴合业务需求,实现精细化的服务管理,如根据不同的业务场景将请求导向不同配置或版本的服务实例,提升服务的针对性和适应性。

应用场景:在一个面向全国用户的电商平台中,根据用户所在地区进行动态路由。例如,对于位于华东地区的用户请求商品服务,将请求路由到部署在华东地区数据中心的商品服务实例,减少网络延迟,提高响应速度。或者根据用户等级,将高级会员的商品查询请求路由到性能更优、数据更新更及时的服务实例,为高级会员提供更好的服务体验。

配置示例:在 Dubbo 服务提供者的配置文件中,通过dubbo:service标签的router属性指定自定义的路由规则。假设定义了一个根据地区路由的regionRouter:

xml
代码解读
复制代码
<dubbo:service interface="com.example.ProductService" router="regionRouter" />

同时,需要在项目中实现具体的路由逻辑类,在该类中根据请求的地区信息等条件决定将请求路由到哪个服务实例。

通过合理运用 Dubbo 的这些服务治理功能,开发者能够构建出更加健壮、高效、灵活的分布式系统,满足复杂业务场景下对服务质量和稳定性的严格要求。

三、Spring Cloud 集成 Dubbo:实战指南

3.1 环境搭建与依赖引入

  1. 创建 Spring Cloud 项目:使用 Spring Initializr 创建一个 Spring Boot 项目,选择 Web、Dubbo、Nacos Discovery 等相关依赖。

  2. 引入 Dubbo 依赖:在pom.xml文件中添加 Dubbo 和 Nacos 相关依赖:

xml
代码解读
复制代码
<dependency> <groupId>com.alibaba.cloudgroupId> <artifactId>spring-cloud-starter-alibaba-dubboartifactId> dependency> <dependency> <groupId>com.alibaba.cloudgroupId> <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId> dependency>

3.2 服务提供者配置与发布

  1. 配置文件设置:在application.yml中配置 Dubbo 服务提供者相关参数,如应用名称、注册中心地址、协议端口等:
yml
代码解读
复制代码
spring: application: name: goods-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848 dubbo: application: name: goods-service registry: address: spring-cloud://localhost protocol: name: dubbo port: 20880 scan: base-packages: com.example.goods.service
  1. 服务实现类编写:创建服务接口和实现类,使用@DubboService注解将服务发布出去:
java
代码解读
复制代码
public interface GoodsService { Goods getGoodsById(Long id); } import org.apache.dubbo.config.annotation.DubboService; @DubboService(version = "1.0.0") public class GoodsServiceImpl implements GoodsService { @Override public Goods getGoodsById(Long id) { // 从数据库查询商品信息 return goodsRepository.findById(id).orElse(null); } }

3.3 服务消费者配置与调用

  1. 配置文件调整:在消费者项目的application.yml中配置 Dubbo 消费者相关参数,如应用名称、注册中心地址等:
yml
代码解读
复制代码
spring: application: name: order-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848 dubbo: application: name: order-service registry: address: spring-cloud://localhost
  1. 服务引用与调用:在消费者代码中使用@DubboReference注解引用服务,并进行调用:
java
代码解读
复制代码
import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class OrderController { @DubboReference(version = "1.0.0") private GoodsService goodsService; @GetMapping("/order/{goodsId}") public Order createOrder(@PathVariable Long goodsId) { Goods goods = goodsService.getGoodsById(goodsId); // 创建订单逻辑 return new Order(goods); } }

3.4 多协议支持与动态配置

  1. 多协议配置:在 Dubbo 中可配置多种通信协议,如同时使用 Dubbo 协议和 HTTP 协议:
yml
代码解读
复制代码
dubbo: protocol: dubbo: name: dubbo port: 20880 http: name: http port: 8080

然后在服务提供者中指定使用的协议:

java
代码解读
复制代码
@DubboService(version = "1.0.0", protocol = {"dubbo", "http"}) public class UserServiceimpl implements UserService { // 服务实现代码 }
  1. 动态配置实现:结合 Nacos 配置中心,可实现 Dubbo 服务的动态配置。在 Nacos 中创建配置文件,如dubbo.properties,配置服务的超时时间、重试次数等参数,在 Dubbo 项目中通过@RefreshScope注解实现配置动态刷新。例如:

在 Nacos 中配置dubbo.reference.com.example.UserService.timeout=3000,在 Spring Boot 项目中:

java
代码解读
复制代码
import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Configuration; @Configuration @RefreshScope public class DubboConfig { // 配置相关代码 }

四、性能优化与高级特性

4.1 性能优化实战策略

  1. 连接池优化:配置合理的连接池参数,如最大连接数、最小连接数、连接超时时间等,减少连接创建和销毁的开销。在application.yml中配置:
yml
代码解读
复制代码
dubbo: consumer: connections: 10 timeout: 2000
  1. 负载均衡优化:根据业务场景选择合适的负载均衡算法,如在商品服务中,对于热门商品可采用权重负载均衡,将更多流量分配到性能较好的节点:
xml
代码解读
复制代码
<dubbo:reference interface="com.example.HotGoodsService" loadbalance="weighted" />
  1. 缓存机制引入:在服务消费者和提供者中引入缓存,减少对数据库的访问。例如,在商品服务中缓存热门商品信息,当消费者请求时先从缓存读取:
java
代码解读
复制代码
import org.springframework.cache.annotation.Cacheable; @DubboService(version = "1.0.0") public class GoodsServiceImpl implements GoodsService { @Cacheable("hotGoods") @Override public Goods getHotGoodsById(Long id) { // 从数据库查询商品信息 return goodsRepository.findById(id).orElse(null); } }

4.2 高级特性探索

  1. 异步调用优化:在高并发场景下,使用异步调用可提升系统吞吐量。在消费者配置文件中开启异步调用:
java
代码解读
复制代码
interface="com.example.OrderService" async="true" />

在代码中通过 Future 获取异步调用结果:

java
代码解读
复制代码
@DubboReference(version = "1.0.0", async = true) private OrderService orderService; CompletableFuture future = CompletableFuture.supplyAsync(() -> orderService.createOrder(order)); // 处理其他业务逻辑 Order order = future.get();
  1. 集群容错模式扩展:Dubbo 提供了多种集群容错模式,如 Failover(失败自动切换)、Failfast(快速失败)、Failsafe(失败安全)等。可根据业务需求自定义集群容错策略,通过继承AbstractClusterInvoker类实现:
java
代码解读
复制代码
public class CustomClusterInvoker extends AbstractClusterInvoker { // 自定义容错逻辑 }

然后在配置文件中指定使用自定义的集群容错模式:

java
代码解读
复制代码
interface="com.example.CustomService" cluster="customCluster" />
  1. SPI 机制深入应用:Dubbo 通过 SPI(Service Provider Interface)机制实现了高度可扩展。可通过自定义 SPI 扩展 Dubbo 的功能,如实现自定义的负载均衡算法、路由规则等。创建自定义 SPI 实现类,在META-INF/dubbo目录下创建接口的配置文件,指定实现类全限定名,即可在 Dubbo 中使用自定义扩展。

五、高频面试题深度解析

5.1 基础概念题

问题 1:Dubbo 与 Spring Cloud Feign 的区别?

解析:Dubbo 是基于 RPC 的高性能框架,专注于服务调用,支持多种通信协议和序列化方式,服务治理功能强大;Feign 是基于 HTTP 的声明式调用客户端,集成在 Spring Cloud 体系中,与 Spring 生态融合度高,使用注解方式定义接口调用,更侧重于简化 HTTP 调用流程。

问题 2:Dubbo 的服务注册中心有哪些,各自特点是什么?

解析:常见注册中心有 Zookeeper、Nacos、Redis 等。Zookeeper 基于 Paxos 算法保证数据一致性,稳定性高;Nacos 支持服务注册与发现、配置管理,功能全面,与 Spring Cloud Alibaba 集成度高;Redis 性能高,但数据一致性相对较弱,适用于对一致性要求不高的场景。

5.2 原理深入题

问题 1:Dubbo 的 RPC 调用过程是怎样的?

解析:消费者通过代理对象发起调用,代理对象根据负载均衡算法选择服务提供者地址,将调用参数序列化,通过网络发送到提供者。提供者接收请求,反序列化参数,调用本地服务方法,将结果序列化后返回给消费者。期间涉及通信协议选择、序列化方式、连接管理等过程。

问题 2:Dubbo 如何实现服务降级?

解析:通过在消费者配置文件中设置mock属性实现。当服务不可用时,若mock设置为true,则调用本地的MockService实现类返回默认值;若设置为return null或具体的错误提示,直接返回相应结果,避免级联故障。

5.3 生产实践题

问题 1:在生产环境中如何优化 Dubbo 服务性能?

解决方案:优化连接池参数,合理选择负载均衡算法,引入缓存机制减少数据库访问,开启异步调用提升吞吐量,根据业务需求调整集群容错模式,以及通过 SPI 扩展实现自定义性能优化逻辑。

问题 2:如何排查 Dubbo 服务调用失败问题?

诊断步骤:首先检查注册中心是否正常运行,服务提供者是否成功注册;其次查看消费者配置是否正确,包括服务接口、版本、注册中心地址等;然后检查网络连接是否正常,是否存在端口被占用等情况;还可通过 Dubbo 监控中心查看服务调用统计信息,定位问题所在。

六、总结与扩展

6.1 核心价值

Dubbo 通过高性能的 RPC 调用、完善的服务治理功能以及与 Spring Cloud 的深度集成,为微服务架构提供了高效、可靠的服务通信解决方案,极大提升了分布式系统的性能和可维护性。

6.2 最佳实践总结

在这里插入图片描述

  • 分层架构设计:遵循清晰的分层架构,将业务逻辑、服务接口和数据访问层分离。例如,在电商系统中,商品服务的业务逻辑层负责处理商品的复杂业务规则,服务接口层对外暴露商品查询、库存管理等接口,数据访问层负责与数据库交互获取或存储商品数据。这样的分层设计提高了代码的可维护性和复用性,当业务规则或数据存储方式发生变化时,只需修改相应层的代码,不会影响其他层。

  • 负载均衡策略优化:根据业务场景灵活选择负载均衡算法。在商品服务中,对于热门商品,采用权重负载均衡算法,根据服务器的性能、资源使用情况等因素为每个服务实例分配权重,将更多流量分配到性能较好的节点,确保热门商品查询的高效性。而对于普通商品服务,可采用随机或轮询负载均衡,以实现流量的基本均衡分配。同时,定期监控服务实例的运行状态,动态调整权重,保证负载均衡的准确性和有效性。

  • 缓存机制合理运用:在服务消费者和提供者中合理引入缓存。在商品服务中,对于热门商品信息进行缓存,消费者请求热门商品时,优先从缓存中读取数据。可以使用本地缓存(如 Guava Cache)缓存访问频率极高且数据更新频率较低的商品信息,减少网络开销和对后端数据库的压力。对于一些数据一致性要求较高的商品信息,可结合分布式缓存(如 Redis),通过设置合理的缓存过期时间和缓存更新策略,确保数据的准确性和及时性。例如,当商品库存发生变化时,及时更新缓存中的商品库存信息。

  • 异步调用提升性能:在高并发场景下,充分利用 Dubbo 的异步调用功能提升系统吞吐量。在订单服务调用商品服务创建订单时,开启异步调用。消费者代码通过CompletableFuture获取异步调用结果,在等待结果的同时可以处理其他业务逻辑,避免线程阻塞。例如,在创建订单时,除了调用商品服务查询商品信息外,还可以同时进行用户积分计算、订单日志记录等操作,大大提高了系统的并发处理能力。

  • 集群容错模式适配:根据业务的重要性和对故障的容忍程度选择合适的集群容错模式。对于核心业务,如支付服务,采用 Failover(失败自动切换)模式,当调用失败时自动切换到其他可用的服务实例,确保支付业务的连续性。对于一些非关键业务,如用户反馈信息收集服务,可采用 Failsafe(失败安全)模式,当调用失败时直接忽略异常,记录错误日志,避免因小的调用失败影响整个系统的运行。同时,根据业务发展和系统运行情况,随时调整集群容错模式,以适应不断变化的业务需求。

  • 动态配置管理:借助 Nacos 配置中心实现 Dubbo 服务的动态配置。将服务的超时时间、重试次数、负载均衡策略等参数统一管理在 Nacos 中。通过@RefreshScope注解,使 Dubbo 服务能够实时感知配置的变化并进行动态更新。例如,在电商大促期间,可以动态调整商品服务的超时时间和重试次数,以应对高并发场景下可能出现的网络延迟和服务繁忙问题。同时,通过 Nacos 的配置版本管理和灰度发布功能,可以安全地进行配置变更,降低因配置错误导致系统故障的风险。

  • SPI 机制扩展应用:充分利用 Dubbo 的 SPI 机制进行功能扩展。例如,自定义负载均衡算法,根据业务特定需求,如根据用户地理位置、网络状况等因素选择服务提供者。通过在META - INF/dubbo目录下创建自定义 SPI 实现类的配置文件,将自定义负载均衡算法集成到 Dubbo 框架中。还可以通过 SPI 机制自定义路由规则,实现根据请求参数、用户角色等条件进行动态路由,进一步提升服务治理的灵活性和精细化程度。

  • 监控与运维保障:搭建完善的 Dubbo 监控中心,实时监控服务调用的统计信息,包括调用次数、响应时间、失败率等。通过监控数据,及时发现性能瓶颈和潜在问题。例如,当发现某个服务的响应时间突然变长或失败率升高时,能够快速定位到是服务提供者的问题还是网络问题,并采取相应的措施进行优化,如调整服务实例资源、优化代码逻辑或修复网络故障。同时,结合日志管理系统,记录详细的服务调用日志,便于故障排查和业务审计。在运维方面,制定定期的服务巡检计划,检查服务注册中心的运行状态、服务提供者和消费者的健康状况,确保整个 Dubbo 服务体系的稳定运行。

6.3 未来展望

  • 随着微服务架构的不断发展和应用场景的日益复杂,Dubbo 有望在以下几个方面持续演进。在云原生领域,进一步加强与 Kubernetes 等容器编排平台的集成,实现服务的自动化部署、扩缩容和生命周期管理,更好地适应云环境的动态变化。在性能优化方面,持续探索新的通信协议和算法,提升 RPC 调用的效率和吞吐量,降低延迟。在服务治理上,引入人工智能和机器学习技术,实现智能的负载均衡、故障预测和自动修复,进一步提升系统的稳定性和可靠性。同时,不断完善生态体系,加强与更多开源项目的合作,为开发者提供更丰富、更便捷的微服务开发和治理工具,助力企业构建更加高效、灵活的分布式系统。

  • 通过对 Dubbo 的深度剖析与实践,开发者能够充分利用其强大功能,打造高性能、高可靠的微服务架构,在激烈的技术竞争中占据优势地位。在实际应用中,需结合业务特点,灵活运用 Dubbo 的各项特性,不断优化系统性能和服务质量,为企业的数字化转型提供坚实的技术支撑。

注:本文转载自juejin.cn的AronTing的文章"https://juejin.cn/post/7493688269583073306"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

103
后端
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top