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

探索 Spring Cloud Gateway:构建微服务架构的关键一环

1. 简介

在当今的分布式系统中,微服务架构已经成为了一种流行的架构模式。在微服务架构中,服务被拆分为小型、可独立部署的服务单元,这些服务单元能够通过网络互相通信,形成一个整体的应用系统。然而,随着微服务数量的增加,管理和保护这些服务之间的通信变得愈发复杂。这就引入了微服务网关的概念。

微服务网关是一个位于客户端和微服务之间的服务,作为所有外部请求的入口,负责路由请求到相应的微服务,并提供一些额外的功能,如认证、安全、监控等。它帮助我们管理和控制微服务架构中的流量,提高了系统的安全性、可靠性和可维护性。

Spring Cloud Gateway 是一个基于Spring Boot的API网关服务,它提供了一种简单而有效的方式来管理微服务之间的通信。与传统的单体应用程序网关不同,Spring Cloud Gateway是一个轻量级的、高度可定制的网关解决方案,可以根据具体需求来扩展和定制。

在本系列教程中,我们将深入探讨如何使用Spring Cloud Gateway构建一个强大的微服务网关。我们将从概念和原理开始,逐步介绍如何配置和使用Spring Cloud Gateway来实现各种功能,如路由、过滤、负载均衡等。通过本系列教程,您将学会如何利用Spring Cloud Gateway来简化微服务架构的管理和维护,并提高系统的性能和安全性。

在接下来的章节中,我们将介绍如何准备工作环境,并开始创建我们的第一个Spring Cloud Gateway应用程序。


2. 准备工作

在开始构建基于Spring Cloud Gateway的微服务网关之前,确保您完成了以下准备工作:

2.1 Java 开发环境

首先,确保您的开发环境中已经安装了Java Development Kit (JDK)。Spring Cloud Gateway是一个基于Java的框架,因此您需要在本地环境中安装JDK。

您可以在Oracle官方网站或者OpenJDK项目网站下载并安装最新的JDK版本。安装完成后,通过在命令行中输入 java -version 来验证JDK是否成功安装。

2.2 Maven 或 Gradle

Spring Boot项目通常使用Maven或Gradle作为构建工具。确保您已经在系统中安装了Maven或Gradle,并且已经配置了相应的环境变量。

您可以在Maven官方网站或Gradle官方网站找到安装说明,并按照指示进行安装。

2.3 Spring Boot 知识

对于使用Spring Cloud Gateway构建微服务网关,对Spring Boot有一定的了解是非常有帮助的。确保您对Spring Boot框架的基本概念、注解和依赖关系有一定的了解。

如果您对Spring Boot还不太熟悉,可以通过阅读Spring Boot的官方文档或者完成一些相关的在线教程来提升您的技能水平。

2.4 IDE(集成开发环境)

选择一个适合您的集成开发环境(IDE),如IntelliJ IDEA、Eclipse或者VS Code等。这些IDE都对Java和Spring Boot提供了很好的支持,并且能够提高您的开发效率。

确保您的IDE已经正确安装和配置,并且您熟悉如何在其中创建和管理项目。

2.5 互联网连接

最后但同样重要的是,确保您的开发环境能够连接到互联网。在构建和配置Spring Cloud Gateway时,您可能需要下载依赖库、文档和示例代码,因此需要一个稳定的互联网连接。

确保您的网络连接稳定,并且可以顺畅地访问必要的资源。

通过完成以上准备工作,您就为开始构建基于Spring Cloud Gateway的微服务网关奠定了基础。接下来,我们将开始创建我们的第一个Spring Cloud Gateway项目。


3. 创建Spring Boot项目

在开始使用Spring Cloud Gateway构建微服务网关之前,首先需要创建一个基于Spring Boot的项目。在本节中,我们将演示如何使用Spring Initializr快速创建一个新的Spring Boot项目。

3.1 使用 Spring Initializr

Spring Initializr是一个官方提供的快速创建Spring Boot项目的工具。您可以访问https://start.spring.io/打开Spring Initializr网站。

3.2 配置项目

在Spring Initializr网站上,您需要提供一些基本信息来配置您的项目:

  • Project: 选择“Maven Project”或“Gradle Project”作为项目管理工具。
  • Language: 选择“Java”作为项目的开发语言。
  • Spring Boot: 选择最新的稳定版本。
  • Project Metadata: 输入您的项目的Group、Artifact、Name等信息。
  • Dependencies: 在这里选择要包含在项目中的依赖项。对于Spring Cloud Gateway项目,您至少需要选择“Spring Web”和“Spring Cloud Gateway”。

3.3 生成项目

在完成项目配置后,点击“Generate”按钮生成项目。Spring Initializr将会生成一个包含所选依赖项的项目压缩包,并提供下载链接。

3.4 导入项目

下载生成的项目压缩包并解压缩。然后,使用您选择的集成开发环境(IDE)导入项目。例如,在IntelliJ IDEA中,选择“File” -> “Open”并选择项目的根目录。

3.5 验证项目

导入项目后,确保项目能够成功构建并运行。您可以执行一些简单的测试,例如启动Spring Boot应用程序并访问默认端口(通常为8080)上的首页。

./mvnw spring-boot:run

在浏览器中访问 http://localhost:8080,如果看到Spring Boot的欢迎页面,则表示项目已成功运行。

3.6 创建控制器

为了进一步验证项目的正常运行,您可以创建一个简单的控制器类,并添加一些端点来处理HTTP请求。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "Hello, Spring Boot!";}
}

3.7 测试控制器

重新运行应用程序,并访问 /hello 端点,您应该能够看到返回的 “Hello, Spring Boot!” 消息。

通过完成上述步骤,您已经成功创建了一个基于Spring Boot的项目,并验证了项目的正常运行。接下来,我们将开始配置Spring Cloud Gateway来构建微服务网关。


4. 配置Spring Cloud Gateway

在本节中,我们将详细介绍如何配置Spring Cloud Gateway来构建微服务网关。

4.1 添加依赖项

首先,在您的Spring Boot项目中的 pom.xml 文件(如果使用Maven)或 build.gradle 文件(如果使用Gradle)中添加Spring Cloud Gateway依赖项。您可以通过在这些文件中添加以下依赖项来引入Spring Cloud Gateway:

Maven:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'

4.2 创建网关配置类

接下来,您需要创建一个配置类来配置Spring Cloud Gateway。您可以创建一个Java类,并使用 @Configuration 注解标记它,以便Spring能够扫描并加载该类。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes()// Add your routes here.build();}
}

在上面的示例中,我们创建了一个名为 GatewayConfig 的配置类,并定义了一个名为 customRouteLocator 的Bean。您可以在这个方法中使用 RouteLocatorBuilder 来定义路由规则。

4.3 配置路由规则

通过 RouteLocatorBuilder,您可以使用各种方法来定义路由规则。例如,您可以根据请求路径、HTTP方法、请求参数等条件来路由请求到不同的目标服务。

下面是一个简单的示例,将请求 /example 路径转发到 http://example.com 目标服务:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("example_route", r -> r.path("/example").uri("http://example.com")).build();
}

4.4 其他配置选项

除了路由规则外,您还可以配置其他选项,如过滤器、重试机制、负载均衡等。Spring Cloud Gateway提供了丰富的配置选项,以满足不同场景下的需求。

您可以通过查阅官方文档或者参考示例代码来了解更多的配置选项。

4.5 高级配置

对于更复杂的配置需求,您可以创建多个配置类,并使用 @Primary 注解来指定主要的路由规则配置。您还可以使用外部配置文件(如 application.ymlapplication.properties)来配置网关的行为。

4.6 验证配置

完成配置后,重新启动您的Spring Boot应用程序,并使用定义的路由规则来测试Spring Cloud Gateway是否按预期工作。


5. 路由配置

在Spring Cloud Gateway中,路由配置是非常重要的,它定义了如何将传入的请求映射到相应的目标服务。在本节中,我们将详细介绍如何进行路由配置。

5.1 基本路由配置

您可以使用 RouteLocatorBuilder 来定义路由规则。最简单的路由规则是将请求的路径映射到目标服务的URL。

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("example_route", r -> r.path("/example").uri("http://example.com")).build();
}

在上面的示例中,我们创建了一个名为 example_route 的路由规则,将请求路径 /example 映射到目标服务 http://example.com

5.2 路径匹配

除了精确匹配路径之外,Spring Cloud Gateway还支持通配符和Ant风格的路径模式。您可以使用 * 来匹配任意路径片段,** 来匹配任意路径。

.route("example_route", r -> r.path("/example/**").uri("http://example.com"))

在上面的示例中,我们使用 ** 来匹配 /example 路径下的任意子路径。

5.3 请求方法匹配

您还可以根据HTTP请求的方法来进行路由配置。例如,您可以将GET请求路由到一个目标服务,将POST请求路由到另一个目标服务。

.route("get_route", r -> r.method(HttpMethod.GET).uri("http://example.com/get"))
.route("post_route", r -> r.method(HttpMethod.POST).uri("http://example.com/post"))

5.4 请求参数匹配

除了路径和请求方法之外,您还可以根据请求的参数来进行路由配置。例如,您可以根据请求参数的值来将请求路由到不同的目标服务。

.route("param_route", r -> r.queryParam("param", "value").uri("http://example.com"))

在上面的示例中,我们将带有参数 param=value 的请求路由到 http://example.com 目标服务。

5.5 组合路由规则

Spring Cloud Gateway允许您组合多个路由规则,并对它们进行优先级排序。您可以使用 and()or() 方法来组合不同的条件。

.route("combined_route", r -> r.path("/example").and().method(HttpMethod.GET).uri("http://example.com"))

在上面的示例中,我们组合了路径和请求方法的条件,只有当请求路径为 /example 且请求方法为GET时,才会将请求路由到目标服务。

5.6 动态路由配置

除了静态配置外,Spring Cloud Gateway还支持动态路由配置。您可以将路由规则配置存储在外部配置中心(如Spring Cloud Config)或数据库中,并在运行时动态加载和更新。

5.7 验证路由配置

完成路由配置后,重新启动您的Spring Boot应用程序,并使用定义的路由规则来测试Spring Cloud Gateway是否按预期工作。您可以使用curl或者Postman等工具发送各种类型的请求,并确保它们被正确地路由到相应的目标服务。


6. 过滤器配置

Spring Cloud Gateway的一个重要功能是允许您通过过滤器来处理传入和传出的请求。在本节中,我们将详细介绍如何配置和使用过滤器来实现各种功能,如身份验证、请求转发、日志记录等。

6.1 创建过滤器

要创建一个自定义过滤器,您需要实现 GatewayFilter 接口,并在其中编写过滤器的逻辑。下面是一个简单的例子,创建一个用于记录请求日志的过滤器:

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class LoggingFilter implements GatewayFilterFactory<Object> {@Overridepublic GatewayFilter apply(Object config) {return (exchange, chain) -> {// 执行前置过滤逻辑System.out.println("Request logged: " + exchange.getRequest().getURI());// 执行后置过滤逻辑return chain.filter(exchange);};}
}

在上面的示例中,我们实现了 GatewayFilterFactory 接口,并覆写了 apply() 方法来创建一个记录请求日志的过滤器。

6.2 注册过滤器

要使Spring Cloud Gateway识别和使用您的自定义过滤器,您需要将其注册为Spring Bean。您可以使用 @Component@Bean 注解来注册过滤器。

@Bean
public LoggingFilter loggingFilter() {return new LoggingFilter();
}

6.3 过滤器顺序

默认情况下,Spring Cloud Gateway会按照过滤器注册的顺序依次执行过滤器。您可以使用 @Order 注解来指定过滤器的执行顺序,数字越小,优先级越高。

import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;@Component
@Order(1)
public class FirstFilter implements GatewayFilterFactory<Object>, Ordered {// 过滤器逻辑...
}

6.4 过滤器链

Spring Cloud Gateway允许您创建一个过滤器链,将多个过滤器组合在一起,以便依次处理请求。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class GlobalLoggingFilter implements GlobalFilter {@Autowiredprivate LoggingFilter loggingFilter;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 执行前置全局过滤逻辑System.out.println("Global filter executed.");// 调用下一个过滤器return loggingFilter.filter(exchange, chain);}
}

在上面的示例中,我们创建了一个全局过滤器,并注入了前面定义的 LoggingFilter 过滤器。然后在过滤器链中依次执行全局过滤器和自定义过滤器。

6.5 内置过滤器

除了自定义过滤器外,Spring Cloud Gateway还提供了许多内置过滤器,用于处理常见的场景,如请求重试、负载均衡、熔断、限流等。您可以在配置文件中使用内置过滤器来实现这些功能。

spring:cloud:gateway:routes:- id: retry_routeuri: http://example.compredicates:- Path=/example/**filters:- Retry=3,5,500

在上面的示例中,我们使用 Retry 过滤器来定义一个重试策略,最多重试3次,重试间隔为5秒,重试状态码为500。

6.6 验证过滤器配置

完成过滤器配置后,重新启动您的Spring Boot应用程序,并使用定义的过滤器来测试Spring Cloud Gateway是否按预期工作。您可以使用curl或者Postman等工具发送请求,并观察过滤器的输出以及请求的处理结果。


7. 启动网关服务

在完成了Spring Cloud Gateway的配置后,现在是时候启动网关服务并开始处理请求了。在本节中,我们将详细介绍如何启动Spring Boot应用程序以运行我们的网关服务。

7.1 启动应用程序

要启动Spring Boot应用程序,您只需在命令行中进入项目根目录,并执行以下命令:

./mvnw spring-boot:run

或者如果您使用的是Gradle:

./gradlew bootRun

这将启动应用程序,并开始监听默认端口(通常为8080)以接收传入的HTTP请求。

7.2 确认服务启动

当应用程序启动后,您应该能够在控制台看到类似以下的输出:

2024-05-15 14:30:15.572  INFO 12345 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2024-05-15 14:30:15.579  INFO 12345 --- [           main] c.e.s.SpringCloudGatewayApplication      : Started SpringCloudGatewayApplication in 3.212 seconds (JVM running for 3.559)

这表示应用程序已成功启动,并且Tomcat服务器正在监听8080端口。

7.3 访问网关服务

现在,您可以使用curl、Postman或您喜欢的任何HTTP客户端来发送请求,并验证Spring Cloud Gateway是否按预期工作。您可以将请求发送到网关服务的默认端口(通常为8080),并观察请求是否被正确地路由到相应的目标服务。

例如,如果您的路由配置将 /example 路径映射到了 http://example.com 目标服务,您可以通过访问 http://localhost:8080/example 来验证是否成功路由。

7.4 监控应用程序

除了验证请求路由之外,您还可以使用Actuator端点来监控和管理应用程序的运行状况。Spring Boot Actuator提供了许多内置的端点,用于查看应用程序的各种指标和状态。

您可以通过访问 http://localhost:8080/actuator 来查看所有可用的Actuator端点,并根据需要进行配置和使用。

7.5 管理应用程序

最后但同样重要的是,您可以使用Spring Boot Admin等管理工具来监控和管理您的应用程序。Spring Boot Admin提供了一个用户友好的Web界面,可以方便地查看和管理多个Spring Boot应用程序的状态和指标。

您可以通过在项目中集成Spring Boot Admin客户端,并在Spring Boot Admin服务器上注册您的应用程序来开始使用它。

7.6 日志记录和错误处理

在运行时,确保在控制台或日志文件中监控应用程序的日志输出。如果应用程序遇到任何错误或异常,及时处理并修复问题。


8. 测试网关服务

在构建和配置Spring Cloud Gateway后,测试是确保网关服务按预期工作的关键步骤之一。在本节中,我们将介绍如何使用curl和Postman等工具来测试网关服务,并验证其功能是否正确。

8.1 使用curl测试

curl是一个强大的命令行工具,用于发送各种类型的HTTP请求。您可以使用curl来模拟不同类型的请求,并验证网关服务的行为。

GET 请求
curl http://localhost:8080/example
POST 请求
curl -X POST http://localhost:8080/example -d "data=example"
携带请求头
curl -H "Content-Type: application/json" http://localhost:8080/example
携带请求参数
curl http://localhost:8080/example?param=value
其他HTTP方法

您可以使用 -X 参数来指定其他的HTTP方法,如PUT、DELETE等。

8.2 使用Postman测试

Postman是一个功能强大的图形化HTTP客户端,可以让您更轻松地创建和发送各种类型的HTTP请求,并查看请求和响应的详细信息。

发送GET请求

在Postman中创建一个新的请求,选择HTTP方法为GET,并指定URL为 http://localhost:8080/example,然后点击“发送”按钮来发送请求。

发送POST请求

在Postman中创建一个新的请求,选择HTTP方法为POST,并指定URL为 http://localhost:8080/example,然后在“Body”选项中输入请求体数据,并点击“发送”按钮来发送请求。

设置请求头和参数

在Postman中,您可以轻松地设置请求头和参数,并发送带有自定义头部和参数的请求。

8.3 验证响应

无论是使用curl还是Postman发送请求,都要确保正确地接收到了来自网关服务的响应,并且响应的内容和状态码符合预期。

8.4 监控日志

在进行测试时,还要密切关注网关服务的日志输出。通过查看日志,可以了解请求是如何被路由和处理的,并及时发现和解决潜在的问题。

8.5 测试不同场景

确保测试网关服务的不同路由规则和过滤器配置,以确保它们在各种场景下都能正确地工作。


结语

Spring Cloud Gateway是一个基于Spring Boot的API网关服务,它提供了一种简单而有效的方式来管理微服务架构中的通信。作为微服务架构的重要组成部分,网关服务扮演着连接客户端和微服务的关键角色。通过Spring Cloud Gateway,开发人员可以轻松地实现请求路由、过滤、负载均衡、熔断、重试等功能,从而提高了系统的性能、安全性和可维护性。Spring Cloud Gateway的灵活性和可扩展性使得它成为了许多企业和开发团队首选的微服务网关解决方案。随着微服务架构的不断发展和普及,Spring Cloud Gateway将继续扮演着重要的角色,为微服务架构的成功实施提供支持和保障。

相关文章:

探索 Spring Cloud Gateway:构建微服务架构的关键一环

1. 简介 在当今的分布式系统中&#xff0c;微服务架构已经成为了一种流行的架构模式。在微服务架构中&#xff0c;服务被拆分为小型、可独立部署的服务单元&#xff0c;这些服务单元能够通过网络互相通信&#xff0c;形成一个整体的应用系统。然而&#xff0c;随着微服务数量的…...

P1114 “非常男女”计划最优解

原题地址 P1114 “非常男女”计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码题解 AC代码&#xff08;1&#xff09; 因为用的是级的算法&#xff0c;所以最后一个 了&#xff0c;这里使用特判来得到的&#xff0c;给你们放一下代码&#xff1a; #include <bi…...

C++ | Leetcode C++题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; class Solution {const int L 10;unordered_map<char, int> bin {{A, 0}, {C, 1}, {G, 2}, {T, 3}}; public:vector<string> findRepeatedDnaSequences(string s) {vector<string> ans;int n s.length();if (n < L…...

构建、标记和发布镜像

构建、标记和发布镜像 目录 构建镜像标记镜像发布镜像实践 设置构建镜像推送镜像 在本指南中&#xff0c;您将学习以下内容&#xff1a; 构建镜像&#xff1a;基于Dockerfile构建镜像的过程。标记镜像&#xff1a;为镜像命名的过程&#xff0c;这也决定了镜像的分发位置。发…...

[Go Web] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施&#xff0c;不限定于某种注册中心&#xff0c;或数据库ORM等&#xff0c;所以您可以十分轻松地将任意库集成进项目里&#xff0c;与Kratos共同运作。 API -&…...

首个实时 AI 视频生成技术发布;科大讯飞发布星火大模型 4.0 丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…...

什么是容器镜像

什么是容器镜像&#xff1f; 1. 容器镜像的两个重要原则 容器镜像是容器化应用程序的基础&#xff0c;它包含了运行应用程序所需的一切——代码、运行时、库和依赖项。理解容器镜像的两个重要原则非常重要&#xff1a; 不可变性&#xff1a;容器镜像一旦构建&#xff0c;就不…...

ElasticSearch-Windows系统ElasticSearch(ES)的下载及安装

前言 下载ElasticSearch 可以进入ElasticSearch官方下载地址&#xff0c;选择与电脑系统相对应的版本&#xff1b;博主已经上传资源&#xff0c;或者点此直接免费下载&#xff0c;本次演示版本为8.14.1。 注意&#xff1a; Elasticsearch 5 需要 Java 8 以上版本&#xff1b;…...

【应用开发二】GPIO操控(输出、输入、中断)

1 操控GPIO方式 控制目录&#xff1a;/sys/class/gpio /sys/class/gpio目录下文件如下图所示&#xff1a; 1.1 gpiochipX目录 功能&#xff1a;当前SoC所包含的所有GPIO控制器 i.mx6ull一共包含5个GPIO控制器&#xff0c;分别为GPIO1~5分别对应gpiochip0、gpiochip32、gpi…...

单点登录方法

一、父域cookie:两个有相同父域名的二级域名之间可以跨域传递cookie //注意该接口的地址也是baidu.com下属的二级域名:a.baidu.com //全部接口地址为:a.baidu.com/dev-api/system/ecdWeb/login。如果不是a.baidu.com那么根本带不过去 //其实可以理解为通过该方法将cookie传给…...

springboot集成JPA并配置hikariCP连接池问题解决

一、引入需要的依赖 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/></parent> jpa依赖 <!--…...

vue2的双向绑定

vue是一个mvvm框架&#xff0c;即数据双向绑定&#xff0c;即当数据发生变化的时候&#xff0c;视图也就发生变化&#xff0c;当视图发生变化的时候&#xff0c;数据也会跟着同步变化。 Vue.js 2 中的双向绑定是通过 v-model 指令实现的。v-model 指令可以在表单输入元素上创建…...

Vue3 国际化i18n

国际化i18n方案 1. 什么是i18n2. i18n安装、配置及使用2.1 安装2.2 配置2.3 挂载到实例2.4 组件中使用2.5 语言切换 1. 什么是i18n i18n 是“国际化”的简称。在资讯领域&#xff0c;国际化(i18n)指让产品&#xff08;出版物&#xff0c;软件&#xff0c;硬件等&#xff09;无…...

算法金 | 使用随机森林获取特征重要性

大侠幸会幸会&#xff0c;我是日更万日 算法金&#xff1b;0 基础跨行转算法&#xff0c;国内外多个算法比赛 Top&#xff1b;放弃 BAT Offer&#xff0c;成功上岸 AI 研究院 Leader&#xff1b; <随机森林及其应用领域> 随机森林是一种强大的机器学习算法&#xff0c;其…...

网络安全的重要性

网络安全的重要性 网络安全是指保护网络系统免受未授权的访问、攻击、破坏或未经授权的数据泄露的能力。随着互联网的普及和数字化进程的加速&#xff0c;网络安全问题日益凸显&#xff0c;成为个人、企业和国家必须面对的重要挑战。 网络安全的威胁 网络安全威胁包括黑客攻…...

Leetcode40 无重复组合之和

题目描述&#xff1a; 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 思路分析 这个题是…...

详解MATLAB中处理日期和时间的函数

在MATLAB中处理日期和时间时&#xff0c;可以使用多种函数来进行计时和时间差计算。以下是对一些常用函数的详细解释&#xff1a; 1. tic 和 toc 用途&#xff1a;用来测量一段代码执行的时间。用法&#xff1a;tic; % 启动秒表 % 你的代码 elapsedTime toc; % 停止秒表&…...

Java养老护理助浴陪诊小程序APP源码

&#x1f496;护理助浴陪诊小程序&#x1f496; 一、引言&#xff1a;养老新趋势&#x1f331; 在快节奏的现代生活中&#xff0c;养老问题逐渐成为了社会关注的焦点。如何为老年人提供便捷、贴心的服务&#xff0c;让他们晚年生活更加安心、舒适&#xff0c;是我们每个人都需…...

go的singleFlight学习

Package singleflight provides a duplicate function call suppression mechanism “golang.org/x/sync/singleflight” 原来底层是 waitGroup&#xff0c;我还以为等待的协程主动让出 cpu 了&#xff0c;没想到 waitGroup.Wait() 阻塞了 doCall 不但返回值是 func 的 val 和…...

高电压技术-冲击高压发生器MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 冲击电压发生器是产生冲击电压波的装置&#xff0c;用于检验电力设备耐受大气过电压和操作过电压的绝缘性能&#xff0c;冲击电压发生器能产生标准雷电冲击电压波形&#xff0c;雷电冲击电压截波,标准操作冲击…...

【STM32】SysTick系统滴答定时器

1.SysTick简介 CM4内核的处理和CM3一样&#xff0c;内部都包含了一个SysTick定时器&#xff0c;SysTick 是一个24 位的倒计数定时器&#xff0c;当计到0 时 &#xff0c;将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除&#xf…...

编码遵循五大设计原则创建出更加健壮、可维护和可扩展的软件系统

一、单一职责原则&#xff08;SRP&#xff09; * 定义&#xff1a;一个类应该只有一个引起它变化的原因。 * 解释&#xff1a;意味着一个类应该专注于做一件事情&#xff0c;当需求发生变化时&#xff0c;只影响到一个类。这有助于降低类间的耦合&#xff0c;使得代码更易于理…...

记录一个问题

问题描述 如果一个物料既在A总成零件号下计算为托盘库&#xff0c;在B总成零件号下计算为箱库&#xff0c;则放于箱库。 A中选择排名第21的递补进托盘库。&#xff08;也需要判断递补的是否在其他总成零件中为箱库&#xff0c;是的话继续递补判断&#xff09; 解决思路 为了…...

ONLYOFFICE 8.1版本桌面编辑器测评:重塑办公效率的巅峰之作

在数字化办公日益普及的今天&#xff0c;一款高效、便捷且功能强大的桌面编辑器成为了职场人士不可或缺的工具。ONLYOFFICE 8.1版本桌面编辑器凭借其卓越的性能和丰富的功能&#xff0c;成功吸引了众多用户的目光。今天&#xff0c;我们将对ONLYOFFICE 8.1版本桌面编辑器进行全…...

【shell脚本速成】python安装脚本

文章目录 案例需求应用场景解决问题脚本思路案例代码 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xff0c;都沐…...

Redis报错:MISCONF Redis is configured to save RDB snapshots

错误提示内容&#xff1a; 2024-06-25 16:30:49 : Connection: Redis_Server > [runCommand] PING 2024-06-25 16:30:49 : Connection: Redis_Server > Response received : -MISCONF Redis is configured to save RDB snapshots, but it is currently not able to pers…...

关于使用绿联 USB-A转RJ45 2.5G网卡提速的解决问题

问题 网络下载速率低 网线是七类网线&#xff0c;外接的USB网卡驱动 我的自带网卡是 I219v 在嵌入了2.5G网络后一直无法到达1.5G以上。 平均测速300~500M 解决方案 更新了USB的网卡驱动 禁用了 I219-V的驱动。测速即可 USB驱动下载地址 https://download.csdn.net/downlo…...

Qt: QPushButton 按钮实现 上图标下文字

效果如下&#xff1a; 实现有如下几种方式&#xff1a; 1. 使用 QPushButton 设置 setStyleSheet 例&#xff1a; ui->recorder->setStyleSheet("QPushButton{"\"border: 1px solid #00d2ff; "\"min-height: 60px; "\"col…...

使用阿里云效API操作流水线

使用阿里云效&#xff08;Alibaba Cloud DevOps&#xff09;API操作流水线时&#xff0c;需要注意以下几个方面&#xff1a; 认证与授权 确保你已经获取了正确的访问凭证&#xff08;AccessKey ID 和 AccessKey Secret&#xff09;&#xff0c;并且这些凭证具有足够的权限来执行…...

使用命令行创建uniapp+TS项目,使用vscode编辑器

一:如果没有pnpm,先安装pnpm 二:使用npx工具和degit工具从 GitHub 上的 dcloudio/uni-preset-vue 仓库克隆一个名为 vite-ts 的分支,到项目中. 执行完上面命令后,去manifest.json添加appid(自己微信小程序的Id),也可不执行直接下一步,执行pnpm install ,再执行pnpm:dev:mp-weix…...

ABC355 Bingo2

分析&#xff1a; 找出其中一行或列或任意对角线被全部标记&#xff0c;即可输出回合数&#xff0c;否则输出-1 如果x%n0&#xff0c;行是x/n&#xff0c;列是n 如果x%n&#xff01;0&#xff0c;行是x/n1&#xff0c;列是x%n 如果行列或行列n1即为对角线。 标记行列对角线…...

Spring+Vue项目部署

目录 一、需要的资源 二、步骤 1.首先要拥有一个服务器 2.项目准备 vue&#xff1a; 打包: 3.服务器装环境 文件上传 设置application.yml覆盖 添加启动和停止脚本 ​编辑 安装jdk1.8 安装nginx 安装mysql 报错&#xff1a;「ERR」1273-Unknown collation: utf8m…...

【uml期末复习】统一建模语言大纲

前言&#xff1a; 关于uml的期末复习的常考知识点&#xff0c;可能对你们有帮助&#x1f609; 目录 第一部分 概念与基础 第一章 面向对象技术 第二章 统一软件过程 第三章 UML概述 第四章 用例图 第五章 类图 第六章 对象图 第七章 顺序图 第八章 协作图 第九章 状态…...

Linux高级IO

高级IO 1.五种IO模型1.1 阻塞IO1.2 非阻塞IO1.3 信号驱动IO1.4 多路复用/多路转接IO1.5 异步IO1.6 小结 2.高级IO重要概念3.非阻塞IO3.1 实现函数NoBlock3.2 轮询方式读取标准输入 4.I/O多路转接之select4.1 理解select执行过程4.2 select的特点4.3 select缺点4.4 实现 5.I/O多…...

go-admin-ui开源后台管理系统华为云部署

1.华为云开通8000与9527端口 2.编译 编译成功 3.发布到远程服务器 4.登陆华为云终端 5.安装Nginx 6.查看服务启动状态 7.添加网站 添加与修改配置www-data 改为 www 自定义日志输出格式 添加网站配置文件go_admin_ui.conf 添加如下内容: location 下的root指向网站文件夹 修…...

点云入门知识

点云的处理任务 场景语义分割 物体的三维表达方法&#xff08;3D representations&#xff09;&#xff1a; 点云&#xff1a;是由物体表面上许多点数据来表征这个物体。最接近原始传感器数据&#xff0c;且具有丰富的几何信息。 Mesh&#xff1a;用三角形面片和正方形面片拼…...

HTML静态网页成品作业(HTML+CSS+JS)——家乡莆田介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有5个页面。 二、作品…...

#### grpc比http性能高的原因 ####

grpc比http性能高的原因 二进制消息格式&#xff1a;gRPC使用Protobuf&#xff08;一种有效的二进制消息格式&#xff09;进行序列化&#xff0c;这种格式在服务器和客户端上的序列化速度非常快&#xff0c;且序列化后的消息体积小&#xff0c;适合带宽有限的场景。 HTTP/2协…...

微软Edge浏览器搜索引擎切换全攻略

微软Edge浏览器作为Windows 10的默认浏览器&#xff0c;提供了丰富的功能和良好的用户体验。其中&#xff0c;搜索引擎的切换功能允许用户根据个人喜好和需求&#xff0c;快速更换搜索引擎&#xff0c;从而获得更加个性化的搜索服务。本文将详细介绍如何在Edge浏览器中进行搜索…...

<Linux> 实现命名管道多进程任务派发

实现命名管道多进程任务派发 common文件 #ifndef _COMMON_H_ #define _COMMON_H_#pragma once #include <iostream> #include <unistd.h> #include <string> #include <sys/types.h> #include <sys/stat.h> #include <wait.h> #include &…...

BigInteger 和 BigDecimal(java)

文章目录 BigInteger(大整数&#xff09;常用构造方法常用方法 BigDecimal(大浮点数&#xff09;常用构造方法常用方法 DecimalFormat(数字格式化) BigInteger(大整数&#xff09; java.math.BigInteger。 父类&#xff1a;Number 常用构造方法 构造方法&#xff1a;BigIntege…...

Linux 进程间通讯

Linux IPC 方式 在Linux系统中&#xff0c;进程间通信&#xff08;IPC&#xff09;是多个运行中的程序或进程之间交换数据和信息的关键机制。Linux提供了多种IPC机制&#xff0c;每种机制都有其特定的用途和优势。以下是Linux上主要的IPC通信方式&#xff1a; 管道&#xff08…...

数据分析三剑客-Matplotlib

数据分析三剑客 数据分析三剑客通常指的是在Python数据分析领域中&#xff0c;三个非常重要的工具和库&#xff1a;Pandas、NumPy和Matplotlib。Pandas主要负责数据处理和分析&#xff0c;NumPy专注于数值计算和数学运算&#xff0c;而Matplotlib则负责数据可视化。这三个库相…...

FastAPI-Body、Field

参考&#xff1a;模式的额外信息 - 例子 - FastAPI 在FastAPI中&#xff0c;Body和Field是两个常用的注解&#xff0c;它们用于定义请求体中的数据或路径参数、查询参数等的处理方式。这两个注解都来自于Pydantic库&#xff0c;用于数据验证和解析&#xff0c;但它们的应用场景…...

软件设计师笔记-操作系统知识(二)

线程 以下是关于线程的一些关键点&#xff1a; 线程是进程中的一个实体&#xff1a;进程是操作系统分配资源&#xff08;如内存空间、文件句柄等&#xff09;的基本单位&#xff0c;而线程是进程中的一个执行单元。多个线程可以共享同一个进程的地址空间和其他资源。线程是CP…...

鸿蒙UI开发快速入门 —— part12: 渲染控制

如果你对鸿蒙开发感兴趣&#xff0c;加入Harmony自习室吧~&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 扫描下面的二维码关注公众号。 1、前言 在声明式描述语句中开发者除了使用系统组件外&#xff0c;还可…...

添加用户页面(Flask+前端+MySQL整合)

首先导入Flask库和pymysql库。Flask用于创建Web应用程序&#xff0c;pymysql用于连接和操作MySQL数据库。 from flask import Flask, render_template, request import pymysql创建一个Flask应用实例。__name__参数告诉Flask使用当前模块作为应用的名称。 app Flask(__name_…...

素数筛(算法篇)

算法之素数筛 素数筛 引言&#xff1a; 素数(质数)&#xff1a;除了1和自己本身之外&#xff0c;没有任何因子的数叫做素数(质数) 朴素筛法(优化版) 概念&#xff1a; 朴素筛法&#xff1a;是直接暴力枚举2到当前判断的数x(不包括)&#xff0c;然后看在这范围内是否存在因…...

迁移Microsoft Edge

如何将Microsoft Edge迁移到d盘&#xff1f;对于Microsoft Edge想必大部分人都不陌生&#xff0c;它是Windows操作系统的默认浏览器&#xff0c;存储用户的个人数据、缓存和设置等信息。有些时候&#xff0c;我们需要对Microsoft Edge中的数据进行数据迁移&#xff0c;以释放c盘…...

Maven高级理解属性

属性 在这一章节内容中&#xff0c;我们将学习两个内容&#xff0c;分别是 属性版本管理 属性中会继续解决分模块开发项目存在的问题&#xff0c;版本管理主要是认识下当前主流的版本定义方式。 4.1 属性 4.1.1 问题分析 讲解内容之前&#xff0c;我们还是先来分析问题: …...

Spring Boot中使用Thymeleaf进行页面渲染

Spring Boot中使用Thymeleaf进行页面渲染 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中使用Thymeleaf模板引擎进行页面…...

Maven列出所有的依赖树

在 IntelliJ IDEA 中&#xff0c;你可以使用 Maven 插件来列出项目的依赖树。Maven 插件提供了一个名为dependency:tree的目标&#xff0c;可以帮助你获取项目的依赖树详细信息。 要列出项目的依赖树&#xff0c;可以执行以下步骤&#xff1a; 打开 IntelliJ IDEA&#xff0c;…...

【乐吾乐2D可视化组态编辑器】文件

1 文件 文件&#xff1a;文件的新建、打开、导入、保存、另存为、下载JOSN文件、下载ZIP打包文件、导出为HTML、导出为Vue2组件、导出为Vue3组件、导出为React组件&#xff08;老版将不再维护&#xff09;、下载为PNG、下载为SVG 乐吾乐2D可视化组态编辑器demo&#xff1a;ht…...

界面控件Telerik UI for Winforms 2024 Q2新版亮点 - 发布全新的AI相关组件

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件&#xff0c;所有的UI for WinForms控件都具有完整的主题支持&#xff0c;可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 本文将介绍界面组件Telerik UI for Winform…...

归并排序——有序序列的合并

目录 1、简述 2、复杂度 3、稳定性 4、例子 1、简述 有序序列的合并&#xff08;Merge of Sorted Sequences&#xff09;是归并排序的核心步骤之一。其目的是将两个已经排序的序列合并成一个新的有序序列。这个过程在归并排序中非常重要&#xff0c;因为归并排序通过递归地…...

ubuntu20.04安装kazam桌面屏幕录制工具

在Ubuntu 20.04上安装Kazam可以通过以下步骤进行&#xff1a; 1.打开终端&#xff1a;可以通过按下Ctrl Alt T组合键来打开终端。 2.添加PPA源&#xff1a;Kazam不再在官方Ubuntu仓库中&#xff0c;但可以通过PPA源进行安装。在终端中输入以下命令来添加PPA&#xff1a; su…...

越级大五座SUV全新一代别克昂科威Plus上市

上汽通用汽车别克品牌宣布,越级大五座SUVmdash;mdash;全新一代别克昂科威Plus正式上市,共推出3款车型,售价22.99万元-25.99万元。全新一代昂科威Plus践行油电同智理念,在带来行业智能化体验的同时,更不止于智能,实现在设计、舒适、安全、品质等全维度129项产品力迭代升级…...

【网络安全】新的恶意软件:无文件恶意软件GhostHook正在广泛传播

文章目录 推荐阅读 一种新的恶意软件 GhostHook v1.0 正在一个网络犯罪论坛上迅速传播。这种创新的无文件浏览器恶意软件由 Native-One 黑客组织开发&#xff0c;具有独特的分发方式和多功能性&#xff0c;对各种平台和浏览器构成重大威胁。 GhostHook v1.0 支持 Windows、Andr…...

【408真题】2009-24

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…...

【算法实战】每日一题:设计一个算法,用最少数量的矩形覆盖一系列宽度为d、高度为w的矩形,且使用矩形不能超出边界

题目 设计一个算法&#xff0c;用最少数量的矩形覆盖一系列宽度为d、高度为w的矩形建筑物侧墙&#xff0c;且矩形不能超出边界。 核心思路 考虑这种结构 前面递增后面一个与前面的某个高度一致&#xff0c;这时候考虑最下面的覆盖&#xff08;即都是从最下面向上覆盖&#…...

大字体学生出勤记录系统网页HTML源码

源码介绍 上课需要一个个点名记录出勤情况&#xff0c;就借助AI制作了一个网页版学生出勤记录系统&#xff0c; 大字体显示学生姓名和照片&#xff0c;让坐在最后排学生也能看清楚&#xff0c;显示姓名同时会语音播报姓名&#xff0c; 操作很简单&#xff0c;先导入学生姓名…...

Ubuntu系统Discover软件中心简介

Discover软件中心是Ubuntu操作系统中默认的软件管理工具&#xff0c;它提供了一个图形用户界面(GUI)来帮助用户浏览、搜索、安装和卸载软件包。Discover软件中心是Ubuntu软件中心(Ubuntu Software Center)的继承者&#xff0c;它在Ubuntu 16.04 LTS版本中首次被引入&#xff0c…...