Dubbo分层架构深度解析

引言

Dubbo作为一款备受欢迎的高性能、轻量级的Java RPC框架,在现代分布式系统中扮演着至关重要的角色。随着互联网行业的快速发展,服务间的通信变得越来越频繁,这也使得对于高效、可靠的远程通信方案的需求变得愈发迫切。在这样的背景下,Dubbo以其优异的性能表现和丰富的特性成为了众多企业和开发者的首选。

在本文中,我们将聚焦于Dubbo的分层架构,深入解析其内部结构和工作原理。通过对Dubbo架构的剖析,读者将能够更清晰地理解Dubbo是如何实现高性能、可扩展的RPC通信的。本文旨在为读者提供一个全面、系统的Dubbo架构导览,帮助他们更好地应用Dubbo构建稳健、高效的分布式系统。

首先,我们将介绍Dubbo的背景和优势,让读者对Dubbo有一个初步的了解。然后,我们将逐层深入,从服务层到配置层,逐一解释Dubbo各个层次的设计原理和功能特点。最后,我们将对Dubbo分层架构进行总结,并展望其在实现高效、稳定的服务治理方面的价值。

通过本文的阅读,读者将能够对Dubbo的内部机制有一个全面而深入的认识,从而更加灵活地运用Dubbo解决实际的分布式系统通信问题。

Dubbo的基本概念

在深入探讨Dubbo的分层架构之前,让我们先来了解一些Dubbo的基本概念,这些概念是理解Dubbo框架的基础。

RPC(远程过程调用)

RPC是指远程过程调用,是一种计算机通信协议。在分布式系统中,RPC允许一个程序调用另一个程序中的函数或方法,而不需要程序员显式地处理远程通信。Dubbo就是基于RPC协议实现的,它让分布式系统中的各个服务之间能够方便地进行通信。

服务提供者(Provider)

服务提供者是指提供某种服务的应用程序,它将自己的服务注册到注册中心,等待消费者的调用。在Dubbo中,服务提供者将自己提供的服务以接口的形式暴露出来,并通过Dubbo框架来管理和暴露这些服务。

服务消费者(Consumer)

服务消费者是指需要调用某种服务的应用程序,它通过Dubbo框架从注册中心获取服务提供者的地址,并发起远程调用以访问服务。服务消费者在Dubbo中使用远程服务的方式就像调用本地方法一样简单。

注册中心

注册中心是Dubbo架构中的一个重要组件,用于管理服务提供者和服务消费者之间的关系。服务提供者会将自己的地址和提供的服务注册到注册中心,而服务消费者则可以从注册中心获取到服务提供者的地址信息,从而实现服务的调用和发现。

这些基本概念构成了Dubbo框架的核心,理解了这些概念后,我们可以更深入地探讨Dubbo的分层架构及其工作原理。

Dubbo分层架构概览

Dubbo框架采用了一种分层的架构设计,每个层次都有清晰的职责划分,从而使得整个框架具备高度的可扩展性和灵活性。下面我们来简要介绍Dubbo的分层架构,为读者呈现一个整体的框架图。

1. 服务层(Service Layer)

服务层是Dubbo架构的基础,它负责管理服务提供者和服务消费者之间的通信。在这一层中,Dubbo通过定义接口的方式将服务提供者的功能暴露给服务消费者,从而实现远程调用的透明化。

2. 集群层(Cluster Layer)

集群层主要负责处理集群中多个服务提供者的情况。Dubbo支持多种负载均衡策略,以及容错机制,通过这些机制可以有效地管理集群中的服务提供者,保证服务的高可用性和稳定性。

3. 注册中心层(Registry Layer)

注册中心层用于服务的注册和发现,它是Dubbo架构中的核心组件之一。在这一层中,服务提供者会将自己的地址和提供的服务注册到注册中心,而服务消费者则可以从注册中心获取到服务提供者的地址信息,从而实现服务的调用和发现。

4. 协议层(Protocol Layer)

协议层定义了Dubbo框架支持的各种通信协议,包括Dubbo协议、HTTP协议、RMI协议等。每种协议都有自己的特点和适用场景,开发者可以根据实际需求选择合适的协议来进行通信。

5. 传输层(Transport Layer)

传输层负责处理底层的网络通信,Dubbo框架采用了Netty作为默认的网络通信框架,它提供了高性能、异步的网络通信能力,能够满足Dubbo对于网络通信的高要求。

6. 数据序列化层(Serialization Layer)

数据序列化层负责将Java对象序列化为字节流进行网络传输,以及将接收到的字节流反序列化为Java对象。Dubbo支持多种序列化框架,包括Java原生的序列化、Hessian、JSON等,开发者可以根据实际需求选择合适的序列化方式。

7. 配置层(Config Layer)

配置层用于管理Dubbo框架的各种配置信息,包括服务的暴露、引用、负载均衡策略、容错机制等。Dubbo支持多种配置方式,包括XML配置、注解配置和API配置,开发者可以根据实际情况选择最合适的配置方式。

通过以上分层架构的设计,Dubbo框架能够很好地解耦各个功能模块,使得每个模块都能够独立演化,从而实现了高度的可扩展性和灵活性。在后续的章节中,我们将逐层深入,详细探讨Dubbo框架各个层次的设计原理和工作机制。

服务层(Service Layer)

服务层是Dubbo架构中的基础层,负责管理服务的提供和消费。在分布式系统中,服务的提供和消费是其核心功能之一,而Dubbo通过服务层来实现这一重要功能。

服务提供者(Provider)

服务提供者是指提供具体服务实现的应用程序,它将自己的服务通过Dubbo框架暴露给其他应用程序使用。在Dubbo中,服务提供者需要做以下工作:

  1. 实现服务接口:服务提供者需要编写具体的服务实现类,并实现服务接口中定义的方法。
  2. 暴露服务:服务提供者通过Dubbo框架将自己提供的服务暴露出去,让其他应用程序可以远程调用。
  3. 配置服务:服务提供者可以通过配置文件或注解等方式,配置服务的相关信息,如服务端口、超时时间等。

服务提供者通过以上步骤,将自己的服务注册到注册中心,并等待其他应用程序的调用请求。

服务消费者(Consumer)

服务消费者是指需要调用服务的应用程序,它通过Dubbo框架从注册中心获取服务提供者的地址,并发起远程调用以访问服务。在Dubbo中,服务消费者需要做以下工作:

  1. 引用服务:服务消费者通过Dubbo框架引用需要调用的远程服务,获取服务接口的代理对象。
  2. 调用服务:通过服务接口的代理对象,服务消费者可以像调用本地方法一样调用远程服务的方法。
  3. 配置服务:服务消费者也可以通过配置文件或注解等方式,配置引用的服务的相关信息,如服务的地址、超时时间等。

服务消费者通过以上步骤,从注册中心获取服务提供者的地址信息,并发起远程调用以访问服务,从而实现了分布式系统中的服务调用功能。

服务层是Dubbo架构中的核心层之一,它为分布式系统中的服务提供和消费提供了基础支持,是整个Dubbo框架的重要组成部分。

集群层(Cluster Layer)

集群层是Dubbo架构中的重要组成部分,负责处理集群中多个服务提供者的情况,以及保证服务的高可用性和稳定性。在分布式系统中,单个服务提供者的容量可能无法满足整个系统的需求,因此需要通过集群来提供更大的服务容量和更高的可靠性。

负载均衡

负载均衡是集群层的核心功能之一,它负责将请求合理地分发到集群中的各个服务提供者上,以实现负载均衡。Dubbo框架支持多种负载均衡策略,包括随机负载均衡、轮询负载均衡、最少活跃调用负载均衡等。不同的负载均衡策略适用于不同的场景,开发者可以根据实际情况选择合适的负载均衡策略。

容错机制

容错机制是集群层的另一个重要功能,它负责处理由于网络故障、服务提供者故障等原因导致的服务调用失败情况。Dubbo框架通过采用多种容错机制来保证服务的高可用性,包括失败自动切换、失败重试、失败安全等。这些容错机制能够有效地处理各种异常情况,保证了服务的稳定性和可靠性。

在集群层中,负载均衡和容错机制是密切相关的,它们共同工作以保证集群中的服务能够按照预期的方式运行。通过合理地配置负载均衡策略和容错机制,可以有效地提高服务的性能和可用性,从而为用户提供更好的服务体验。

集群层作为Dubbo架构中的重要组成部分,为分布式系统中的服务提供和消费提供了可靠的基础支持。在后续的章节中,我们将进一步探讨集群层的实现原理和工作机制,以及如何通过合理地配置集群层来提高服务的性能和可用性。

注册中心层(Registry Layer)

注册中心是Dubbo架构中的关键组件之一,负责服务的注册与发现。在分布式系统中,服务的提供者和消费者可能存在于不同的节点上,因此需要一个统一的地方来管理服务的注册和查找。注册中心正是为了解决这个问题而存在的。

服务注册与发现

服务注册:当服务提供者启动时,它会向注册中心注册自己提供的服务,并提供自己的网络地址和其他相关信息。注册中心会将这些信息保存起来,以便服务消费者查询。

服务发现:当服务消费者需要调用某个服务时,它会向注册中心查询该服务的地址信息。注册中心会返回一个或多个服务提供者的地址列表给消费者,消费者再根据负载均衡策略选择其中一个地址发起调用。

Dubbo框架支持多种注册中心的实现,包括Zookeeper、Redis、Multicast等。不同的注册中心有不同的特点和适用场景,开发者可以根据实际需求选择合适的注册中心来使用。

注册中心的作用类似于黄页服务,它记录了服务的提供者和消费者的地址信息,并提供了查询服务的功能。通过注册中心,服务提供者和消费者可以实现解耦,动态地发现和使用服务,从而实现了分布式系统中的服务治理。

协议层(Protocol Layer)

在Dubbo框架中,协议层负责定义服务调用的规则和格式,以及处理服务调用过程中的通信细节。它是服务提供者和服务消费者之间通信的桥梁,确保它们能够相互理解和协作。

协议支持

Dubbo框架支持多种协议,每种协议都有自己的特点和适用场景。

  1. Dubbo协议:Dubbo协议是Dubbo框架的默认协议,它基于TCP长连接,采用自定义的传输格式,具有较高的性能和稳定性。Dubbo协议支持异步调用、单向调用和双向调用等多种调用方式,适用于对性能和稳定性要求较高的场景。

  2. RMI协议:RMI(Remote Method Invocation)协议是一种基于Java的远程调用协议,它使用Java序列化技术传输对象,并通过Java远程方法调用机制实现服务调用。RMI协议使用Java标准的远程调用API,适用于Java环境下的服务调用。

  3. Hessian协议:Hessian协议是一种基于HTTP的远程调用协议,它使用Hessian序列化技术将对象序列化为字节流,并通过HTTP协议传输。Hessian协议简单易用,支持跨语言调用,适用于网络环境较差或需要与非Java平台进行通信的场景。

  4. HTTP协议:HTTP协议是一种基于HTTP的远程调用协议,它使用JSON或XML等通用的数据格式进行数据交换,并通过HTTP协议传输。HTTP协议具有良好的跨平台性和跨语言性,适用于Web服务调用和与其他系统进行集成的场景。

信息交换

在Dubbo框架中,服务提供者和服务消费者之间的信息交换是通过Dubbo协议定义的通信格式进行的。通常情况下,服务提供者会将服务接口的元数据信息注册到注册中心,服务消费者在调用服务时会从注册中心获取服务提供者的地址信息,并通过Dubbo协议发起调用。

在服务调用过程中,Dubbo框架会根据配置的负载均衡策略选择合适的服务提供者,并通过Dubbo协议发送请求。服务提供者接收到请求后,会根据协议定义的规则进行处理,并将调用结果返回给服务消费者。整个调用过程中,Dubbo协议保证了服务提供者和服务消费者之间的通信顺畅和可靠。

在不同的场景下,可以根据实际需求选择合适的协议来进行服务调用。Dubbo框架提供了灵活的配置选项,开发者可以根据具体的业务需求和性能要求来选择最适合的协议,以提供更高效、稳定的服务。

传输层(Transport Layer)

在Dubbo的分层架构中,传输层负责处理网络通信,确保服务提供者和服务消费者之间可以进行可靠的数据传输。

网络通信

Dubbo中主要使用的网络通信框架是Netty。Netty是一个基于Java NIO的网络通信框架,具有高性能、高可靠性和可扩展性的特点。

  1. 基于NIO的异步通信:Netty采用非阻塞IO模型,利用Java NIO提供的Selector机制实现了异步通信,可以处理大量的并发连接,提高了系统的吞吐量和响应速度。

  2. 事件驱动的架构:Netty采用了事件驱动的设计模式,所有的I/O操作都是异步的,并通过事件监听器进行处理。这种设计使得Netty具有良好的可扩展性,可以轻松地定制和扩展各种网络应用。

  3. 高性能的编解码器:Netty提供了一套高性能的编解码器,可以对数据进行快速而灵活的序列化和反序列化操作,支持各种常见的协议和数据格式,如HTTP、WebSocket、TCP等。

在Dubbo中的作用

传输层在Dubbo框架中扮演着至关重要的角色,它负责实现服务提供者和服务消费者之间的数据传输和通信协议。通过使用Netty等高性能的网络通信框架,Dubbo能够在分布式环境下实现高效、稳定的服务调用。

在Dubbo的传输层中,Netty负责处理各种网络通信细节,如连接管理、数据编解码、流量控制等,同时支持多种协议和传输方式,如TCP、UDP、HTTP等,为Dubbo提供了灵活和可靠的网络通信基础。

数据序列化层(Serialization Layer)

在Dubbo中,数据序列化层负责将Java对象转换为字节流或其他格式,以便在网络上传输。这一层的设计旨在提供灵活的序列化方式,使得Dubbo可以支持不同的数据传输协议和数据格式。

序列化框架

Dubbo支持多种序列化框架,包括但不限于:

  1. Java原生序列化:Java提供了默认的序列化机制,可以通过实现java.io.Serializable接口来实现对象的序列化和反序列化。这种方式简单易用,但性能较差,并且不够灵活,不适合在分布式系统中大规模使用。

  2. Hessian:Hessian是一种基于二进制的轻量级序列化框架,支持跨语言,性能较Java原生序列化有所提升,但仍然存在一些性能和兼容性方面的问题。

  3. JSON:JSON作为一种文本格式的数据交换标准,在Dubbo中也被广泛使用。JSON序列化简单高效,易于阅读和调试,并且与现代Web开发中的RESTful服务很好地契合。

  4. Protobuf:Protobuf是Google开发的一种高效的二进制序列化协议,具有良好的性能和跨语言特性。Dubbo通过集成Protobuf,可以实现更高效的数据序列化和传输。

优缺点

不同的序列化框架各有优缺点:

  • 性能:性能是选择序列化框架时需要考虑的关键因素之一。一些二进制格式的序列化框架如Protobuf通常比文本格式的序列化框架如JSON和XML具有更好的性能。

  • 可读性:对于调试和日志记录来说,序列化后的数据是否易于阅读也是一个重要的考虑因素。JSON等文本格式通常比二进制格式更容易阅读。

  • 兼容性:不同的序列化框架可能存在兼容性问题,特别是在跨语言的场景下。因此,选择一个支持良好且广泛使用的序列化框架是很重要的。

  • 体积:序列化后的数据大小也是一个需要考虑的因素。一些二进制格式的序列化框架通常可以生成更小的数据包,从而减少网络传输的开销。

在Dubbo中,可以根据具体的业务需求和性能要求选择合适的序列化框架,并通过配置来实现灵活的切换和定制。

配置层(Config Layer)

配置层在Dubbo架构中起着至关重要的作用,它负责管理Dubbo的各种配置信息,包括服务暴露、引用、集群、注册中心、协议、以及各种策略的配置等。

外部配置

  1. XML配置:Dubbo最早提供了XML配置方式,通过在XML配置文件中定义各种服务和引用的配置信息,包括接口、版本、超时时间、集群等。XML配置方式简单直观,易于理解和维护,适用于中小型项目。

    <dubbo:service interface="com.example.UserService" ref="userService" version="1.0.0"/>
    <dubbo:reference id="userService" interface="com.example.UserService" version="1.0.0"/>
    
  2. 注解配置:随着Spring注解的流行,Dubbo也提供了基于注解的配置方式,通过在服务实现类上添加@Service@Reference等注解,可以实现对服务的暴露和引用,使得配置更加简洁和灵活。

    @Service(interfaceClass = com.example.UserService.class, version = "1.0.0")
    public class UserServiceImpl implements UserService {
        // Service implementation
    }
    
    @Reference(interfaceClass = com.example.UserService.class, version = "1.0.0")
    private UserService userService;
    
  3. API配置:除了XML和注解配置外,Dubbo还提供了API方式进行配置,通过编程的方式动态配置服务的各种属性,使得配置更加灵活和可控。

    ServiceConfig<UserService> serviceConfig = new ServiceConfig<>();
    serviceConfig.setInterface(UserService.class);
    serviceConfig.setRef(userService);
    serviceConfig.setVersion("1.0.0");
    serviceConfig.export();
    
    ReferenceConfig<UserService> referenceConfig = new ReferenceConfig<>();
    referenceConfig.setInterface(UserService.class);
    referenceConfig.setVersion("1.0.0");
    UserService userService = referenceConfig.get();
    

服务治理

配置层不仅负责服务的静态配置,还涉及到服务治理的方方面面。服务治理是指对服务进行管理、监控、调度、路由等一系列操作的过程,其核心目标是确保服务的可用性、可靠性和性能。

  1. 路由规则配置:Dubbo允许通过配置路由规则来控制请求的流向,比如根据IP、版本等条件进行路由,以实现流量控制和灰度发布等功能。

  2. 动态配置中心:Dubbo提供了与ZooKeeper、Nacos等注册中心集成的方式,可以将配置信息存储在注册中心,实现动态配置的管理和发布,使得配置更加灵活和动态化。

  3. 负载均衡策略配置:在配置层可以指定服务的负载均衡策略,包括轮询、随机、一致性哈希等,以实现不同的负载均衡方式。

配置层的灵活性和丰富性为Dubbo提供了强大的可扩展性和适应性,使得开发者可以根据具体的需求和场景来定制和配置Dubbo的各项功能,从而实现更加灵活、高效和稳定的服务治理。

总结

Dubbo作为一款高性能、轻量级的Java RPC框架,其分层架构为构建分布式系统提供了坚实的基础和灵活的解决方案。通过对Dubbo分层架构的深度解析,我们可以更好地理解其设计原理和工作机制,从而更加高效地进行系统设计和开发。

在Dubbo的分层架构中,各个层次相互配合、相互独立,每一层都有其特定的功能和职责。服务层负责服务的提供和消费,集群层处理服务的负载均衡和容错机制,注册中心层负责服务的注册与发现,协议层定义了服务之间的通信协议,传输层处理网络通信,数据序列化层负责数据的序列化和反序列化,配置层管理Dubbo的各种配置信息和服务治理。

Dubbo分层架构的优势在于:

  1. 模块化设计:每个模块都有清晰的职责和接口定义,使得系统的各个部分可以相互独立开发、测试和部署。
  2. 可扩展性强:各个层次之间松耦合,可以根据需求灵活地进行扩展和定制,满足不同场景的需求。
  3. 高性能高可用:通过负载均衡、容错机制等技术手段,保证了服务的高性能和高可用性,提升了系统的稳定性和可靠性。
  4. 透明化开发:Dubbo屏蔽了底层的复杂性,提供了简洁易用的API和配置方式,使得开发者可以更专注于业务逻辑的实现。

总的来说,Dubbo分层架构的设计理念是为了帮助开发者构建高效、稳定的分布式系统,提供了丰富的功能和灵活的扩展性,是构建大规模分布式系统的理想选择。

通过深入理解Dubbo的分层架构,我们可以更好地应用Dubbo框架进行系统设计和开发,并结合实际场景进行合理的配置和调优,从而为用户提供更加稳定可靠的服务。

参考资料

  1. 官方文档:Dubbo官方网站提供了详尽的文档,包括用户手册、开发指南、架构设计等,对于深入理解Dubbo的使用和原理都有很大帮助。链接:https://dubbo.apache.org/zh/docs/v2.7/user/

  2. 《阿里巴巴Dubbo分布式服务框架:原理与实践》:这本书由Dubbo的核心开发团队编写,深入浅出地介绍了Dubbo的设计思想、架构原理和实际应用,对于想要深入了解Dubbo的读者来说是一本不可多得的好书。

  3. Dubbo源码:通过阅读Dubbo的源码,可以更加深入地理解其内部实现原理和设计思想,对于解决实际问题和定制化需求具有很大帮助。Dubbo的源码托管在GitHub上,地址为:https://github.com/apache/dubbo

  4. Dubbo博客和社区文章:在各类技术社区和博客平台,例如CSDN、知乎、简书等,都有很多关于Dubbo的技术文章和经验分享,可以从中学习到更多实践经验和技术解决方案。

  5. 《Spring实战(第四版)》:虽然不是专门针对Dubbo的书籍,但其中关于Spring Boot和Spring Cloud的内容,以及对微服务架构的介绍,对于理解Dubbo在实际项目中的应用也有一定的帮助。

综上所述,通过参考以上资料,读者可以全面深入地了解Dubbo的设计原理、工作机制以及在实际项目中的应用和优化方法,从而更好地应用Dubbo进行系统设计和开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设置 kafka offset 消费者位移

文章目录 1.重设kafka消费者位移2.示例2.1 通过 offset 位置2.2 通过时间2.3 设置到最早 1.重设kafka消费者位移 维度策略含义位移Earliest把位移调整到当前最早位移处位移Latest把位移调整到当前最新位移处位移Current把位移调整到当前最新提交位移处位移Specified-Offset把位…

爬虫学习(4)每日一笑

代码 import requests import re import osif __name__ "__main__":if not os.path.exists("./haha"):os.makedirs(./haha)url https://mlol.qt.qq.com/go/mlol_news/varcache_article?docid6321992422382570537&gameid3&zoneplat&webview…

算法分析 KMP算法中next值的计算、0/1背包问题

5.6.1 KMP算法中next值的计算 设模式的长度为m。用蛮力法求解 KMP算法中的 next值时&#xff0c;next[0]可直接给出&#xff0c;计算next[j](1<j<m-1)则需要在 T[0] …T[j-1]中分别取长度为j-1、..、2、1的真前缀和真后缀并比较是否相等&#xff0c;最坏情况下的时间代价…

数据库事务隔离级别及mysql实现方案

1、数据库的并发问题 以下几个概念是事务隔离级别要实际解决的问题&#xff0c;所以需要搞清楚都是什么意思。 脏读&#xff1a;读到了其他事务未提交的数据&#xff0c; 不可重复读&#xff1a;在一个事务内&#xff0c;多次读取的同一批数据出现不一致的情况。 幻读&…

CTK库编译-01

地址 官网地址&#xff1a;Commontk github地址&#xff1a;https://github.com/commontk/CTK 编译环境 Qt套件&#xff1a; IDE&#xff1a;VS2022 使用vs2022 文件->打开->cmake 修改根目录下的CMakeLists.txt 默认只编译core模块&#xff0c;所以需要把部分模块…

无偏扭曲区域采样在可微分渲染中的应用

图1. 可微渲染计算光传输方程的导数。为了处理可见性的存在&#xff0c;最近的基于物理的可微渲染器需要显式地找到边界点[Li等人2018; Zhang等人2020]&#xff0c;或者通过启发式方法近似边界贡献[Loubet等人2019]。我们从第一原理出发&#xff0c;开发了一个无偏估计器&#…

阿里巴巴alibaba国际站API接口:商品详情和关键词搜索商品列表

阿里巴巴国际站&#xff08;Alibaba.com&#xff09;提供了API接口供开发者使用&#xff0c;以实现与平台的数据交互。然而&#xff0c;由于API的详细内容和调用方式可能会随着时间和平台更新而发生变化&#xff0c;以下是一个概述和一般性的指导&#xff0c;关于如何使用阿里巴…

企业邮箱是什么?怎么注册一个企业邮箱?

企业邮箱是什么&#xff1f;有什么特征&#xff1f;企业邮箱的特征就是以企业域名为后缀。企业通过企业邮箱能够提升自身的品牌形象&#xff0c;还能够提高员工的工作效率。作为企业的管理者来说&#xff0c;应该如何注册一个企业邮箱呢&#xff1f;小编今天就为您介绍下企业邮…

期权怎么开户?

今天期权懂带你了解期权怎么开户&#xff1f;近年来&#xff0c;随着股市的持续低迷&#xff0c;市场交易痛点越发明显的氛围中&#xff0c;所以有人看到了双向交易的期权。 期权怎么开户&#xff1f; 1、首先是证券账户内的资金需要满足50万保留20个交易日&#xff1b; 2、其…

Transformer详解:从放弃到入门(二)

多头注意力 上篇文章中我们了解了词编码和位置编码&#xff0c;接下来我们介绍Transformer中的核心模块——多头注意力。 自注意力 首先回顾下注意力机制&#xff0c;注意力机制允许模型为序列中不同的元素分配不同的权重。而自注意力中的"自"表示输入序列中的输入相…

相机内存卡格式化怎么恢复?恢复数据的3个方法

相机内存卡格式化后&#xff0c;许多用户都曾面临过照片丢失的困境。这些照片可能具有极高的纪念价值&#xff0c;也可能包含着重要的信息。因此如何有效地恢复这些照片变得至关重要。本文将详细介绍三种实用的恢复方法&#xff0c;帮助您找回那些珍贵的影像。 下面分享几个实…

RS2103XH 功能和参数介绍及规格书

RS2103XH 是一款单刀双掷&#xff08;SPDT&#xff09;模拟开关芯片&#xff0c;主要用于各种模拟信号的切换和控制。下面是一些其主要的功能和参数介绍&#xff1a; 主要功能特点&#xff1a; 模拟信号切换&#xff1a;能够连接和断开模拟信号路径&#xff0c;提供灵活的信号路…

经典面试题之滑动窗口专题

class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 长度最小的子数组 // 大于等于 targetint min_len INT32_MAX;// 总和int sum 0;int start 0; // 起点for(int i 0; i< nums.size(); i) {sum nums[i];while(sum > targe…

京东淘宝1688商品采集商品数据抓取API

item_get-获得淘宝商品详情 item_search 关键字搜索商品 公共参数 请求地址: taobao/item_search 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&a…

安卓自动化脚本制作流程详解!

在移动应用日益普及的今天&#xff0c;安卓自动化脚本制作成为了开发者提高工作效率、减少重复劳动的重要手段&#xff0c;本文将详细介绍安卓自动化脚本的制作流程&#xff0c;并通过五段源代码的实例&#xff0c;帮助读者更好地理解和掌握这一过程。 一、安卓自动化脚本制作…

Vector Laboratories|用于生物偶联疗法BioDesign™ dPEG® Linker连接平台

术语dPEG代表“离散PEG&#xff08;discrete PEG&#xff09;”&#xff0c;这是一种均一的、单分子量&#xff08;MW&#xff09;、高纯度的新一代聚乙二醇聚合物。Vector Laboratorie采用其受专利保护的专有生产工艺&#xff0c;可生产提供适合于各种应用场景&#xff0c;具有…

卸载系统自带APP

Firefly RK3588 android 12自动多个系统软件&#xff0c;无法从UI界面进行手动删除。因此&#xff0c;考虑使用shell指令进行处理。 系统自动APP大多都安装在system/app目录下&#xff0c;且该目录多为只读。因此采用如下步骤&#xff0c; //Shell su adb shell su //重新挂载…

食品饮料-冲饮市场线上发展现状:香飘飘品牌监控数据分析

近期&#xff0c;老国货品牌香飘飘在国内备受关注&#xff0c;起因是某网友在日本华人超市内看到香飘飘Meco果汁茶产品包装统一增加了几组“海洋不是日本的下水道”、“请日本政客豪饮核污水”、“地球可以没有日本但不能没有海洋”等中日双语标语&#xff0c;正大光明讽刺日本…

Xinstall:专业的APP全渠道统计服务商,助力广告数据分析

在移动互联网时代&#xff0c;APP已成为企业营销的重要阵地。然而&#xff0c;随着竞争加剧&#xff0c;广告主们面临着如何精准衡量广告投放效果、优化投放策略等挑战。这时&#xff0c;专业的APP全渠道统计服务商——Xinstall便成为了广告主们的得力助手。 Xinstall作为国内…

2024最新行业领域名词解释大全

2024最新行业领域名词解释大全 &#x1f680; 大家好&#xff01;我是你们的老朋友猫头虎&#x1f42f;。今天要为大家带来2024年最新的行业领域名词解释大全&#xff01;在这个信息爆炸的时代&#xff0c;准确了解不同领域的行业动态、工作机会和职业前景至关重要。下面我会分…
最新文章