当前位置: 首页 > news >正文

gRPC使用详解

    • 起源
    • 特点
    • 主要优缺点
    • 应用场景
    • 组成部分
    • 使用方法
    • SpringBoot集成gRPC
    • Vert.x集成gRPC
    • Nacos集成gRPC
    • 监控gRPC调用过程
    • Java使用示例

在这里插入图片描述

起源

gRPC的起源可以追溯到2015年,当时谷歌发布了一款开源RPC框架,名为gRPC。gRPC的设计初衷是为了提供一种标准化、可通用和跨平台的RPC解决方案,类似于谷歌内部的Stubby框架,但更加开放和可扩展。

gRPC的受欢迎程度迅速增长,许多大型公司开始采用gRPC,包括Netflix、Square、Lyft、Docker、CoreOS和思科等。随着gRPC的普及,它被接纳进了云原生计算基金会(Cloud Native Computing Foundation,CNCF),这是最受欢迎的开源软件基金会之一,致力于让云原生计算具备通用性和可持续性。

gRPC的设计理念基于远程过程调用(RPC),旨在简化分布式系统中的服务间通信。通过定义服务接口和使用Protocol Buffers进行序列化,gRPC使得客户端可以像调用本地方法一样调用远程服务,屏蔽了网络通信的复杂性,使开发者能够更专注于业务逻辑的开发。

gRPC的来源和发展源于谷歌对标准化、通用化和跨平台的RPC框架的需求,以及社区对gRPC的接纳和广泛采用。gRPC已经成为许多微服务组件和分布式系统之间通信的重要工具,并且在云原生应用开发中发挥着越来越重要的作用。

在这里插入图片描述

在这里插入图片描述

特点

gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,面向服务端和移动端,基于HTTP/2设计。以下是gRPC的一些主要特点:

  1. 语言中立:支持多种语言,包括Java、C++、Python、Go、Ruby、C#、Java等。
  2. 基于IDL文件定义服务:通过proto3工具生成指定语言的数据结构、服务端接口以及客户端Stub。
  3. 通信协议基于标准的HTTP/2设计:支持双向流、消息头压缩、单TCP的多路复用、服务端推送等特性,这些特性使得gRPC在移动端设备上更加省电和节省网络流量。
  4. 序列化支持PB(Protocol Buffer)和JSON:PB是一种语言无关的高性能序列化框架,基于HTTP/2+PB,保障了RPC调用的高性能。
  5. 服务端创建流程:采用Build模式,对底层服务绑定、transportServer和NettyServer的创建和实例化做了封装和屏蔽,让服务调用者不用关心RPC调用细节。
  6. 客户端存根:在客户端拥有一个存根能够像服务端一样的方法,使得客户端应用可以像调用本地对象一样直接调用另一台不同机器上服务端应用的方法。

gRPC能够节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。此外,gRPC的协议设计上使用了HTTP2现有的语义,请求和响应的数据使用HTTP Body发送,其他的控制信息则用Header表示。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。

在这里插入图片描述

主要优缺点

gRPC是一个高性能、开源的远程过程调用(RPC)框架,具有许多优势和劣势。

优势:

  1. 高性能:gRPC使用Protocol Buffers作为数据交换格式,具有高效的序列化和反序列化性能。它还支持多种传输协议,包括HTTP/2,提供了高吞吐量和低延迟的通信能力。
  2. 跨语言支持:gRPC基于标准的Protocol Buffers,可以在多种编程语言中使用,包括Java、Python、Go、C#、Ruby等。这使得在不同语言编写的服务之间进行通信变得更加容易。
  3. 强大的扩展性:gRPC的设计具有高度的可扩展性,支持自定义插件和中间件。这使得开发人员可以根据自己的需求对gRPC进行定制和扩展。
  4. 双向流式通信:gRPC支持双向流式通信,客户端和服务器可以同时发送数据,适用于需要连续数据交互的场景。
  5. 高度可定制的传输协议:gRPC可以基于HTTP/2进行传输,同时也可以使用其他传输协议。这使得开发人员可以根据需求选择最佳的传输协议。
  6. 支持负载均衡:gRPC内置负载均衡功能,可以轻松地将请求分发到多个服务器实例或服务上,实现水平扩展和高可用性。
  7. 强大的社区支持:gRPC由Google开发并维护,拥有庞大的社区和活跃的开发者群体。这意味着遇到问题时可以获得及时的帮助和解决方案。

劣势:

  1. 复杂性:gRPC涉及的概念和技术较多,学习曲线相对较陡峭。开发人员需要了解protobuf、RPC基本概念以及各种高级特性才能充分利用gRPC的优势。
  2. 依赖管理:使用gRPC需要安装和配置多个依赖项,包括protobuf编译器、gRPC服务器和客户端库等。这增加了项目的复杂性和维护成本。
  3. 安全性和隐私:虽然gRPC提供了TLS/SSL加密通信的支持,但开发人员仍需确保正确配置安全设置,并处理所有相关的安全和隐私问题。
  4. 网络开销:gRPC使用Protocol Buffers作为数据交换格式,相对于XML或JSON等文本格式,序列化和反序列化的开销可能更大。
  5. 不支持HTTP/1.x:gRPC基于HTTP/2传输协议,不直接支持HTTP/1.x协议。如果需要与使用HTTP/1.x协议的服务进行通信,需要进行协议转换或升级目标服务为HTTP/2。
  6. 浏览器支持有限:由于大多数浏览器只支持HTTP/1.x协议而不支持HTTP/2,因此使用gRPC在浏览器端直接进行通信可能存在限制。需要额外的工具或技术来实现浏览器与gRPC服务的通信。
  7. 社区标准不统一:虽然gRPC拥有庞大的社区支持,但与其他技术(如RESTful API)相比,其作为RPC框架的标准尚未完全统一。这可能导致与其他技术的不兼容或额外的集成工作。

总体而言,gRPC在高性能、跨语言支持和扩展性等方面表现出色,但也有一些复杂性、安全性和浏览器支持等方面的劣势。选择使用gRPC时需要根据项目的具体需求进行权衡,并充分考虑这些优劣势。

在这里插入图片描述

应用场景

gRPC的应用场景主要包括以下几个方面:

  1. 微服务架构:在微服务架构中,服务之间的通信是关键。gRPC提供了一种高效、通用的方式来支持服务间的通信,使得服务间的调用更加简单、快速。
  2. 移动应用开发:对于需要从移动应用中调用远程服务的场景,gRPC是一种很好的选择。由于其高效和低延迟的特性,gRPC使得移动应用可以更快地与远程服务器进行通信。
  3. 实时游戏:在实时游戏中,低延迟的通信是非常重要的。gRPC由于其高效和低延迟的特性,被广泛应用于实时游戏的后端服务中。
  4. 云原生应用开发:在云原生应用开发中,服务间的通信和扩展性是非常重要的。gRPC作为一种通用的、高效的RPC框架,被广泛应用于云原生应用开发中。
  5. 物联网(IoT):在物联网场景中,设备间需要进行高效的通信。gRPC的高效和低延迟特性使得它成为物联网设备间通信的理想选择。
  6. 跨语言服务调用:由于gRPC支持多种语言,因此它非常适合需要跨语言服务的场景,例如使用不同语言的微服务之间的通信。

总的来说,gRPC适用于任何需要高性能、低延迟的远程服务调用的场景,尤其在微服务架构、移动应用开发、实时游戏、云原生应用开发、物联网和跨语言服务调用等方面有广泛的应用。

在这里插入图片描述

组成部分

gRPC是一个高性能、开源的远程过程调用(RPC)框架,由以下主要组成部分构成:

  1. 服务定义:使用Protocol Buffers(protobuf)定义服务接口和数据模型。创建一个.proto文件,在其中定义服务方法和数据类型。
  2. 服务实现:在服务器端实现服务接口,并运行一个gRPC服务器来处理客户端调用。
  3. 客户端存根(Stub):在客户端,使用生成的代码创建一个gRPC客户端存根(Stub),并使用它来发起gRPC调用。
  4. 网络传输模块:底层传输层,可以是TCP或HTTP。
  5. 序列化与反序列化:用于将数据转换为可以在网络上传输的格式,以及将接收到的数据转换回原始格式。
  6. 身份验证和授权:gRPC支持多种安全机制,如TLS/SSL加密通信、身份验证和授权等。
  7. 性能优化:优化gRPC的性能可能需要对服务进行调优和优化。
  8. 文档和社区支持:gRPC有一个活跃的社区,提供了丰富的文档和示例代码。

这些组成部分共同协作,使得gRPC成为一个功能强大的RPC框架,适用于构建高效、可扩展的分布式系统。通过使用gRPC,开发人员可以更容易地创建和维护跨语言、跨平台的分布式应用程序。

在这里插入图片描述

使用方法

要使用gRPC,你需要按照以下步骤进行操作:

  1. 定义服务:使用Protocol Buffers(protobuf)定义服务接口和数据模型。创建一个.proto文件,并在其中定义服务方法和数据类型。
  2. 生成代码:使用protobuf编译器将.proto文件编译成目标编程语言的代码。这将生成服务接口和消息类的代码,用于在客户端和服务器之间传输数据。
  3. 实现服务:在服务器端实现服务接口,并运行一个gRPC服务器来处理客户端调用。确保你已经安装了gRPC服务器所需的依赖库。
  4. 创建客户端:在客户端,使用生成的代码创建一个gRPC客户端存根(stub),并使用它来发起gRPC调用。确保你已经安装了gRPC客户端所需的依赖库。
  5. 配置和启动服务:根据你的需求,配置gRPC服务器和客户端的参数,如端口号、超时时间等。启动gRPC服务器和客户端,并确保它们能够正常通信。
  6. 测试和验证:编写测试用例,验证gRPC服务的正确性。你可以使用自动化测试工具或编写手动测试脚本来测试服务的各个方面,包括请求和响应的序列化、服务的可用性和性能等。
  7. 部署和监控:将gRPC服务部署到生产环境,并监控其性能和可用性。确保你的服务具有适当的容错机制和负载均衡能力,以便在出现故障时能够快速恢复。

在使用gRPC时,还需要注意以下几点:

  • 跨语言支持:gRPC支持多种编程语言,因此你可以选择适合你的项目的语言进行开发。确保你选择了与你的团队和技术栈相匹配的语言。
  • 安全性:gRPC支持多种安全机制,如TLS/SSL加密通信、身份验证和授权等。根据需要配置安全选项,以确保你的服务的安全性。
  • 性能优化:gRPC的性能取决于多个因素,包括网络带宽、序列化和反序列化开销等。优化gRPC的性能可能需要对服务进行调优和优化。
  • 文档和社区支持:gRPC有一个活跃的社区,提供了丰富的文档和示例代码。你可以通过查看官方文档、参与社区论坛或寻求技术支持来解决问题和学习更多关于gRPC的知识。

在这里插入图片描述

在这里插入图片描述

SpringBoot集成gRPC

在Spring Boot项目中集成gRPC涉及几个关键步骤,下面是一个大致的指南:

  1. 添加依赖
    首先,你需要在你的pom.xml(Maven)或build.gradle(Gradle)文件中添加gRPC和相关的依赖。例如,对于Maven,你可能需要添加类似下面的依赖:

    <dependencies><!-- gRPC依赖 --><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>${grpc.version}</version></dependency><!-- 其他的Spring Boot依赖 -->
    </dependencies>
    

    其中${grpc.version}是你想要使用的gRPC的版本号。

  2. 定义gRPC服务
    使用Protocol Buffers(protobuf)定义你的服务接口和数据模型。创建一个.proto文件,并在其中定义RPC服务和消息类型。

  3. 生成代码
    使用protobuf编译器生成Java代码。这通常可以通过Maven或Gradle插件来完成,或者在构建过程中手动执行。

  4. 实现gRPC服务
    在Spring Boot应用中,创建一个类来实现你在.proto文件中定义的gRPC服务接口。使用@GrpcService注解来标记这个类,以便Spring能够发现并注册它。

  5. 配置gRPC服务器
    配置gRPC服务器以监听特定的端口和地址。在Spring Boot中,你可以通过配置文件(如application.propertiesapplication.yml)来设置这些属性,或者在Java配置类中设置。

  6. 创建gRPC客户端
    在你的Spring Boot应用中,你可能还需要创建gRPC客户端来调用其他gRPC服务。你可以使用gRPC的Java库来创建一个客户端存根(stub),并通过它来发起RPC调用。

  7. 启动和测试
    启动你的Spring Boot应用,并测试gRPC服务是否能够正常工作。你可以编写集成测试来验证gRPC服务的端到端行为,或者使用像BloomRPC这样的工具来手动测试你的服务。

  8. 安全性和异常处理
    根据你的需求,配置gRPC服务的安全性,如使用SSL/TLS加密通信。同时,确保妥善处理异常和错误,以便向客户端提供有用的错误信息。

在这里插入图片描述

Vert.x集成gRPC

将gRPC集成到Vert.x项目中需要几个关键步骤。Vert.x是一个用于构建响应式应用的框架,它支持多种编程语言,包括Java、JavaScript、Groovy和Kotlin。下面是在Vert.x项目中集成gRPC的步骤:

  1. 添加依赖

在Vert.x项目中,你需要添加gRPC的依赖。这通常可以通过将相关依赖添加到项目的pom.xml(Maven)或build.gradle(Gradle)文件中来完成。确保你已经添加了Vert.x和gRPC的正确版本。
2. 定义gRPC服务和消息

使用Protocol Buffers(protobuf)定义你的gRPC服务和消息。创建一个.proto文件,在其中定义你的服务接口和数据模型。确保你已经安装了protobuf编译器,以便将.proto文件编译成Java代码。
3. 生成gRPC服务和消息代码

使用protobuf编译器将.proto文件编译成Java代码。这将生成一个服务接口和相关的消息类,用于在gRPC客户端和服务器之间传输数据。
4. 创建gRPC服务器

在Vert.x中,创建一个gRPC服务器实例,并指定要监听的端口。使用生成的gRPC服务和消息代码,实现你的服务逻辑。Vert.x提供了用于处理gRPC请求和响应的API。
5. 创建gRPC客户端

在需要调用gRPC服务的客户端代码中,创建一个gRPC客户端实例。使用生成的gRPC服务和消息代码,构建客户端存根(stub),并使用它来发起gRPC调用。
6. 启动和测试

启动你的Vert.x应用程序,并确保gRPC服务器和客户端正确运行。你可以编写单元测试和集成测试来验证gRPC服务的正确性。
7. 配置和优化

根据需要配置gRPC服务器的参数,如超时设置、线程池大小等。Vert.x提供了灵活的配置选项,可以优化gRPC服务的性能和可靠性。
8. 安全性和异常处理

根据你的需求,配置gRPC服务的安全性,如使用SSL/TLS加密通信。同时,确保妥善处理异常和错误,以便向客户端提供有用的错误信息。

请注意,上述步骤是一个大致的指南,具体的实现细节可能会根据你的具体需求和项目配置有所不同。确保参考Vert.x和gRPC的官方文档以获取更详细的信息和示例代码。

在这里插入图片描述

Nacos集成gRPC

要将Nacos与gRPC集成,您可以按照以下步骤进行操作:

  1. 定义gRPC服务和消息

    • 使用Protocol Buffers(protobuf)定义您的gRPC服务和消息。创建一个.proto文件,在其中定义您的服务接口和数据模型。
  2. 生成gRPC服务和消息代码

    • 使用protobuf编译器将.proto文件编译成Java代码。这将生成一个服务接口和相关的消息类,用于在gRPC客户端和服务器之间传输数据。
  3. 实现gRPC服务

    • 在Nacos中,创建一个gRPC服务器实例,并实现您定义的服务接口。您可以使用Nacos提供的API和功能来扩展和管理gRPC服务。
  4. 创建gRPC客户端存根

    • 在需要调用gRPC服务的客户端代码中,创建一个gRPC客户端存根(stub),并使用它来发起gRPC调用。确保您已经将生成的客户端存根与您的客户端应用程序集成。
  5. 配置Nacos以支持gRPC

    • 根据您的需求,配置Nacos以支持gRPC通信。您可能需要配置Nacos的gRPC监听器、路由和负载均衡等设置。确保您已正确配置Nacos以与您的gRPC服务通信。
  6. 启动和测试

    • 启动您的Nacos服务器和gRPC服务,并确保它们能够正常通信。编写测试用例,验证gRPC服务的正确性,包括请求和响应的序列化、服务的可用性和性能等。
  7. 部署和监控

    • 将Nacos和gRPC服务部署到生产环境,并监控其性能和可用性。确保您的服务具有适当的容错机制和负载均衡能力,以便在出现故障时能够快速恢复。
  8. 维护和更新

    • 定期检查和更新Nacos和gRPC的版本,以获得最新的功能和安全修复。同时,关注社区动态,以便及时获取问题修复和新特性的更新。

在这里插入图片描述

监控gRPC调用过程

要监控gRPC调用过程,你可以考虑以下几个方面:

  1. 使用gRPC的追踪和监控工具:gRPC本身提供了一些追踪和监控工具,可以帮助你监控gRPC调用的过程。例如,你可以使用OpenCensus或OpenTelemetry等工具来收集gRPC调用的时序数据和度量指标,并可视化地展示调用过程。
  2. 实现自定义的追踪和监控逻辑:在你的gRPC服务中,你可以实现自定义的追踪和监控逻辑来收集调用过程中的数据。例如,你可以在服务端和客户端添加追踪代码,记录调用的开始时间、结束时间、请求数据和响应数据等信息,并将这些信息发送到监控系统进行展示和分析。
  3. 使用日志记录:在gRPC的客户端和服务器端,你可以使用日志记录来记录调用过程中的重要事件和错误信息。例如,你可以在客户端和服务端的代码中添加日志语句,记录调用的详细信息和错误信息,以便于排查问题和监控调用过程。
  4. 使用性能分析工具:你可以使用性能分析工具来监控gRPC调用的性能指标,如响应时间、吞吐量、错误率等。这些工具可以帮助你发现性能瓶颈和问题,并提供优化建议。
  5. 使用分布式追踪系统:如果你的gRPC服务部署在分布式系统中,你可以使用分布式追踪系统来监控整个调用链路。通过分布式追踪系统,你可以跟踪一个请求从客户端到服务器再到客户端的完整调用链路,并分析整个链路的性能和瓶颈。

监控gRPC调用过程需要结合多种工具和技术来实现。通过使用gRPC提供的工具、实现自定义的追踪和监控逻辑、使用日志记录和性能分析工具以及使用分布式追踪系统等方法,你可以全面地监控gRPC调用的过程,及时发现和解决问题,并优化调用性能。

在这里插入图片描述

Java使用示例

下面是一个简单的Java使用gRPC的示例:

首先,你需要定义你的gRPC服务和消息。创建一个.proto文件,例如hello.proto

syntax = "proto3";package helloworld;service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

然后,使用protobuf编译器生成Java代码:

protoc --java_out=. hello.proto

接下来,你可以在服务器端实现gRPC服务:

import io.grpc.stub.StreamObserver;
import helloworld.GreeterGrpc;
import helloworld.HelloReply;
import helloworld.HelloRequest;public class GreeterImpl extends GreeterGrpc.GreeterImplBase {@Overridepublic void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();responseObserver.onNext(reply);responseObserver.onCompleted();}
}

在客户端,你可以使用生成的gRPC存根来发起gRPC调用:

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import helloworld.GreeterGrpc;
import helloworld.HelloReply;
import helloworld.HelloRequest;public class GreeterClient {public static void main(String[] args) throws Exception {ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build();GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);HelloRequest request = HelloRequest.newBuilder().setName("world").build();HelloReply reply = stub.sayHello(request);System.out.println("Greeter client received: " + reply.getMessage());}
}

在这个示例中,我们定义了一个简单的gRPC服务,其中只有一个SayHello方法。在服务器端,我们实现了这个方法,并返回一个包含问候消息的HelloReply对象。在客户端,我们使用生成的gRPC存根来调用SayHello方法,并打印返回的消息。

在这里插入图片描述


  • gRPC官网

  • gRPC协议详解

  • Vert.x gRPC

相关文章:

gRPC使用详解

起源特点主要优缺点应用场景组成部分使用方法SpringBoot集成gRPCVert.x集成gRPCNacos集成gRPC监控gRPC调用过程Java使用示例 起源 gRPC的起源可以追溯到2015年&#xff0c;当时谷歌发布了一款开源RPC框架&#xff0c;名为gRPC。gRPC的设计初衷是为了提供一种标准化、可通用和跨…...

海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播

Notes 视频播放的几种方式 一、Video mp4链接直接播放 二、海康威视3.3插件版直播、云台控制&#xff0c;资源下载地址 index.html引入hk文件中的js文件双击HCWebSDKPlugin.exe安装插件前端参照文件夹hkCamera中的示例代码 三、海康威视3.2无插件版直播&#xff0c;资源下…...

测试工作(新入职)感悟

背景&#xff1a;我之前在小规模传统公司&#xff0c;工作强度一般&#xff0c;早九晚六&#xff0c;偶尔加班。现在就职的是大型同行业互联网公司&#xff0c;工作强度大&#xff0c;早九晚九&#xff0c;目前已经入职两个礼拜。 基于这个背景&#xff0c;新工作对我是比较有…...

hivesql的基础知识点

目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…...

Linux下的线程操作

一、多线程的创建于退出 1. pthread_create(线程的创建) pthread_create 是 POSIX 线程库中的函数&#xff0c;用于创建一个新的线程。 函数原型如下&#xff1a; int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void…...

机器学习 | 如何利用集成学习提高机器学习的性能?

目录 初识集成学习 Bagging与随机森林 Otto Group Product(实操) Boosting集成原理 初识集成学习 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过组合多个基本模型来提高预测准确性和泛化能力的机器学习方法。它通过将多个模型的预测结果进行整合或投票来做…...

[Python] 什么是PCA降维技术以及scikit-learn中PCA类使用案例(图文教程,含详细代码)

什么是维度&#xff1f; 对于Numpy中数组来说&#xff0c;维度就是功能shape返回的结果&#xff0c;shape中返回了几个数字&#xff0c;就是几维。索引以外的数据&#xff0c;不分行列的叫一维&#xff08;此时shape返回唯一的维度上的数据个数&#xff09;&#xff0c;有行列…...

npm 淘宝镜像正式到期,更新使用成功

npm 淘宝镜像原网址&#xff1a;https://registry.npm.taobao.org/ npm 淘宝镜像更新后网址&#xff1a;https://registry.npmmirror.com 过程&#xff1a; 部署 nuxt docker 容器的时候&#xff0c;报以下错&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CE…...

python_蓝桥杯刷题记录_笔记_全AC代码_入门2

前言 现在正式进入蓝桥杯的刷题啦&#xff0c;用python来做算法题&#xff0c;因为我之前其实都是用C来做题的&#xff0c;但是今年的话我打算换python来试试&#xff0c;很明显因为也才这学期接触python 加上之前C做题也比较菜&#xff0c;所以我打算用python重新来做题&#…...

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…...

2023_12蓝桥杯STEMA 考试 Scratch 中级试卷解析

2023蓝桥杯STEMA 考试 Scratch 中级试卷(12 月)解析 由于没有原始文件,这里使用的角色和背景和实际题目会有所差异,已经尽量还原原题,以下代码仅供参考。吐槽一句:蓝桥杯越来越变态了!\(`Δ’)/\(`Δ’)/\(`Δ’)/孩子学习速度永远也赶不上内卷的速度。 一、选择…...

从编程中理解:大脑中的杏仁核

编程和神经科学在某种程度上可以相互借鉴,尤其是在模拟大脑功能时。让我们以Unity游戏引擎中的C#代码为例,结合金庸武侠小说中的人物形象来构建一个类比故事,探讨如何通过编程模拟大脑中杏仁核的作用。 假设在一款名为“脑海江湖”的Unity游戏中,主角张无忌(代指玩家角色…...

Maven dependency中的scope

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中&#xff0c;scope的默认值是compile。 scope的分类 compile&#xff08;默认&#xff09; 含义&#xff1a; compile 是默认值&#xff0c;如果没有指定 scope 值&#xff0c;该元素…...

代码随想录算法训练营DAY11 | 栈与队列 (2)

一、LeetCode 20 有效的括号 题目链接&#xff1a;20.有效的括号https://leetcode.cn/problems/valid-parentheses/ 思路&#xff1a;遇到左括号直接进栈&#xff1b;遇到右括号判断站顶是否有匹配的括号&#xff0c;没有就返回flase&#xff0c;有就将栈顶元素出栈&#xff1…...

【Spring实战】33 Spring Boot3 集成 Nacos 配置中心

文章目录 1. 配置中心定义2. 解决哪些问题3. 常用的配置中心4. 使用示例1&#xff09;没引入 Nacos 配置中心2&#xff09;引入依赖3&#xff09;配置Nacos连接信息4&#xff09;在 Nacos 上配置属性5&#xff09;在 Spring Boot 中使用配置6&#xff09;启动服务&验证7&am…...

ElementUI安装与使用指南

Element官网-安装指南 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 一、开发环境配置 电脑需要先安装好node.js和vue2或者vue3 安装Node.js Node.js 中文网 安装node.js命令&#xff1a;brew install node node.js安装完后&#xff0c;输入&#xff1…...

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…...

项目安全-----加密算法实现

目录 对称加密算法 AES &#xff08;ECB模式&#xff09; AES(CBC 模式)。 非对称加密 对称加密算法 对称加密算法&#xff0c;是使用相同的密钥进行加密和解密。使用对称加密算法来加密双方的通信的话&#xff0c;双方需要先约定一个密钥&#xff0c;加密方才能加密&#…...

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具&#xff1a;安装宝塔面板服务器至少一台、域名一个 前端&#xff1a;生成dist文件&#xff08;前端运行build命令&#xff09; 后端&#xff1a;生成jar包&#xff08;maven运行package命令&#xff09; 准备&#xff1a; 打开宝塔面板&#xff0c;点击进入软…...

《Pandas 简易速速上手小册》第8章:Pandas 高级数据分析技巧(2024 最新版)

文章目录 8.1 使用 apply 和 map 函数8.1.1 基础知识8.1.2 重点案例&#xff1a;客户数据清洗和转换8.1.3 拓展案例一&#xff1a;产品评分调整8.1.4 拓展案例二&#xff1a;地址格式化 8.2 性能优化技巧8.2.1 基础知识8.2.2 重点案例&#xff1a;大型销售数据分析8.2.3 拓展案…...

leetcode.多数元素

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; import java.util.HashMap;public class LeetCode169 {public int majorityElement(int[] nums) {int count nums.length;int res count/2;Scanner scanner new Scanner(System.in);HashMap<Integer,Integer> …...

DiMTAIC 2024 数字医学技术及应用创新大赛-甲状腺B超静态及动态影像算法赛-参赛项目

参赛成绩 项目介绍 去年参加完这个比赛之后&#xff0c;整理了项目文件和代码&#xff0c;虽然比赛没有获奖&#xff0c;但是参赛过程中自己也很有收获&#xff0c;自己一个人搭建了完整的pipeline并基于此提交了多次提高成绩&#xff0c;现在把这个项目梳理成博客&#xff0c…...

免费工具-微软Bing Video Creator

目录 引言 一、揭秘Bing Video Creator 二、轻松上手&#xff1a;三步玩转Bing Video Creator 2.1 获取与访问&#xff1a; 2.2 创作流程&#xff1a; 2.3 提示词撰写技巧——释放AI的想象力&#xff1a; 三、核心特性详解&#xff1a;灵活满足多样化需求 3.1 双重使用模…...

【技术笔记】MSYS2 指定 Python 版本安装方案

#工作记录 MSYS2 指定 Python 版本安装 一、前置条件 安装指定版本需要在干净的 MSYS2 环境中执行&#xff0c;为保证工具链的兼容性&#xff0c;若已安装 Python&#xff0c;需先卸载 Python 及与该版本深度绑定的工具链。具体操作如下&#xff1a; 卸载 Python&#xff1a…...

wsl开启即闪退

[ 问题 ]&#xff1a; 在一次电脑卡住&#xff0c;强制关机重启后&#xff0c;遇到打开WSL就闪退的问题在CMD中打开WSL&#xff0c;出现如上图的描述&#xff1a; C:\Users\admin>wsl wsl: 检测到 localhost 代理配置&#xff0c;但未镜像到 WSL。NAT 模式下的 WSL 不支持…...

LangGraph--Agent工作流

Agent的工作流 下面展示了如何创建一个“计划并执行”风格的代理。 这在很大程度上借鉴了 计划和解决 论文以及Baby-AGI项目。 核心思想是先制定一个多步骤计划&#xff0c;然后逐项执行。完成一项特定任务后&#xff0c;您可以重新审视计划并根据需要进行修改。 般的计算图如…...

Agent短期记忆的几种持久化存储方式

今天给大家讲一下关于Agent长期对话的几种持久化存储方式&#xff0c;之前的文章给大家说过短期记忆和长期记忆&#xff0c;短期记忆基于InMemorySaver做checkpointer&#xff08;检查点&#xff09;&#xff0c;短期记忆 &#xff08;线程级持久性&#xff09; 使代理能够跟踪…...

python爬虫:grequests的详细使用(基于gevent和requests的异步HTTP请求库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、grequests 概述1.1 grequests 介绍1.2 注意事项1.3 替代方案比较1.4 基本组件1.5 grequests 安装二、基本用法2.1 创建请求任务2.2 发送请求并获取响应2.3 带参数的请求三、高级用法3.1 自定义回调函数3.2 设置超时…...

低代码平台前端页面表格字段绑定与后端数据传输交互主要有哪些方式?华为云Astro在这方面有哪些方式?

目录 🔧 一、低代码平台中常见的数据绑定与交互方式 1. 接口绑定(API 调用) 2. 数据源绑定(DataSource) 3. 变量中转(临时变量 / 页面状态) 4. 数据模型绑定(模型驱动) 🌐 二、华为云 Astro 轻应用的实现方式 ✅ 1. 数据源绑定(API服务+API网关) ✅ 2. 变…...

基于Halcon深度学习之分类

***** ***环境准备*** ***系统&#xff1a;win7以上系统 ***显卡&#xff1a;算力3.0以上 ***显卡驱动&#xff1a;10.1以上版本&#xff08;nvidia-smi查看指令&#xff09;***读取深度学习模型*** read_dl_model (pretrained_dl_classifier_compact.hdl, DLModelHandle) ***获…...