【Dubbo3云原生微服务开发实战】「Dubbo前奏导学」 RPC服务的底层原理和实现

RPC服务

  • RPC服务介绍
  • RPC通信模式
  • RPC架构组成
  • RPC技术要点
    • RPC通信技术选项分析
    • RPC实战开发6大基础组件
      • 基础组件之Guava
      • 基础组件之Hutools
      • 基础组件之ReflectionASM
      • 基础组件之FastJSON/FastJSON2
      • 基础组件之FST
        • 相比FastJSON的优势
      • 基础组件之Commons-Codec
    • RPC框架层面选项分析
    • RPC组件化的扩展机制
    • RPC容器化部署发布机制
  • RPC设计模式
  • RPC难点分析
    • 如何保障对后面扩展功能的支持
      • 多数采用工厂模式
      • 面向接口的动态代理:
      • 拦截器和AOP的支持
      • SPI的可配置化替换实现
    • 数据模型的可塑性
      • 服务接口的数据隔离设计
      • 服务接口版本控制设计
      • 数据包传输的类型设计

Dubbo是一款高效而强大的RPC服务框架,它旨在解决微服务架构下的服务监控和通信问题。该框架提供了Java、Golang等多语言的SDK,使得使用者可以轻松构建和开发微服务。Dubbo具备远程地址发现和通信能力,可通过Dubbo独有的身临其境的服务治理特验为主导,以提高开发人员的功能性效率为目标,致力于为开发者提供最好的工具来优化开发流程。

RPC服务介绍

在当前互联网服务时代,服务拆分成为主流,服务之间的远程调用变得越来越复杂,使得像本地调用一样简单的远程调用成了一个大问题。在这个背景下,Dubbo是一个具有高度可扩展性的开源RPC框架。该框架提供了Java、Golang等多种语言的SDK和独特的服务治理体验,可以提高开发人员的效率。Dubbo还支持用户实现流量拦截、定制化逻辑、选址等各种定制逻辑。在微服务架构中,Dubbo具备极为重要的地位,被广泛应用于各大互联网公司的微服务场景中。总之,RPC作为一种进程间通信技术,在分布式系统中得到了广泛使用,并且作为解决微服务架构下服务治理问题的利器之一,Dubbo具有一定的优势。

RPC通信模式

当今大多数分布式系统都采用了远程过程调用(RPC)通信模式。RPC是一种通过网络调用远程服务的网络通信模式,在这种模式下,客户端和服务端之间的通信就好像是同一台机器上的程序之间进行的本地调用一样。RPC通常用于分布式应用程序的开发,它将应用程序的各个组成部分封装在独立的进程和服务中,并使用网络进行通信,旨在加速应用程序的开发和部署。
RPC通信模式通常涉及以下几个组成部分:
客户端:客户端是指发起RPC请求的应用程序或服务。在客户端发起RPC请求时,它将包含所有必要参数和方法名称的数据包发送到远程服务。
服务端:服务端是指接收RPC请求的应用程序或服务。服务端将使用接收到的数据包中的参数来执行服务并返回结果给客户端。
通信协议:通信协议是指在客户端和服务端之间传输数据所使用的协议。RPC通信模式可以使用多种协议,包括HTTP、TCP和UDP等。

序列化:序列化是指将对象转换为一组字节,以便可以在网络上传输。序列化也可以通过反序列化将对象还原到其原始状态。

RPC通信模式的优点包括:

  1. 简化了复杂的分布式应用程序的开发和部署。使用RPC通信模式,可以将各个组成部分分离为独立的进程和服务,并使用网络进行通信。这使得应用程序可以更加灵活地适应不同的场景和需求,同时简化了开发和部署过程。

  2. 提高了应用程序的性能和可扩展性。将应用程序分解为独立的组成部分并使用RPC通信模式进行通信,可以显著提高应用程序的性能和可扩展性,使其可以支持大量的同时访问和操作。

  3. 具有良好的可靠性和可用性。RPC通信模式通常使用多种协议,包括HTTP、TCP和UDP等,这些协议都具有良好的可靠性和可用性,并且可以实现远程监控和管理。

RPC架构组成

在这里插入图片描述

RPC技术要点

RPC通信技术选项分析

承接之前关于通信模式的内容,接下来要针对于通信模式进行分析网络通信的技术要点

RPC是一种通信协议,用于不同计算机上的进程之间进行通信。它允许一个计算机程序调用另一个计算机上的子程序,就像调用本地的子程序一样。

RPC通信的基本原理是,客户端程序通过发送请求给服务器端程序,请求执行特定的操作或获取特定的数据。服务器端程序接收请求并执行相应的操作,然后将结果返回给客户端。整个过程对于客户端来说是透明的,就像调用本地函数一样简单。

RPC通信技术的好处包括:

简化代码:通过RPC,远程调用可以被抽象为方法调用,使代码更清晰和简洁。
提高开发效率:RPC提供了一种方便的机制来调用远程服务,使分布式系统的开发更加高效。
增强系统扩展性:通过RPC,不同的组件和服务可以在不同的计算机上部署,可以方便地进行扩展和横向拓展。
促进系统集成:RPC可以作为不同系统之间进行通信的桥梁,促进系统之间的集成和协作。

RPC实战开发6大基础组件

“工欲成其事,必先利其器”,接下来,我们将会针对于RPC的实战开发基础组件进行分析和介绍,主要包括了对于所需要的基础工具和脚手架功能的插件等,有了它们我们可以打打提高我们的开发能力以及开发效率,具体6大基础如下图所示。
在这里插入图片描述

基础组件之Guava

Guava是由Google开发的Java工具库,它提供了丰富的实用工具类和方法,有助于开发人员编写高效、可靠的Java代码。Guava可以简化集合操作、处理字符串、并发编程和实现缓存机制等方面的工作。

使用Guava可以有效地减少开发工作量。它提供的集合类,如Immutable集合、Multiset和Multimap,可以用于RPC框架的注册中心的注册列表和元数据信息等方面。

Guava还提供了各种字符串处理工具类,包括切割、拼接、格式化和填充等功能,使得字符串操作更加便捷高效。在RPC服务框架中,可以方便地利用Guava的字符串处理能力来处理协议信息和解析传参格式。

此外,Guava还提供了强大而灵活的并发编程工具,如ListenableFuture、Futures和RateLimiter等。这些工具有助于更好地管理和控制并发任务,实现客户端调用和服务端执行时的多线程处理和异步操作能力。同时,Guava还提供了限流和服务保护等功能。

基础组件之Hutools

Hutools是一个强大而实用的Java开发工具包,可以帮助开发人员简化开发过程,提高开发效率。Hutools包含了各种功能模块,包括字符串处理、日期时间处理、文件操作、网络请求、加密解密、图片处理、Excel操作等等。

  • 网络请求:Hutools提供了丰富的网络请求工具方法,可以方便地发送HTTP请求、处理响应等。你可以使用Hutools发送RPC请求并接收响应,简化了网络请求的处理过程。

  • 序列化工具:RPC服务通常需要在网络中传输对象数据,而对象的序列化是一个常见的需求。Hutools提供了多种常用的序列化工具,如JSON、XML等,可以帮助你将对象转换成字符串或字节流,以便在网络中进行传输。

  • 编码解码工具:当进行网络传输时,数据的编码和解码是必不可少的。Hutools提供了多种常用的编码解码工具,如Base64、URL编码等,可以帮助你在RPC服务中进行数据的编码和解码处理。

  • 异常处理工具:RPC服务中可能会遇到各种异常情况,如网络异常、超时异常等。Hutools提供了一些异常处理工具,可以方便地捕获和处理异常,确保RPC服务的稳定性和可靠性。

基础组件之ReflectionASM

ReflectionASM是一个基于反射的优化库,它可以帮助开发人员在RPC服务开发中提高性能和效率。

使用ReflectionASM,你可以获得以下好处:

  • 提高反射操作的性能:反射是一种强大的机制,可以在运行时动态地获取和操作类的信息,但在性能方面存在一定的开销。ReflectionASM通过使用字节码生成技术,可以动态地生成目标类的字节码,避免了反射中的一些性能问题,提供了更快速的反射操作。

  • 减少调用开销:ReflectionASM可以生成直接调用目标方法的字节码,避免了通过反射机制间接调用的开销,从而提高了方法调用的性能。在RPC服务开发中,你可以利用ReflectionASM来优化服务接口的调用过程,提高服务的响应速度。

  • 简化代码:ReflectionASM可以帮助你生成具有相同接口的子类,这样你就能够通过正常的方法调用来操作目标类,而不需要显式地使用反射。这样可以使代码更加清晰和易于理解,并且减少了错误的可能性。

使用ReflectionASM可以在RPC服务开发中提高反射操作的性能、减少调用开销以及简化代码的编写。它是一个有效的工具,可以帮助你更高效地开发和运行RPC服务。

基础组件之FastJSON/FastJSON2

  • 序列化和反序列化:FastJSON/FastJSON2提供了强大的序列化和反序列化功能,可以将对象快速转换为JSON字符串,并将JSON字符串反序列化为对象。这在开发RPC框架服务中非常实用,可以将对象转换为字节流进行网络传输,并在远程服务端将字节流反序列化为对象进行处理。

  • 数据传输:FastJSON/FastJSON2可以将对象序列化为易于传输和解析的JSON字符串。在RPC框架中,可以使用FastJSON/FastJSON2将请求参数、响应结果等数据转换为JSON字符串,并通过网络进行传输。这种方式能够简化数据传输过程,并提高可读性。

  • 跨语言支持:FastJSON/FastJSON2是一种跨语言的JSON序列化和反序列化库,可以在不同编程语言之间进行数据交换。如果你的RPC框架需要与其他编程语言的服务进行交互,使用FastJSON/FastJSON2可以方便地进行JSON数据的序列astJSON2是一个高性能的JSON处理库,具有出色的序列化效率和低资源消耗。在RPC框架中,性能是非常重要的因素。使用FastJSON/FastJSON2可以提高数据的传输效率,减少网络延迟,从而提升RPC框架的整体性能。

总的来说,使用FastJSON/FastJSON2工具组件可以帮助简化开发RPC框架服务的过程,并提供高效的序列化和反序列化功能、跨语言支持以及高性能处理能力。这些功能有助于提升RPC框架的效率和可扩展性,提供更好的用户体验。

基础组件之FST

相比于FastJSON,FST 在某些方面具有更高的性能,FST 是一个专为高性能而设计的序列化库,它相对于 FastJSON 具有更快的序列化和反序列化速度。这主要是因为 FST 序列化库采用了一些优化策略,包括使用二进制格式、压缩编码和缓存等,从而提供更高效的数据处理性能。

相比FastJSON的优势
  • 更小的序列化结果: FST 序列化库生成的序列化结果通常更小,占用更少的存储空间。这可以减少网络传输的数据量,降低带宽占用。相比之下,FastJSON 生成的 JSON 字符串通常比二进制数据要大。

  • 更好的兼容性: FST 序列化库支持与不同编程语言和框架之间的交互。它的序列化和反序列化规则在不同环境下都是一致的,因此可以很方便地与其他系统进行数据交换,而不需要进行复杂的转换或兼容性处理。

  • 更低的资源消耗: FST 序列化库占用的系统资源较少,包括较低的 CPU 使用率和内存占用。这有助于提高系统的整体性能和资源利用率。

  1. 高性能:FST(Fast-Serialization)是一个高性能的二进制序列化库,相比于其他序列化方式,它能够更快地将对象序列化为字节流,并能够在远程服务端更快地反序列化字节流为对象。这在RPC服务中是非常有价值的,因为高性能的序列化和反序列化可以帮助提升整个RPC服务的性能和响应速度。

  2. 节省带宽:FST序列化库采用了紧凑的二进制格式,可以将对象序列化为较小的字节流。相比于使用文本格式的序列化方式(如JSON或XML),FST序列化可以有效地减少通过网络传输的数据量,从而节省带宽和降低网络延迟。

  3. 兼容性:FST序列化库具有良好的兼容性,能够与不同编程语言和框架进行交互。这意味着,如果你的RPC服务需要与其他编程语言的服务进行通信,使用FST序列化可以方便地进行数据交换,而无需过多的数据格式转换和兼容性处理。

  4. 简化开发:使用FST序列化库可以简化RPC服务的开发过程。它提供了简单易用的API接口,使得对象的序列化和反序列化变得简洁明了。同时,FST序列化还支持自定义序列化和反序列化的规则,使得开发者可以根据具体业务需求进行定制,进一步简化开发工作。

总而言之,RPC服务中使用FST序列化可以带来高性能、节省带宽、兼容性和简化开发等多重作用。这使得RPC服务更加高效、灵活和易于开发,从而提供更好的用户体验。

基础组件之Commons-Codec

最后一个基础组件是Commons Codec,它是一个开源的 Java 库,提供了各种常见编码和解码的功能。作为一个 RPC 框架的开发者,你可以利用 Commons Codec 来实现以下几个方面的功能:

  • 字符串编码和解码:在 RPC 框架中,你可能需要对字符串数据进行编码和解码,以确保数据传输的安全性和可靠性。Commons Codec 提供了许多常见的编码算法,如 Base64、URL 编码、HTML 编码等,可以方便地对字符串进行编码和解码操作。

  • 摘要算法:在 RPC 框架中,为了验证数据的完整性和一致性,常常需要使用哈希算法生成数据的摘要。Commons Codec 提供了一系列的消息摘要算法,如 MD5、SHA-1、SHA-256 等,可以方便地计算数据的摘要值。

  • 加密和解密:为了保护敏感数据在网络传输过程中的安全性,RPC 框架通常需要使用加密算法对数据进行加密和解密。Commons Codec 提供了一些常见的加密算法,如 AES、DES、RSA 等,可以方便地实现数据的加密和解密功能。

  • 编码规范:在 RPC 框架的开发过程中,为了保持代码的高质量和可读性,使用一些编码规范是很有帮助的。Commons Codec 提供了一些编码规范和实用工具,可以帮助你编写更加规范和易于维护的代码。

开发一个 RPC框架,Commons Codec 可以提供编码、摘要、加密等功能的支持,帮助你更轻松地实现数据处理和安全性保护的需求。

RPC框架层面选项分析

上一节已经介绍了开发一个RPC框架所需要的基础工具组件。接下来,我们将进行技术设计分析,着重考虑RPC框架能够支持的技术框架生态,尤其是在Java领域,基本的开发模式如下图所示。

在这里插入图片描述
首先,Java领域的主流框架生态之一是Spring框架。考虑到广泛的应用和丰富的功能,RPC框架应该支持与Spring框架的集成,以便于与现有的Spring项目进行无缝对接和使用。

除了Spring框架,还有一些服务可能并未使用Spring框架。对于此类服务,我们需要提供兼容处理,建立Frameworkless模式的原生Java开发模式。这样,即使没有依赖于特定框架的服务也能够无缝接入RPC框架。

另外,还有其他一些第三方框架,如JFinal等,也有可能被广泛使用。作为一个全面的RPC框架,我们应该考虑与这些第三方框架的集成,为开发者提供更多选择和便利。

注意:对于Java领域的RPC框架,我们应该首先支持与Spring框架的集成,其次提供Frameworkless模式的原生Java开发支持,最后考虑与其他第三方框架的集成,如JFinal等。这样可以确保RPC框架能够在不同的技术框架生态中灵活应用和扩展。

RPC组件化的扩展机制

RPC组件化的扩展机制主要面向于两个方面,分别是采用JVMTI技术进行实现热刷新机制。

RPC(远程过程调用)组件化的扩展机制是指通过使用Java的Agent探针技术来实现对RPC服务的动态化处理和扩展能力。这种机制可以在运行时对RPC组件进行增强、修改或替换,以满足不同的业务需求。

Java的Agent机制允许在Java应用程序运行时通过动态生成字节码来修改或增强已加载的类,同时也可以控制类的加载和转换过程。对于RPC组件,Agent探针技术可以在服务启动时动态地对相关类进行处理,以实现扩展功能。具体来说,Agent可以在加载RPC组件的类时,使用字节码操作来修改其中的方法实现、增加拦截器、添加性能监控等。这样一来,就能够方便地定制和扩展RPC组件的功能,而无需修改原始的源代码。

通过采用Agent的探针技术进行动态化处理织入扩展能力可以带来许多好处。首先,它具有灵活性和可扩展性,使得开发人员能够根据实际需求动态地对RPC组件进行增强和修改,而不必依赖于静态的源代码。其次,它使得扩展功能可以独立于应用程序的开发周期和发布过程,因此可以实现运行时的动态更新和部署。最后,Agent机制也提供了一种非侵入式的扩展方式,既不影响原有的业务逻辑,又能够灵活地添加额外的功能。

总结而言,RPC组件化的扩展机制通过使用Java的Agent探针技术,为RPC服务提供了动态化处理织入扩展能力,使得开发人员可以在运行时对RPC组件进行定制和扩展。这种机制能够提高开发效率、灵活应对需求变化,同时也方便了系统的维护和更新。

RPC容器化部署发布机制

RPC设计模式

RPC(Remote Procedure Call)是一种用于实现远程过程调用的技术,它允许不同的计算机之间通过网络进行函数调用和数据交互。在设计RPC服务时,可以使用以下几种设计模式来提高系统的可扩展性、可靠性和可维护性:

  • 代理模式(Proxy Pattern):在RPC中,客户端需要调用远程服务,而不需要关心实际的实现细节。使用代理模式可以隐藏底层通信细节,提供一个简单的API供客户端调用。

  • 工厂模式(Factory Pattern):在RPC中,可能存在多种类型的服务需要被调用。使用工厂模式可以根据不同的服务类型来创建具体的服务实例,提供灵活的服务创建和管理机制。

  • 观察者模式(Observer Pattern):在RPC中,服务的状态可能会发生变化,例如服务的可用性、延迟等。使用观察者模式可以让客户端或其他组件订阅服务状态的变化,并及时处理相应的变动,提高系统的可靠性。

  • 重试模式(Retry Pattern):在RPC中,由于网络不可靠性或服务不可用等原因,调用可能会失败。使用重试模式可以在调用失败时进行重试,提高调用的成功率和可靠性。

  • 断路器模式(Circuit Breaker Pattern):在RPC中,服务的不可用性或延迟可能会导致系统性能下降甚至崩溃。使用断路器模式可以在服务不可用时进行熔断处理,防止系统负载过大,提高系统的可用性和稳定性。

  • 限流模式(Rate Limiting Pattern):在RPC中,服务可能会被频繁调用,导致系统资源消耗过多或负载过高。使用限流模式可以限制调用频率,保护系统免受过多请求的影响,提高系统的性能和稳定性。

RPC难点分析

在这里插入图片描述

如何保障对后面扩展功能的支持

多数采用工厂模式

工厂模式是一种创建对象的设计模式,它通过一个工厂类来创建对象,隐藏了实例化对象的细节。在实际开发中,工厂模式大量应用于对象的创建和管理。通过使用工厂模式,可以将对象的创建集中管理,提高代码的封装性和可维护性。

面向接口的动态代理:

面向接口的动态代理是一种通过代理类来处理方法调用的机制,它可以在运行时创建动态代理对象,并在代理对象的方法中添加额外的逻辑,如方法调用前后的处理。面向接口的动态代理可以用于实现横切关注点的模块化和复用,例如日志记录、性能监控等。

拦截器和AOP的支持

拦截器和面向切面编程(AOP)是一种编程范式,用于实现在应用程序中多个模块之间的解耦和横切功能。拦截器机制允许在方法调用前后执行额外的逻辑,如日志记录、权限检查等。AOP通过将横切关注点(如事务管理、异常处理)从业务逻辑中分离出来,使代码更加模块化、可维护和可测试。

SPI的可配置化替换实现

SPI(Service Provider Interface)是一种可插拔机制,它允许开发人员定义一组接口和服务提供者实现,然后通过配置文件等方式将特定的实现进行替换。SPI机制允许应用程序在不修改源代码的情况下切换不同的实现,提供了可插拔性和可扩展性。

数据模型的可塑性

服务接口的数据隔离设计

数据隔离是一种在服务接口中保护数据安全性和隐私的设计方法。它通过限制对数据的访问和操作,确保数据仅对授权的用户可见和可操作。在设计服务接口的数据隔离时,可以采用以下方法:

  1. 身份验证和授权:确保只有经过身份验证和授权的用户可以访问特定的数据。可以使用令牌、角色或权限控制来实现身份验证和授权机制。

  2. 数据过滤:根据用户的权限和访问级别,对数据进行过滤和筛选,确保用户只能看到他们有权限访问的数据。

  3. 数据掩码和加密:对敏感数据进行掩码或加密处理,确保数据保持匿名化和加密状态,以控制对数据的访问。

  4. 数据分区:根据业务需求,将数据进行逻辑上的分区,确保不同用户只能访问和操作属于他们的数据。

服务接口版本控制设计

服务接口版本控制是一种管理和演化服务接口的方法,旨在确保在接口变更时能够向后兼容并支持不同版本的客户端。在设计服务接口的版本控制时,可以采用以下方法:

  1. URI版本控制:通过在URI路径中添加版本号来区分不同的接口版本。例如,/v1/api/或/api/v1/。

  2. 请求头版本控制:客户端可以通过请求头传递版本号信息,服务器根据版本号选择相应的处理逻辑。

  3. Query参数版本控制:通过在查询参数中添加版本号来区分不同的接口版本。例如,/api?version=1。

  4. 媒体类型版本控制:客户端可以通过Accept头字段指定所需的媒体类型和版本号。

数据包传输的类型设计

在设计数据包传输的类型时,可以考虑以下设计选项:

  1. 同步传输:数据包同步传输是一种阻塞式的传输方式,发送方等待接收方确认后再传输下一个数据包。

  2. 异步传输:数据包异步传输是一种非阻塞式的传输方式,发送方无需等待接收方的确认即可继续传输下一个数据包。

  3. 批量传输:将多个数据包打包成一个批次进行传输,可以提高传输效率。

  4. 压缩传输:对数据包进行压缩处理,减小数据包的大小,从而提高传输速度和带宽利用率。

  5. 加密传输:对数据包进行加密处理,确保数据包在传输过程中的安全性。

在选择数据包传输的类型时,需要根据应用的需求、网络环境和性能要求综合考虑,并选择最适合的传输方式。

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

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

相关文章

Cocos Creator:创建棋盘

Cocos Creator:创建棋盘 创建地图三部曲:1. 创建layout组件2. 创建预制体Prefab,做好精灵贴图:3. 创建脚本LayoutSprite.ts收尾工作: 创建地图三部曲: 1. 创建layout组件 使用layout进行布局,…

sensitive word 敏感词(脏词) 如何忽略无意义的字符?达到更好的过滤效果?

忽略字符 说明 我们的敏感词一般都是比较连续的,比如 傻帽 那就有大聪明发现,可以在中间加一些字符,比如【傻!#$帽】跳过检测,但是骂人等攻击力不减。 那么,如何应对这些类似的场景呢? 我们可以指定特…

【论文精读】REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS

REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS 前言ABSTRACT1 INTRODUCTION2 REACT: SYNERGIZING REASONING ACTING3 KNOWLEDGE-INTENSIVE REASONING TASKS3.1 SETUP3.2 METHODS3.3 RESULTS AND OBSERVATIONS 4 DECISION MAKING TASKS5 RELATED WORK6 CONCLUSI…

Ubuntu20.04使用cephadm部署ceph集群

文章目录 Requirements环境安装Cephadm部署Ceph单机集群引导(bootstrap)建立新集群 管理OSD列出可用的OSD设备部署OSD删除OSD 管理主机列出主机信息添加主机到集群从集群中删除主机 部署Ceph集群 Cephadm通过在单个主机上创建一个Ceph单机集群&#xff0…

★102. 二叉树的层序遍历

102. 二叉树的层序遍历 很巧妙的,又学习了一种层次遍历的方法,就是说根据当前的队列的长度去遍历,遍历的当前队列的长度就是该层次的节点个数。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* Tr…

Flink 本地单机/Standalone集群/YARN模式集群搭建

准备工作 本文简述Flink在Linux中安装步骤,和示例程序的运行。需要安装JDK1.8及以上版本。 下载地址:下载Flink的二进制包 点进去后,选择如下链接: 解压flink-1.10.1-bin-scala_2.12.tgz,我这里解压到soft目录 [ro…

UniGui禁用缓存

今天有人问到如何禁用缓存,原因是引用了第三方js,css等文件,但是因为缓存的原因,修改后没有及时生效。 首先纠正一点,地址后加?不会禁用缓存 可以看到,后面即使加了?但仍然是from memory cache。对于浏览…

管理类联考——数学——真题篇——按知识分类——数据

文章目录 排列组合2023真题(2023-05)-数据分析-排列组合-组合-C运算-至少-需反面思考真题(2023-08)-数据分析-排列组合-相邻不相邻-捆绑法插空法-插空法注意空位比座位多1个,是用A;捆绑法内部排序用A&#…

ubuntu 20.04.6 server 服务器 下载与安装(配置静态IP)

下载地址:https://releases.ubuntu.com/20.04.6/ubuntu-20.04.6-live-server-amd64.iso 第一步: 准备U盘,使用软碟通将下载好的镜像写入到U盘中 软碟通网址:https://www.cn.ultraiso.net/xiazai.html 点击:文件 ->…

iOS——UIPickerView选择器

UIPickerView UIPickerView是 iOS 开发中常用的用户界面组件之一,用于在垂直方向上显示一个滚动的列表,用户可以通过滚动选择其中的一项。 UIPickerView的协议方法 UIPickerView和UItableView差不多,UIPickerView也要设置代理和数据源。UI…

JAVA+SSM+springboot+MYSQL企业物资库存进销存管理系统

。该系统从两个对象:由管理员和员工来对系统进行设计构建。主要功能包括首页、个人中心、员工管理、项目信息管理、仓库信息管理、供应商管理、项目计划管理、物资库存管理、到货登记管理、物资出库管理、物资入库管理等功能进行管理。本企业物资管理系统方便员工快…

Jenkins简单介绍

学习目标 知道jenkins应用场景能够安装部署jenkins服务器能够实现gitgithubjenkins手动构建能够实现gitgitlabjenkins自动发布系统 认识jenkins Jenkins是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软…

【SpringBoot】请求参数

1. BS 架构 BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 在SpringBoot进行web程序开发时,它内置了一个核心的Servlet程序 DispatcherServlet,称之为 核…

ARP欺骗攻击

一.大概原理 ARP:address solution protocol 地址解析协议 ARP是一种基于局域网的TCP/IP协议,arp欺骗就是基于此协议的漏洞来达成我们的目的的,局域网中的数据传输并不是用ip地址传输的,而是靠mac地址。 我们如果出于某种目的想…

HTML中表格的语法及使用(详解)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中表格的语法及详细使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留…

学校安全检查系统

校园面积大、安全盲区多对学校安全管理带来诸多挑战;传统依靠人工纸质巡检记录存在漏检、管理难、联动差等诸多问题和缺点,巡检过程中很容易遗漏安全隐患的存续,从而导致安全事故的发生。 通过凡尔码平台模块化搭建学校安全管理系统&#xf…

黑豹程序员-EasyExcel实现导出

需求 将业务数据导出到excel中,老牌的可以选择POI,也有个新的选择EasyExcel。 有个小坑,客户要求样式比较美观,数字列要求千位符,保留2位小数。 可以用代码实现但非常繁琐,用模板就特别方便,模…

什么是RabbitMQ

目录 ​编辑 一、引言 二、概念和特性: 1、消息代理: 2、队列: 3、发布/订阅模型: 4、路由和交换机: 5、持久性: 6、灵活的消息模式: 7、可扩展性: 我的其他博客 一、引言…

湖科大计网:计算机网络概述

一、计算机网络的性能指标 一、速率 有时候数据量也认为是以10为底的,看怎么好算。(具体吉大考试用什么待商榷) 二、带宽 在模拟信号系统中带宽的含义,本课程中用到的地方是:香农定理和奈奎斯特定理公式的应用之中。 …

OCRmyPDF让你能搜索扫描版PDF文档

什么是 OCRmyPDF ? PDF 是存储和交换扫描文档的最佳格式。不幸的是,PDF 可能很难修改。OCRmyPDF 是一个 Python 应用程序和库,可以轻松地将图像处理和 OCR(可识别、可搜索的文本)应用于现有 PDF,通过向扫描…
最新文章