当前位置:   article > 正文

2023系统架构师分散知识点_系统架构师 2023 知识点

系统架构师 2023 知识点

雾计算

雾计算(Fog Computing)是一种分布式计算模型,旨在将计算和存储资源推向网络的边缘,以更好地支持边缘设备和应用程序。与传统的云计算模型相比,雾计算更加注重将计算能力移动到接近数据来源的地方,以降低延迟、提高带宽利用率,并提供更快速和实时的数据处理能力。

雾计算的核心概念是在边缘网络中部署雾节点(Fog Node),这些节点可以是路由器、网关、服务器或其他边缘设备。雾节点位于网络边缘,靠近终端设备和传感器,它们可以处理和存储数据,同时提供计算资源和服务。

通过使用雾计算,可以实现以下好处:

  1. 降低延迟:由于数据处理和计算发生在网络边缘,因此可以减少数据传输到云端的延迟。这对于实时应用程序和对延迟敏感的任务非常重要。

  2. 减轻网络负载:将部分计算任务和数据处理从云端转移到边缘节点,可以减少对核心网络的负载,提高带宽利用率。这对于大规模部署终端设备和传感器的场景非常有益。

  3. 数据隐私和安全:在雾节点上进行本地数据处理可以减少传输敏感数据到云端的风险,提高数据隐私和安全性。

  4. 离线工作能力:雾节点可以处理任务,即使在断开与云端连接的情况下,仍可以继续工作。这对于边缘网络中的应用程序是非常重要的,因为它们可以在网络不稳定或不可用的情况下保持可用性。

总之,雾计算通过将计算和存储推向网络边缘,为边缘设备和应用程序提供更快速、实时和高效的计算能力。这种分布式计算模型可以满足越来越多的边缘计算需求,并为各种行业带来许多潜在的应用和机会。
边缘计算是一种计算模型,旨在将计算和存储资源推向网络的边缘,以更好地支持边缘设备和应用程序。边缘计算强调将计算能力尽可能靠近数据源和终端设备,以减少延迟和提高数据处理效率。

雾计算则是边缘计算的一个子集或扩展。雾计算强调在边缘网络中部署雾节点(Fog Node),这些节点在网络边缘提供计算、存储和服务。边缘计算可以看作更广泛的概念,而雾计算则是在边缘计算模型中特定的实现方式。

边缘计算可以涵盖更广泛的边缘部署情况,包括终端设备、传感器和其他边缘节点。而雾计算更专注于在边缘网络中部署的特定节点,它们通常具有更高级别的计算和存储能力,并提供更复杂的服务。

综上所述,雾计算和边缘计算有一些重叠之处,但雾计算可以看作是边缘计算的一种实现方式,强调在边缘网络中部署雾节点来提供更高级别的计算和服务。

柔性制造

柔性制造(Flexible Manufacturing)是一种生产制造的概念,旨在实现生产过程的高度灵活性和适应性。它强调生产系统能够迅速适应不同产品类型、产品变化和生产需求的能力。

柔性制造的核心思想是通过使用先进的制造技术、智能化的设备和灵活的生产流程,实现生产过程的可变性和可调整性。这使得制造企业能够更好地应对市场需求的变化、客户个性化需求的增加以及产品生命周期的缩短。

以下是柔性制造的一些关键特点和优势:

  1. 产品多样性:柔性制造系统具有适应不同产品类型和变化的能力。它可以灵活地生产多种产品,无论是小批量生产还是定制化生产。

  2. 资源灵活性:柔性制造系统利用智能化设备和自动化技术,可以快速调整和重新配置生产线。这使得生产资源可以根据需求快速重新分配,以实现高效生产。

  3. 生产效率:柔性制造系统通常具有高度自动化的特点,减少了人为错误和生产停机的风险。它还可以利用数据分析和优化算法来提高生产效率、减少能源消耗和浪费。

  4. 供应链响应能力:柔性制造可以使企业在供应链中更灵活地应对需求变化。它可以减少库存和交付时间,提供快速响应客户需求的能力。

  5. 创新和研发:柔性制造提供了更大的创新空间和研发能力。由于生产过程的灵活性,企业可以更快地推出新产品、进行试制和测试,以满足市场需求和不断演变的技术要求。

总而言之,柔性制造是一种灵活、适应性强的生产制造模式,通过使用先进技术和灵活的生产流程,使制造企业能够更好地应对市场变化、满足客户需求,并具备更高的创新能力。

普适计算

普适计算(Ubiquitous Computing),也被称为泛在计算、无处不在的计算或环境计算,是一种计算机科学的概念和研究领域。它旨在将计算和通信技术无缝地融入到我们的日常生活和各种环境中,使计算能力无处不在、随时可用,并与我们的日常活动紧密相连。

普适计算强调计算机技术的透明性和隐形性,它的目标是使计算机和计算能力融入到我们的生活和环境中,成为生活的一部分,而不是单独的工具。这样,人们可以在各种环境中无缝地与计算机进行交互,而无需专门的设备或特定的操作。

以下是普适计算的一些关键概念和特点:

  1. 融入环境:普适计算强调将计算和通信技术无缝地融入到我们的日常生活和各种环境中,如家庭、办公室、公共场所等。计算能力应该在我们周围无处不在,并与我们的活动和环境紧密相连。

  2. 隐形计算:普适计算追求计算机的隐形性,即计算能力应该以一种无感知的方式存在。人们可以自然地与计算机进行交互,而不需要专门的设备或人工操作。

  3. 自动化与智能化:普适计算借助传感器、无线通信和智能算法等技术,实现自动化和智能化。计算系统能够自动感知环境、收集数据,并根据上下文和用户需求作出智能的响应。

  4. 多模态交互:普适计算鼓励多种交互方式,如语音、触摸、手势等,以适应不同环境和用户的需求。人们可以通过多种方式与计算机进行交互,以实现更自然和灵活的操作。

  5. 安全和隐私:普适计算对安全和隐私问题非常关注。随着计算能力的无处不在,个人数据和隐私的保护变得尤为重要。普适计算需要采取有效的安全机制和隐私保护措施来保障用户的权益。

普适计算的目标是实现一种无缝、自然和智能的计算环境,使计算能力融入到我们的日常生活中,并为我们提供更好、更智能的服务和体验。它在多个领域,如智能家居、智能交通、健康医疗等,都有着广阔的应用前景和深远的影响。

网格计算

网格计算(Grid Computing)是一种分布式计算模型,用于将分散的计算和存储资源连接起来形成一个虚拟的、可扩展的计算资源池,以实现大规模、高性能的计算。

在网格计算中,计算和存储资源通常分布在不同的地理位置、跨越不同的组织和域。这些资源可以是计算机集群、超级计算机、存储设备、数据库等。通过将这些资源连接起来,网格计算可以形成一个虚拟的超级计算机,使用户可以通过高速网络进行远程访问和利用。

网格计算的关键概念包括:

  1. 分布式资源:网格计算利用分布在不同地理位置和组织的计算和存储资源。这些资源可以是异构的,包括不同类型的计算机、存储设备和数据库等。

  2. 虚拟化和汇聚:网格计算将分布的资源虚拟化为一个统一的计算资源池。用户可以通过网格接口远程访问和利用这些资源,无需了解和关心底层的物理细节。

  3. 自治性和自管理:网格计算具有自治性和自管理的特点。它可以自动发现和管理可用的资源,根据用户需求进行任务调度和资源分配,以实现高效的计算和数据处理。

  4. 高性能和可扩展性:网格计算通过并行计算和分布式存储来实现高性能和可扩展性。用户可以利用多个资源并行执行计算任务,从而提高计算速度和处理能力。

网格计算的应用领域广泛,包括科学研究、工程仿真、大数据分析、天文学、生物信息学等。它可以帮助用户实现大规模数据处理、复杂模拟和计算密集型任务,并提供高性能、高可靠性的计算环境。

服务网格(ServiceMesh)

网格计算(Grid Computing)和服务网格(Service Grid)是两种相关但不完全相同的概念,它们在目标、重点和应用方面存在一些差异。

网格计算着重于将分散的计算和存储资源连接起来形成一个虚拟的、可扩展的计算资源池,以实现大规模、高性能的计算。它关注于资源的连接、管理和调度,目的是通过利用分布在不同地理位置和组织的计算资源,提供高性能的计算和数据处理能力。网格计算强调的是计算资源的集成和利用,以实现更高的计算效率和可扩展性。

服务网格则侧重于在分布式环境中提供服务的集成和协调。它将分布在不同地理位置和组织的服务资源连接起来,形成一个统一的服务平台。服务网格关注的是服务的发现、描述、调用和组合,目的是通过服务的集成和协作,提供更灵活、可靠的服务。服务网格强调的是服务的互操作性和可组合性,以实现更高的业务灵活性和应用集成能力。

虽然网格计算和服务网格有一些共同的特点和技术基础,例如分布式计算、资源管理和数据传输等,但它们的关注点和应用重点不同。网格计算主要关注计算和存储资源的集成和利用,适用于大规模科学计算和数据处理。服务网格主要关注服务的集成和协作,适用于企业应用集成、业务流程管理等领域。

需要注意的是,随着技术的发展和融合,网格计算和服务网格的界限变得模糊。现代的网格计算平台和服务网格平台往往结合了两者的特点,提供了更全面、灵活的分布式计算和服务支持。因此,具体的实现和应用可以根据需求和情境选择合适的技术和平台。

网构软件

网构软件(Grid Computing Software)是用于支持网格计算的软件工具和平台。网格计算是一种分布式计算模型,通过将计算和存储资源连接起来形成一个虚拟的、可扩展的计算资源池,以实现大规模、高性能的计算。

网构软件提供了一系列的功能和服务,用于管理和调度分布在不同地理位置、跨不同组织的计算资源。它们可以协调和管理分布式的计算任务,并提供资源发现、数据传输、安全认证、任务调度等功能,以实现高效的计算和数据处理。

以下是一些常见的网构软件:

  1. Globus Toolkit:Globus Toolkit是一个开源的网构软件工具包,提供了一系列的服务和协议,用于管理和调度分布式的计算和存储资源。它被广泛应用于科学研究、高性能计算和大规模数据处理领域。

  2. Condor:Condor是一个开源的网构软件平台,用于管理和调度计算任务。它利用空闲计算资源,如个人电脑和服务器,来执行计算任务。Condor支持作业队列管理、资源发现、任务调度、错误处理等功能。

  3. Sun Grid Engine:Sun Grid Engine是一个商业网构软件,用于管理和调度分布式计算和存储资源。它可以管理大规模的计算集群,并提供高可靠性、高性能的计算环境。

  4. IBM Platform Symphony:IBM Platform Symphony是一个商业网构软件平台,用于管理和调度分布式计算资源。它支持多种计算模式,如批处理、实时计算和流式计算,并提供高可用性、高性能的计算环境。

这些网构软件提供了丰富的功能和服务,使用户能够更好地管理和利用分布式的计算和存储资源。它们在科学研究、工程仿真、大数据分析等领域中发挥着重要的作用,帮助用户实现高效、可扩展的计算和数据处理。

非功能特性

非功能特性列表,包括弹性、韧性、安全、可观测性和灰度。下面逐一解释每个特性的含义:

  1. 弹性(Elasticity):弹性是指系统能够根据负载的变化自动扩展或缩减资源,以满足需求的能力。弹性系统可以根据需要动态调整其计算、存储和网络资源,以提供可靠的性能和可用性。

  2. 韧性(Resilience):韧性是指系统在面对异常情况、故障或攻击时能够保持可用性和稳定性的能力。韧性系统能够快速恢复并继续正常运行,而不会受到单点故障的影响。

  3. 安全(Security):安全是指系统保护数据、资源和用户隐私免受未经授权的访问、损坏或泄露的能力。安全性确保系统具备适当的身份验证、访问控制、加密和审计等机制,以防止潜在的威胁和漏洞。

  4. 可观测性(Observability):可观测性是指系统在运行时提供有关其内部状态、行为和性能的可见性和监测能力。通过日志记录、指标收集、错误追踪和实时监控等功能,可观测性能够帮助开发人员和运维人员诊断问题、监控系统的健康状况和性能。

  5. 灰度(灰度测试):灰度是指分阶段地将新功能或更新的软件部署给一部分用户或系统,以便在生产环境中进行测试和验证。灰度测试允许开发团队收集反馈、评估功能稳定性,并能够在需要时逐步扩大部署范围。

这些非功能特性在软件开发和系统设计中具有重要的作用,确保系统具备弹性、韧性、安全性、可观测性和有效的功能部署过程。通过考虑和实现这些特性,可以提高系统的可用性、可靠性、性能和用户满意度。

两阶段提交(2PC)

两阶段提交(Two-Phase Commit,2PC)是一种分布式系统中用于保证事务原子性的协议。在分布式事务中,涉及到多个参与者(也称为协调者和参与者)的操作,2PC协议用于确保所有参与者在一个事务中要么都提交,要么都回滚。

2PC协议的执行过程可分为两个阶段:

  1. 准备阶段(Prepare Phase):

    • 协调者向所有参与者发送一个准备请求,并要求参与者执行事务的准备操作。
    • 参与者执行准备操作,然后向协调者发送准备完成的消息。如果参与者成功准备,则回复准备完成;如果失败,则回复准备失败。
  2. 提交阶段(Commit Phase):

    • 协调者收到所有参与者的准备完成消息后,如果所有参与者都已准备完成,则向所有参与者发送提交请求。
    • 参与者在收到提交请求后,执行事务的最终操作,并向协调者发送提交完成的消息。如果参与者成功提交,则回复提交完成;如果失败,则回复提交失败。

根据参与者的回复情况,协调者会根据以下规则来决定事务的最终状态:

  • 如果所有参与者都回复准备完成和提交完成,则协调者发送一个全局提交的消息,事务最终提交。
  • 如果任何一个参与者回复准备失败或提交失败,则协调者发送一个全局回滚的消息,事务最终回滚。

2PC协议的优点在于保证了分布式事务的原子性,即要么所有参与者都提交,要么都回滚,从而维护数据的一致性。然而,2PC协议也存在一些缺点,如协调者的单点故障、阻塞问题和性能开销等。因此,在某些情况下,可以考虑使用其他分布式事务协议或采用更为灵活的一致性机制,以满足具体的业务需求。

三阶段提交(3PC)

三阶段提交(Three-Phase Commit,3PC)是在分布式系统中用于保证事务原子性的一种改进版本的协议。它是对两阶段提交(2PC)协议的改进,旨在解决2PC协议中存在的阻塞(在二阶段提交的执行过程中,所有参与该事务操作的逻辑都处于阻塞状态,也就是说,各个参与者在等待其他参与者响应的过程中,无法进行其他操作。这种同步阻塞极大的限制了分布式系统的性能。)问题。

3PC协议的执行过程可以分为三个阶段:

  1. 准备阶段(CanCommit Phase):

    • 协调者向所有参与者发送一个CanCommit请求,并要求参与者执行事务的准备操作。
    • 参与者执行准备操作,并根据自己的状态回复CanCommitYes表示准备就绪,或回复CanCommitNo表示无法准备。
  2. 预提交阶段(PreCommit Phase):

    • 如果协调者收到所有参与者的CanCommitYes回复,则向所有参与者发送PreCommit请求。
    • 参与者在收到PreCommit请求后,会执行事务的预提交操作,并回复PreCommitYes表示预提交成功,或回复PreCommitNo表示预提交失败。
  3. 最终提交阶段(DoCommit Phase):

    • 协调者收到所有参与者的PreCommitYes回复后,会向所有参与者发送DoCommit请求。
    • 参与者在收到DoCommit请求后,会执行事务的最终提交操作,并回复Acknowledge表示提交成功。

根据参与者的回复情况,协调者会根据以下规则来决定事务的最终状态:

  • 如果协调者在任一阶段收到CanCommitNo、PreCommitNo或超时等异常情况,则会发送Abort请求,所有参与者回滚事务。
  • 如果在DoCommit阶段,协调者收到任何一个参与者的Acknowledge失败回复,则会发送Abort请求,所有参与者回滚事务。
  • 只有当协调者在所有阶段都成功收到所有参与者的正常回复时,才会发送Commit请求,所有参与者提交事务。

相较于两阶段提交协议,三阶段提交协议在预提交阶段引入了一个额外的阶段,可以减少阻塞的风险。然而,三阶段提交协议仍然存在一些问题,比如可能导致阻塞和协调者单点故障等。因此,在实际应用中,需要权衡使用三阶段提交协议的优点和缺点,选择适合具体情况的一致性方案。

补偿事务

补偿事务(Compensating Transaction)是一种用于处理分布式系统中发生故障或错误的事务回滚操作的技术。当一个分布式事务中的某个参与者发生故障或执行失败时,补偿事务可以用来撤销或修复已经执行的操作,以确保数据的一致性和完整性。

补偿事务的核心思想是通过执行与正常事务相反的操作来回滚事务。例如,对于创建订单的事务,补偿事务可以是取消订单的操作;对于转账的事务,补偿事务可以是撤销转账操作。

补偿事务一般包含以下几个步骤:

  1. 检测到故障或错误:当一个参与者发生故障或执行失败时,系统需要能够检测到这个问题,并触发补偿事务的执行。

  2. 执行补偿操作:一旦检测到故障或错误,系统会调用相应的补偿事务,执行与已完成操作相反的操作。补偿事务应该能够将系统状态恢复到故障发生之前的一致状态。

  3. 完成补偿事务:一旦补偿事务成功执行,系统可以继续处理其他事务或采取其他适当的操作。如果补偿事务本身失败,系统可能需要采取其他措施来处理这个问题,例如通知管理员或记录错误日志。

补偿事务的优点在于可以处理分布式系统中的故障和错误,并通过回滚操作来保证数据的一致性。它提供了一种灵活的方式来处理异常情况,即使在长时间的事务中也能有效地维护数据的正确性。然而,补偿事务也可能引入一些复杂性,例如需要设计和实现补偿逻辑、处理并发冲突以及管理补偿事务的执行状态。

补偿事务通常用于处理那些无法使用传统的两阶段提交协议(2PC)来确保原子性的场景,比如跨多个服务的分布式事务。通过使用补偿事务,系统可以更好地应对故障和错误,并保持数据的一致性和完整性。

SLA

SLA(Service Level Agreement)是一种服务级别协议,用于定义服务提供商与客户之间的服务水平标准和约定。SLA协议详细描述了服务提供商应提供的服务级别、质量指标、性能要求、支持和故障恢复等内容,以确保双方对服务的期望达成一致。

SLA协议通常包含以下内容:

  1. 服务范围和描述:明确描述所提供的服务范围和服务的具体描述,包括功能、性能、可用性等方面的要求。

  2. 服务级别目标(SLG):定义服务提供商承诺达到的性能目标和质量指标,例如响应时间、服务可用性、故障恢复时间等。

  3. 度量和报告:确定用于度量和监测服务性能的指标和方法,并规定报告的频率和格式,以便客户能够了解服务的状态和满足程度。

  4. 支持和维护:确定服务提供商提供的支持渠道、响应时间、故障修复时间等,以确保服务的连续性和问题的及时解决。

  5. 故障处理和补偿:规定了服务中断或故障发生时的处理方式和补偿措施,包括故障恢复时间、服务中断时长等。

  6. 合同期限和终止条件:确定协议的有效期限、续签方式和终止条件,包括违约责任和解除协议的权利。

SLA协议的目的是确保服务提供商能够按照约定的标准为客户提供稳定、高质量的服务。它还为客户提供了监督和衡量服务质量的手段,帮助双方建立互信关系,并在服务质量不达标时提供适当的补偿或解决方案。

SLA协议对于确保服务质量和客户满意度非常重要,因此在签订协议之前,双方应仔细评估和协商各项指标和要求,确保协议真正能够满足业务需求和期望。

业务流填充

业务填充(Business Padding)是一种安全机制,用于在业务闲时发送无用的随机数据,以增加攻击者通过通信流量获得信息的困难。它的目的是制造假的通信、产生欺骗性数据单元或在数据单元中产生数据,以保护业务的保密性和防止对业务进行分析。这种机制可以用于提供对各个等级的保护,并增加密码通信的破译难度。

在业务填充机制中,发送的随机数据应具有良好的模拟性能,使其在通信中难以区分有用信息和无用信息。通过不断地在网络中发送伪随机序列,使非法者无法准确识别出真实的业务数据。

这种机制只在业务填充受到保密性服务时才有效,即在某些安全需求较高的场景下使用。通过引入无用的随机数据,业务填充可以增加对攻击者的迷惑和破解的难度,并提高业务流量的保密性。

需要注意的是,业务填充仅仅是一种安全机制,它不能单独保证系统的安全性。在设计和实施安全措施时,还需要综合使用其他安全机制,如加密、访问控制、身份验证等,以构建一个完善的安全解决方案。同时,对于特定的应用场景和安全需求,应根据实际情况进行定制化的安全设计并进行维护和监控,以确保系统的整体安全性。

数据脱敏

数据脱敏(Data Masking)是一种数据保护技术,用于在非生产环境中使用数据时,将敏感数据进行部分或完全的隐藏、替换、模糊或扰乱,以防止数据泄露和隐私侵犯。

数据脱敏技术的目的是保护敏感信息,同时保持数据的可用性和适用性。通过脱敏,可以在测试、开发、培训等非生产环境中使用真实数据,而无需担心数据泄露和违反隐私法规的风险。

常用的数据脱敏方法包括:

  1. 替换(Substitution):将原始敏感数据用伪造的数据进行替换,保留数据的基本格式和结构,但不再包含真实的敏感信息。例如,将真实姓名替换为随机生成的虚拟姓名。

  2. 模糊(Pseudonymization):对敏感数据进行模糊处理,使其难以直接关联到真实个体。例如,使用哈希函数或加密算法对身份证号码进行模糊处理,生成不可逆的代理标识。

  3. 脱敏(Masking):将敏感数据部分隐藏或删除,以保护个人隐私。例如,将电话号码的后四位用星号替换,或者将邮件地址的域名部分屏蔽掉。

  4. 扰乱(Shuffling):对敏感数据进行随机排序或重新排列,使其无法与原始数据建立关联。例如,打乱顾客的订单历史记录,使其无法再被还原出真实的顺序。

数据脱敏技术的选择取决于数据的敏感程度、使用场景和合规要求。在实施数据脱敏时,需要综合考虑数据的保护需求、数据分析的可用性以及对数据质量和性能的影响。

虽然数据脱敏可以帮助降低数据泄露风险,但并不能完全消除敏感数据被攻击者获取的可能性。因此,在保护敏感数据时,还需要结合其他数据安全措施,如访问控制、加密、审计等,以构建综合的数据保护策略。

AMQP协议

AMQP(Advanced Message Queuing Protocol)是一种网络协议,用于在应用程序之间进行可靠的消息传递。它是一个开放的标准协议,由AMQP工作组开发和维护。

AMQP协议的设计目标是提供一个统一的消息传递模型,使得不同的应用程序可以在不同的平台上进行互操作。它提供了一种可靠的、异步的、面向消息的通信方式,可以在分布式系统中进行消息的传递和处理。

AMQP协议的核心概念包括以下几个部分:

  1. 消息:AMQP协议中的基本单位,包含消息的内容和相关的元数据。

  2. 队列:用于存储消息的容器,消息发送者将消息发送到队列中,消息接收者从队列中接收消息。

  3. 交换机:用于将消息路由到队列的组件,根据一定的规则将消息发送到一个或多个队列中。

  4. 绑定:将交换机和队列进行绑定,定义了消息的路由规则。

  5. 连接:AMQP协议中的通信通道,用于建立和维护应用程序之间的连接。

AMQP协议支持多种消息传递模式,包括点对点模式、发布/订阅模式和请求/响应模式。它还提供了丰富的消息属性和消息头,可以满足不同应用场景的需求。

AMQP协议的优点包括可靠性、灵活性和互操作性。它可以在不同的消息中间件和编程语言之间进行互操作,使得开发人员可以选择最适合自己的消息中间件和编程语言来实现应用程序。

总结起来,AMQP协议是一种用于可靠消息传递的开放标准协议,提供了统一的消息传递模型和丰富的消息属性,支持多种消息传递模式和跨平台、跨语言的互操作性。

MQTT协议

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅协议,用于在低带宽和不稳定的网络环境中进行可靠的消息传输。它最初由IBM开发,现在是OASIS标准。

MQTT协议基于发布/订阅模式,其中有两个主要角色:发布者(Publisher)和订阅者(Subscriber)。发布者负责发布消息到特定的主题(Topic),而订阅者则订阅感兴趣的主题,以接收相应的消息。消息通过一个称为消息代理(Message Broker)的中间件进行传输,订阅者可以在任何时间点订阅主题,并接收到发布者发送的消息。

以下是一些MQTT协议的关键特性:

  1. 轻量级:MQTT协议设计简单,开销小,适用于受限的网络环境和资源受限的设备,如传感器和嵌入式系统。

  2. 发布/订阅模式:发布者发布消息到特定的主题,而订阅者订阅感兴趣的主题,消息代理负责将消息传递给相应的订阅者。

  3. QoS(Quality of Service)支持:MQTT提供三个级别的服务质量:0级(最多一次交付)、1级(至少一次交付)和2级(恰好一次交付),以满足不同应用场景下的可靠性需求。

  4. 保持连接:MQTT客户端与消息代理之间通过TCP/IP保持持久连接,这样可以减少网络开销和延迟,并支持即时通信。

  5. 低带宽和低功耗:MQTT协议的设计目标之一是在低带宽和低功耗的网络环境中有效运行,使其成为物联网(IoT)应用中的常用协议。

  6. 主题过滤器:订阅者可以使用通配符来订阅多个主题,例如使用“+”匹配单个层级,使用“#”匹配多个层级。

MQTT协议广泛应用于物联网、传感器网络、远程监控和通信等领域,它提供了一种可靠、高效的消息传输机制,适用于各种规模和复杂度的应用程序。

布隆过滤器

布隆过滤器(Bloom Filter)是一种快速、高效的概率数据结构,用于判断一个元素是否属于一个集合。它通常用于在大规模数据集中进行快速的成员查询,以减少昂贵的磁盘或网络访问操作。

布隆过滤器基于哈希函数和位数组bitmap实现,其原理如下:

  1. 初始化:布隆过滤器由一个位数组(通常是一个二进制数组)和多个哈希函数组成。位数组的长度为 m,初始时所有位都被置为 0。

  2. 添加元素:将要添加的元素通过多个哈希函数进行哈希计算,得到多个哈希值。然后将位数组中对应的位置置为 1。

  3. 查询元素:对于要查询的元素,同样通过多个哈希函数进行哈希计算,得到多个哈希值。然后检查位数组中对应的位置,如果所有位置都为 1,则说明该元素可能存在于集合中;如果有任何一个位置为 0,则说明该元素一定不存在于集合中。

布隆过滤器的核心思想是利用位数组的位来表示元素的存在与否,通过多个哈希函数的计算将元素映射到位数组中的多个位置。当查询元素时,如果所有位置都为 1,那么该元素可能存在;如果有任何一个位置为 0,那么该元素一定不存在。

需要注意的是,布隆过滤器存在一定的误判率(False Positive Rate),即有一定概率判断某个元素存在于集合中,但实际上并不存在。这是由于多个元素可能映射到相同的位数组位置,导致冲突。误判率可以通过调整位数组的长度和哈希函数的数量来进行控制。

布隆过滤器的优点是占用空间少、查询速度快,适用于对大规模数据集进行快速成员查询的场景。但它的缺点是不能删除元素,且误判率无法完全避免。因此,在使用布隆过滤器时需要根据具体场景和需求进行权衡和使用。

MDA 模型驱动架构

MDA(Model-Driven Architecture)是一种软件架构风格,它强调通过使用模型来驱动软件系统的开发和演化。MDA的核心思想是将系统的设计和实现从特定的平台和技术细节中解耦,以便更好地应对系统的变化和演化。

MDA的主要概念包括:

  1. 平台无关模型(PIM,Platform-Independent Model):PIM是对系统的抽象描述,独立于任何特定的实现平台。它关注系统的功能、结构和行为,以及与外部环境的交互。PIM通常使用标准化的建模语言(如UML)来表示。

  2. 平台相关模型(PSM,Platform-Specific Model):PSM是基于PIM的模型,针对特定的实现平台进行了细化和优化。它考虑了平台的技术细节、约束和限制,以便生成实际的系统代码。

  3. 模型转换(Model Transformation):模型转换是将PIM转换为PSM的过程。通过模型转换,可以将PIM中的抽象概念映射到具体的实现细节上,生成适用于特定平台的代码。

  4. 自动化生成(Code Generation):自动化生成是将PSM转换为实际的系统代码的过程。根据PSM中的模型和规则,自动生成符合特定平台要求的代码,减少手工编码的工作量和错误。

MDA的优势在于提高了软件系统的可维护性、可扩展性和可移植性。通过将系统的设计和实现与特定平台解耦,可以更容易地进行系统的演化和迁移。同时,使用模型驱动的方法可以提高开发效率,减少手工编码的工作量,降低错误率。

然而,MDA也面临一些挑战,例如模型的设计和转换过程需要一定的技术和工具支持,模型与代码的同步和一致性需要注意,以及对于某些特定的系统需求和平台限制可能不够灵活等。

总的来说,MDA是一种面向模型的软件开发方法,通过使用模型来驱动系统的开发和演化,以提高系统的可维护性和可移植性。它强调将系统的设计与实现与特定平台解耦,通过模型转换和自动化生成来减少手工编码,提高开发效率。

  1. CIM(Computational Independent Model,计算无关模型):CIM是对系统需求和业务逻辑的高层次描述,与具体的技术和平台无关。例如,假设我们正在开发一个在线购物系统。在CIM中,我们可以定义一些高层次的概念,如用户、产品、订单等,以及它们之间的关系和行为。这些概念不依赖于具体的技术实现,而是关注系统功能和需求。

  2. PIM(Platform Independent Model,平台无关模型):PIM是根据CIM创建的更加具体的模型,描述了系统的结构和行为,但仍然与特定的技术和平台无关。在我们的在线购物系统示例中,PIM可以是一个面向对象的模型,使用UML(Unified Modeling Language,统一建模语言)表示。它将CIM中的概念转化为类、接口、关联等构造,并定义它们之间的交互和行为。

  3. PSM(Platform Specific Model,平台相关模型):PSM是基于PIM进一步细化和特定于具体技术和平台的模型,用于生成最终的代码和配置。在我们的示例中,PSM可以是一个针对特定的Web开发框架(如Spring、Django等)的模型。它将PIM中的概念和结构映射到具体的框架元素,如控制器、模型、视图等,并定义它们之间的关系和配置。

反向代理

反向代理(Reverse Proxy)是一种网络服务,它代表服务器处理客户端请求。与传统的正向代理(Forward Proxy)不同,正向代理代表客户端发送请求到服务器,而反向代理代表服务器接收客户端请求并将其转发到适当的后端服务器。

反向代理的工作方式如下:

  1. 客户端发送请求到反向代理服务器。
  2. 反向代理服务器接收到请求后,根据预先配置的规则和负载均衡算法,将请求转发到一个或多个后端服务器。
  3. 后端服务器处理请求并将响应发送回反向代理服务器。
  4. 反向代理服务器将响应返回给客户端。

反向代理的主要作用是隐藏后端服务器的真实IP地址和细节,提供负载均衡和高可用性。它可以将客户端请求分发到多个后端服务器,从而提高系统的性能和可伸缩性。此外,反向代理还可以提供安全性功能,如SSL终端和Web应用程序防火墙(WAF),以保护后端服务器免受恶意请求和攻击。

总结来说,反向代理充当了客户端和后端服务器之间的中间层,接收和处理客户端请求,并将其转发给后端服务器。它是构建可靠、高性能和安全的网络服务架构的重要组成部分。

nginx--正向代理、反向代理及负载均衡(图解+配置) - 知乎

SQL注入攻击

SQL注入是一种常见的网络攻击手段,攻击者通过输入恶意的SQL查询语句,来影响应用程序对数据库的操作,以此来实现窃取数据、篡改数据、删除数据等恶意行为。

SQL注入的原理

SQL注入的原理主要基于应用程序对用户输入的不恰当处理。在一个典型的SQL注入攻击中,攻击者会在应用程序预期的输入中插入SQL代码片段。如果应用程序没有正确地处理这些输入(例如,没有进行适当的转义或过滤),那么这些恶意的SQL代码片段可能会被数据库服务器作为SQL查询的一部分来执行。

例如,考虑一个简单的登录功能,它可能会使用如下的SQL查询来验证用户的用户名和密码:

SELECT * FROM users WHERE username = '[username]' AND password = '[password]'
  • 1

在这里,[username][password]是应用程序从用户输入中获取的。如果一个攻击者输入的用户名是admin' --,那么SQL查询就变成了:

SELECT * FROM users WHERE username = 'admin' --' AND password = '[password]'
  • 1

在SQL中,--表示注释,所以AND password = '[password]'部分被注释掉了,这个查询实际上就变成了“选择用户名为admin的用户”,无需密码验证就可以登录。

预防SQL注入的常规技术

  1. 参数化查询:参数化查询是预防SQL注入的最有效方法之一。参数化查询可以确保用户输入被当作字面值来处理,而不是SQL查询的一部分。这意味着即使用户输入包含SQL代码片段,它们也不会被数据库服务器执行。

  2. 使用ORM工具:对象关系映射(ORM)工具可以自动地将对象数据映射到数据库,这样开发者就无需自己编写SQL查询。大多数ORM工具都内置了防止SQL注入的机制。

  3. 输入验证和过滤:虽然输入验证和过滤不能完全防止SQL注入,但它们可以作为一种辅助手段。应用程序应该验证所有用户输入的数据,确保它们符合预期的格式和类型。此外,应用程序也应该过滤或转义可能导致SQL注入的特殊字符(例如,单引号)。

  4. 最小权限原则:应用程序连接数据库的账户应该只有执行必要操作的最小权限,这样即使遭到SQL注入攻击,攻击者也不能执行诸如删除表、修改数据等的破坏性操作。

  5. 使用Web应用防火墙:Web应用防火墙(WAF)可以阻止包含恶意SQL代码片段的请求,从而防止SQL注入攻击。

  6. 定期的代码审查和更新:定期进行代码审查,尤其是对数据库操作的部分,可以帮助发现和修复可能导致SQL注入的代码。同时,也应该定期更新和打补丁,修复已知的安全漏洞。

总的来说,预防SQL注入需要采取多种策略,包括编写安全的代码、使用安全的开发工具和实践、以及实施适当的安全策略和控制。

湖仓一体

"湖仓一体"是一个比较新的概念,指的是数据湖(Data Lake)和数据仓库(Data Warehouse)的整合。这个概念的提出,主要是为了解决传统的数据湖和数据仓库各自的局限性,以及两者间的协同问题。

数据湖是一个存储系统,可以存储大量的原始数据,这些数据可以是结构化的,也可以是非结构化的。数据湖的主要优点是可以存储大量的数据,并且可以快速地进行数据的写入。但是,数据湖的缺点是数据的管理和查询效率可能不高,因为数据湖中的数据通常是原始的,没有经过优化。

数据仓库是一个用于分析和报告的系统,它存储的是经过清洗、转换和优化的数据。数据仓库的主要优点是查询效率高,易于进行数据分析。但是,数据仓库的缺点是数据的写入和更新可能比较慢,而且需要预先定义好数据的模式(Schema)。

湖仓一体的目标是结合数据湖和数据仓库的优点,解决各自的缺点。在湖仓一体的架构中,数据既可以像在数据湖中那样进行大规模的写入,也可以像在数据仓库中那样进行高效的查询和分析。此外,湖仓一体还可以实现数据的统一管理和治理。

湖仓一体的实现方式有很多种,例如,可以使用一些新的技术和工具,如Hadoop、Spark、Hive等,以及一些商业的解决方案,如AWS的Lake House、Google的BigQuery等。

总的来说,湖仓一体是一个旨在解决大数据处理中存储、查询、管理和分析的问题的新的架构模式。在实际的应用中,如何实现湖仓一体,需要根据具体的业务需求和技术条件来进行设计和选择。

DDD领域模型驱动

领域模型驱动领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,它强调在软件开发过程中,将业务领域的知识和概念作为核心,通过领域模型来驱动整个开发过程。

领域模型是DDD中的核心概念之一,它是对业务领域的抽象和建模,用于描述业务领域的实体、值对象、聚合根、领域服务等概念,并定义它们之间的关系和行为。领域模型是对业务领域的理解和表达,它不仅仅是一个类图或数据库模式,而是一个更加贴近业务的、具有丰富语义的模型。

在领域模型驱动的开发过程中,开发者与领域专家密切合作,通过深入理解业务领域的知识和需求,逐步构建出领域模型。领域模型不仅仅是静态的类图,还包含了业务规则、约束和行为,它是对业务领域的一种精确描述。

领域模型驱动的开发过程通常包括以下几个步骤:

  1. 领域建模:与领域专家一起,通过领域驱动设计的各种技术和工具,如领域事件风暴、战略设计会话等,深入理解业务领域,识别出业务领域的实体、值对象、聚合根和领域服务等概念,并定义它们之间的关系。

  2. 领域模型的实现:将领域模型转化为代码实现。可以使用面向对象编程语言,如Java、C#等,来实现领域模型中的各个概念和行为。在实现过程中,需要保持领域模型的一致性和完整性,确保模型与实际业务需求的匹配。

  3. 领域驱动的架构设计:基于领域模型,设计系统的整体架构。领域模型可以指导系统的分层架构、模块划分和业务流程的实现。

  4. 持续迭代和演化:领域模型是一个持续演化的过程,随着对业务领域的理解不断深入和需求的变化,领域模型也需要不断迭代和演化。开发团队需要与领域专家保持紧密的沟通,及时调整和优化领域模型。

通过领域模型驱动的开发方法,可以更好地理解和表达业务需求,提高开发团队的沟通效率,减少需求误解和开发风险,同时也能够构建出更加灵活、可扩展和可维护的软件系统。

TDD测试驱动开发

测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法论,它强调在编写代码之前先编写测试用例,并通过这些测试用例来驱动代码的开发。

TDD 的基本思想可以概括为以下三个步骤:

  1. 编写测试用例:在开始编写实际的代码之前,先编写测试用例来描述期望的功能和行为。测试用例通常包括输入数据、调用代码的方法或函数,以及期望的输出结果。这些测试用例可以是单元测试、集成测试或功能测试,根据具体情况而定。

  2. 运行测试用例:运行编写的测试用例,此时测试用例应该会失败,因为尚未编写与之对应的实际代码。这一步是为了验证测试用例是否能够正确地检测出代码中的问题。

  3. 编写实际代码:根据测试用例的要求,编写实际的代码来满足测试用例的期望。在编写代码的过程中,可以使用最简单的实现方式,以满足当前的测试用例。

  4. 重新运行测试用例:在编写完实际代码后,重新运行所有的测试用例。如果测试用例全部通过,说明代码实现正确;如果测试用例失败,说明代码实现存在问题,需要进行调试和修复。

TDD 的核心原则是“红-绿-重构”(Red-Green-Refactor):

  • 红(Red):编写测试用例并运行,测试用例应该会失败(红色),因为尚未编写实际代码。
  • 绿(Green):编写实际代码,使得测试用例能够通过(变为绿色)。
  • 重构(Refactor):对代码进行重构,改善代码的结构、可读性和性能,但不改变代码的行为。重构的目的是保持代码的质量和可维护性。

TDD 的好处包括:

  • 提高代码质量:通过先编写测试用例,可以更早地发现和解决代码中的问题,提高代码的质量和稳定性。
  • 明确需求和设计:编写测试用例要求开发者清晰地理解需求和设计,确保代码与需求一致。
  • 提高开发效率:TDD 可以减少代码的调试和修复时间,提高开发效率。
  • 支持重构:TDD 的重构阶段可以安全地改进代码结构,而不会破坏原有的功能和行为。

需要注意的是,TDD 并不适用于所有的开发场景,对于一些复杂的系统或者需要迭代开发的项目,TDD 的实践可能会有一定的挑战。在实际应用中,可以根据具体情况灵活选择是否采用 TDD 方法。

QoS服务质量

QoS 是 Quality of Service(服务质量)的缩写,是指在计算机网络中,为不同的网络流量提供不同的服务质量保证的一种技术。QoS 的目标是优化网络资源的利用,提高网络的可靠性、可用性、响应时间和带宽利用率,从而满足不同应用对网络服务质量的需求。

QoS 可以通过以下几种方式来实现:

  1. 带宽控制:通过限制某些流量的带宽使用,使得其他流量能够获得更多的带宽,从而提高网络的响应时间和带宽利用率。

  2. 优先级队列:将网络流量按照优先级划分为不同的队列,对每个队列分配不同的带宽和缓存空间,从而保证高优先级的流量能够得到更快的响应和更好的服务质量。

  3. 流量整形:通过对网络流量进行整形,使得网络流量的传输速率和传输延迟可以得到更好的控制和保证。

  4. 拥塞控制:通过检测网络拥塞状态,采取相应的控制策略,如减少数据传输速率、丢弃部分数据包等,从而避免网络拥塞,保证网络的稳定性和可靠性。

  5. 会话保持:通过保持网络会话的状态信息,使得网络流量可以在多个网络节点之间进行无缝切换,从而保证网络的连续性和可用性。

QoS 技术可以应用于各种网络环境,如局域网、广域网、互联网等,可以提供不同级别的服务质量保证,如低延迟、高带宽、高可靠性等,从而满足不同应用的需求。

2024.3.1 更新

数据脱敏

数据脱敏是指对敏感数据进行加密或者转换处理,以保护数据隐私和安全的一种技术手段。以下是一些常见的数据脱敏技术方案:

  1. 替换: 将原始数据替换为虚拟数据,例如用特定的字符、数字或者符号替代真实数据,保留数据的格式和结构,但隐藏真实内容。

  2. 加密: 使用加密算法对数据进行加密处理,确保只有授权用户能够解密获取原始数据。

  3. 掩码: 部分隐藏数据的一部分内容,例如只显示部分身份证号、信用卡号等,以减少敏感信息的泄露风险。

  4. 随机化: 对数据进行随机化处理,使得原始数据与脱敏后的数据之间没有明显的关联,保护数据的隐私性。

  5. 数据扰动: 对数据进行微小的扰动或者添加噪音,以保护数据的隐私同时尽量保持数据的分布特征。

  6. 数据切分: 将数据按照一定规则进行切分,分散存储在不同的位置,确保没有单个数据集包含完整的敏感信息。

  7. 数据删除: 删除或者屏蔽数据中的敏感信息,只保留非敏感信息。

  8. 数据加盐: 在加密过程中引入随机的盐值,增加破解的难度,提高数据的安全性。

  9. 数据混淆: 对数据进行混淆处理,打乱数据的顺序或者结构,使得原始数据难以被还原。

以上是一些常见的数据脱敏技术方案,具体选择何种方案应根据实际需求和数据特点来确定。在实际应用中,通常会结合多种技术手段来提高数据的安全性和隐私保护水平。

2024.3.18 更新

JWT

JWT全称是JSON Web Token,它是一种用于在网络上安全地传输信息的开放标准(RFC 7519)。JWT通常被用于身份验证和信息交换。

JWT由三部分组成,这三部分之间用.分隔:

  1. Header(头部):头部通常包含两部分:声明类型(通常是JWT)和签名算法(例如HS256或RS256)。头部被编码为Base64Url字符串。

  2. Payload(有效载荷):有效载荷包含所谓的"claims",即声明。声明是关于实体(通常是用户)以及其他数据的一些信息。有效载荷也被编码为Base64Url字符串。

  3. Signature(签名):签名是为了验证发送者的身份,并确保消息在传输过程中没有被篡改。签名是由header(编码后的)、payload(编码后的)以及一个密钥,使用header中指定的算法进行签名生成的。

组合起来,一个JWT可能看起来像这样:

xxxxx.yyyyy.zzzzz

其中xxxxx代表编码后的header,yyyyy代表编码后的payload,zzzzz代表签名。

需要注意的是,虽然JWT的内容可以被解码并读取,但除非使用了加密算法,否则这些内容不应包含敏感信息,因为它们可以被任何拥有JWT的人读取。

容器和镜像(Docker/Image)

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker的主要原理包括:

  1. 容器技术:Docker使用了Linux内核的特性如cgroups,namespaces等来隔离运行的进程,从而实现容器。容器之间共享同一个操作系统内核,但每个容器都在内核中运行在自己的独立空间,这使得容器比传统的虚拟机更加轻量和快速。

  2. 镜像技术:Docker使用镜像(image)来实现容器的可移植性。镜像包含了运行容器所需的所有内容,包括代码,运行时,库,环境变量和配置文件。Docker镜像是分层的,并且每一层都可以单独更新,这使得镜像的分发和版本控制更加高效。

  3. Docker Engine:Docker Engine是运行在主机上的程序,负责构建和运行Docker容器。它提供了一个命令行界面,允许用户与Docker交互。

以下是一些常用的Docker命令:

  • docker run:运行一个Docker容器。例如:docker run -it ubuntu bash,这将运行一个Ubuntu容器,并启动bash shell。

  • docker ps:列出当前运行的Docker容器。

  • docker images:列出本地的Docker镜像。

  • docker pull:从Docker Hub或其他Docker镜像库下载镜像。例如:docker pull ubuntu

  • docker build:根据Dockerfile构建Docker镜像。

  • docker push:将Docker镜像推送到Docker Hub或其他Docker镜像库。

  • docker rm:删除一个或多个Docker容器。

  • docker rmi:删除一个或多个Docker镜像。

  • docker stop:停止一个或多个正在运行的Docker容器。

  • docker start:启动一个或多个已经停止的Docker容器。

这只是Docker命令的一部分,Docker提供了非常丰富的命令行工具来管理和操作容器和镜像。

QPS/TPS/RT

高并发系统常用指标:
在这里插入图片描述

一、QPS,每秒查询

QPS:Queries Per Second是衡量信息检索系统(例如搜索引擎或数据库)在一秒钟内接收到的搜索流量的一种常见度量。该术语在任何请求-响应系统中都得到更广泛的使用,更正确地称为每秒请求数(RPS:Request Per Second)。

高性能、高并发、高可用(简称“三高”)要求的系统必须注意其QPS,才能知道何时扩容系统以处理更多请求。

二、TPS,每秒事务

TPS:是Transactions Per Second的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户端向服务器发送请求然后服务器做出响应的过程。客户端在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

QPS vs TPS:QPS基本类似于TPS,但是不同的是,对于一个页面的一次访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。如,访问一个页面会请求服务器2次,一次访问,产生一个“T”,产生2个“Q”。

三、RT,响应时间

RT(Response-time)响应时间:执行一个请求从开始到最后收到响应数据所花费的总体时间,即从客户端发起请求到收到服务器响应结果的时间。该请求可以是任何东西,从内存获取,磁盘IO,复杂的数据库查询或加载完整的网页。

暂时忽略传输时间,响应时间是处理时间和等待时间的总和。处理时间是完成请求要求的工作所需的时间,等待时间是请求在被处理之前必须在队列中等待的时间。

响应时间是一个系统最重要的指标之一,它的数值大小直接反应了系统的快慢。

四、Concurrency,并发数

并发数是指系统同时能处理的请求数量,这个也反应了系统的负载能力。

并发意味着可以同时进行多个处理。并发在现代编程中无处不在,网络中有多台计算机同时存在,一台计算机上同时运行着多个应用程序。

五、吞吐量

系统的吞吐量(承压能力)和处理对CPU的消耗、外部接口、IO等因素紧密关联。单个处理请求对CPU消耗越高,外部系统接口、IO速度越慢,系统吞吐能力越低,反之越高。

系统吞吐量有几个重要指标参数:QPS(TPS)、并发数、响应时间。

  1. QPS(TPS):(Queries Per Second)每秒钟请求/事务数量。
  2. 并发数: 系统同时处理的请求/事务数。
  3. 响应时间: 一般取平均响应时间。

理解了上面三个指标的意义之后,就能推算出它们之间的关系:

  • QPS(TPS)= 并发数/平均响应时间
  • 并发数 = QPS*平均响应时间

六、实际举例

我们通过一个实例来把上面几个概念串起来理解。按二八定律来看,如果每天 80% 的访问集中在 20% 的时间里,这 20% 的时间就叫做峰值时间。

  • 公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
  • 机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
  1. 每天300w PV 的在单台机器上,这台机器需要多少QPS?
    ( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
  2. 如果一台机器的QPS是58,需要几台机器来支持?
    139 / 58 = 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/344644
推荐阅读
相关标签
  

闽ICP备14008679号