【云原生】Spring Cloud Gateway的底层原理与实践方法探究

news/2024/5/20 17:38:03/文章来源:https://blog.csdn.net/m0_72803988/article/details/136300792

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:从入门到入魔》 🚀

本专栏带你从Spring入门到入魔!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/

目录

引言

介绍API网关和其在云原生应用中的重要性

        概述Spring Cloud Gateway作为API网关的特点和优势

Spring Cloud Gateway简介:

网关路由器(Gateway Router)

过滤器(Filters)

负载均衡器(Load Balancer)

Spring Cloud Gateway的底层原理

Reactor模式

网络I/O模型

动态路由

实践方法:使用Spring Cloud Gateway构建API网关

创建Spring Cloud Gateway项目的步骤和依赖配置:

实现基本的路由配置和请求转发:

应用过滤器实现请求鉴权和日志记录:

配置负载均衡器以实现服务的负载均衡:

性能调优和扩展

1. 缓存机制

在上述示例中,@Cacheable注解指定了缓存的名称为"myCache",并以param作为缓存的键。如果相同的param参数被重复调用,将直接从缓存中获取数据,而不是访问后端服务。

2. 熔断器

3. 高可用部署


  1. 引言

    • 介绍API网关和其在云原生应用中的重要性

      在云原生应用中,API网关是一个关键的组件,用于提供统一的入口点和访问控制,以便对后端微服务进行路由、负载均衡、安全认证等操作。API网关充当了客户端和后端服务之间的门户,简化了客户端与服务之间的通信,并提供了一些重要的功能和特性,如请求转发、认证授权、监控和限流等。

        概述Spring Cloud Gateway作为API网关的特点和优势

Spring Cloud Gateway是Spring Cloud生态系统中的一个API网关组件,它基于Spring Framework 5、Spring Boot 2和Reactor等技术栈构建而成。Spring Cloud Gateway具有以下特点和优势:

  1. 基于非阻塞式编程模型:Spring Cloud Gateway使用了基于响应式编程的Reactor库,使得它可以处理大量并发请求而不阻塞线程,提高了性能和吞吐量。

  2. 动态路由:Spring Cloud Gateway支持动态路由配置,可以根据请求的路径、参数、标头等信息来动态地将请求路由到不同的后端服务。

  3. 过滤器链:Spring Cloud Gateway采用过滤器链的方式,可以在请求进入网关和响应离开网关时应用各种过滤器,如认证、鉴权、请求转换、限流等。

  4. 集成性:Spring Cloud Gateway与Spring Cloud生态系统中的其他组件无缝集成,如服务发现与注册(Eureka、Consul)、负载均衡(Ribbon)、断路器(Hystrix)等。

  5. 可插拔的架构:Spring Cloud Gateway的架构设计可插拔,可以根据需求扩展和定制各种功能和组件,使其更加灵活和可扩展。

Spring Cloud Gateway简介:

Spring Cloud Gateway是一个基于Spring Framework 5和Spring Boot 2的API网关组件,它提供了一种简单而强大的方式来管理和路由微服务的请求。Spring Cloud Gateway的核心概念包括路由(Route)、断言(Predicate)和过滤器(Filter)。

  1. 路由(Route):路由定义了请求的目标地址和规则,包括目标URL、请求谓词(如GET、POST)、请求头、请求参数等。通过配置多个路由规则,可以将请求转发到不同的后端服务。

  2. 断言(Predicate):断言用于匹配请求的条件,只有满足条件的请求才会被路由到相应的后端服务。断言可以基于请求的路径、参数、标头等信息进行匹配。

  3. 过滤器(Filter):过滤器用于在请求进入网关和响应离开网关时进行处理,如认证、鉴权、请求转换、限流等。Spring Cloud Gateway提供了一系列内置的过滤器,同时也支持自定义过滤器。

Spring Cloud Gateway与传统的反向代理服务器的区别:

传统的反向代理服务器(如Nginx、Apache HTTP Server)通常是基于阻塞I/O模型实现的,每个请求都会占用一个线程,从而限制了系统的并发能力。而Spring Cloud Gateway采用了基于响应式编程的非阻塞I/O模型,可以处理大量并发请求而不阻塞线程,提高了性能和吞吐量。

另外,Spring Cloud Gateway具有动态路由和过滤器链的特性,可以根据请求的各种属性进行动态路由和处理。这使得Spring Cloud Gateway更加灵活和可扩展,可以根据需求进行定制化开发,满足不同场景下的需求。与传统的反向代理服务器相比,Spring Cloud Gateway在功能和性能上都具有更大的优势。

网关路由器(Gateway Router)

网关路由器是Spring Cloud Gateway的核心组件之一,它负责将客户端的请求路由到相应的后端服务。网关路由器基于配置信息来进行路由规则的匹配和转发。我们可以通过配置文件(如application.yml)或编程方式来定义路由规则。

以下是一个简单的示例代码,演示如何通过配置文件定义路由规则:

spring:cloud:gateway:routes:- id: my_routeuri: http://example.compredicates:- Path=/api/**

上述代码中,我们定义了一个名为my_route的路由规则,将匹配路径为/api/**的请求转发到http://example.com

过滤器(Filters)

过滤器是Spring Cloud Gateway的另一个核心组件,它提供了一种灵活的机制来处理请求和响应。过滤器可以用于修改请求或响应的内容、添加头信息、进行安全验证等操作。Spring Cloud Gateway内置了许多常用的过滤器,同时也支持自定义过滤器。

以下是一个示例代码,展示了如何使用过滤器进行请求转发前的预处理:

@Component
public class CustomFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在请求转发前进行预处理// 可以修改请求信息、添加头信息等操作ServerHttpRequest modifiedRequest = exchange.getRequest().mutate().header("X-Custom-Header", "Custom Value").build();ServerWebExchange modifiedExchange = exchange.mutate().request(modifiedRequest).build();return chain.filter(modifiedExchange);}
}

 上述代码中,我们定义了一个自定义的过滤器CustomFilter,在filter方法中可以进行请求的修改和处理。在这个示例中,我们添加了一个自定义的头信息X-Custom-Header

负载均衡器(Load Balancer)

负载均衡器是Spring Cloud Gateway的另一个重要组件,它用于在后端服务之间分发请求,实现负载均衡的功能。Spring Cloud Gateway通过集成Spring Cloud LoadBalancer来实现负载均衡的机制。

以下是一个示例代码,展示了如何配置负载均衡器:

@Configuration
public class LoadBalancerConfiguration {@Beanpublic LoadBalancerClient loadBalancerClient() {return LoadBalancerClientFactory.getDefaultClient();}
}

上述代码中,我们通过LoadBalancerClientFactory.getDefaultClient()方法获取了默认的负载均衡器客户端。

Spring Cloud Gateway的底层原理

Reactor模式

Spring Cloud Gateway使用了Reactor模式来实现异步和非阻塞的处理。Reactor模式基于事件驱动和回调机制,通过使用Flux和Mono这两个反应式类型,实现了高效的请求处理和响应。

网络I/O模型

Spring Cloud Gateway支持多种网络I/O模型,如阻塞I/O、非阻塞I/O和异步I/O。它可以根据具体的需求选择适合的网络I/O模型。在性能优化方面,Spring Cloud Gateway使用了Netty作为底层服务器,以实现高性能的网络通信。

动态路由

Spring Cloud Gateway支持动态路由,它允许在运行时动态添加、修改和删除路由规则。这使得我们可以根据需求动态调整网关的路由策略,而无需重启应用程序。

动态路由的实现原理是通过与服务注册中心(如Eureka、Consul等)集成,监听服务的注册和注销事件,然后根据这些事件动态更新路由规则。这样,当有新的服务注册或注销时,Spring Cloud Gateway可以相应地调整路由规则,以确保请求能够正确地路由到新的服务实例。

以下是一个示例代码,展示了如何通过服务注册中心实现动态路由:

@Configuration
public class DynamicRoutingConfiguration {@Autowiredprivate DiscoveryClient discoveryClient;@Beanpublic RouteDefinitionLocator routeDefinitionLocator() {return new DiscoveryClientRouteDefinitionLocator(discoveryClient);}
}

上述代码中,我们通过DiscoveryClientRouteDefinitionLocator从服务注册中心获取路由定义,实现了动态路由的功能。

 

实践方法:使用Spring Cloud Gateway构建API网关

下面将使用一个具体的项目示例来说明如何使用Spring Cloud Gateway构建API网关。

创建Spring Cloud Gateway项目的步骤和依赖配置:

首先,创建一个Spring Boot项目,并添加必要的依赖。

步骤:

  • 使用Spring Initializr创建一个新的Spring Boot项目。
  • 在项目的pom.xml文件中添加以下依赖:

<dependencies><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 其他依赖... -->
</dependencies>
实现基本的路由配置和请求转发:

在Spring Cloud Gateway项目中,可以通过配置文件或编程方式进行路由配置和请求转发。

  • 配置文件方式:在项目的配置文件(如application.yml)中进行路由配置。
# application.yml
spring:cloud:gateway:routes:- id: route1uri: http://localhost:8081  # 转发到后端服务的地址predicates:- Path=/api/service1/**  # 匹配请求路径的条件- id: route2uri: http://localhost:8082predicates:- Path=/api/service2/**
  • 编程方式:编写配置类来进行路由配置。
@Configuration
public class GatewayConfiguration {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("route1", r -> r.path("/api/service1/**").uri("http://localhost:8081")).route("route2", r -> r.path("/api/service2/**").uri("http://localhost:8082")).build();}
}
应用过滤器实现请求鉴权和日志记录:

Spring Cloud Gateway的过滤器功能可以用于实现请求鉴权、日志记录等需求。

  • 创建一个过滤器来实现请求鉴权:
@Component
public class AuthFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 实现请求鉴权逻辑// 如果鉴权失败,可以返回错误响应或重定向到登录页面// 鉴权通过,继续执行后续的过滤器和路由处理return chain.filter(exchange);}
}
  • 创建一个过滤器来实现日志记录:
@Component
public class LoggingFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 实现日志记录逻辑// 可以记录请求的路径、方法、参数等信息// 继续执行后续的过滤器和路由处理return chain.filter(exchange);}
}
配置负载均衡器以实现服务的负载均衡:

Spring Cloud Gateway可以与负载均衡组件(如Ribbon)结合使用,实现对后端服务的负载均衡。

  • 配置Ribbon负载均衡器:
@Configuration
public class RibbonConfiguration {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
  • 在路由配置中使用负载均衡器:
@Configuration
public class GatewayConfiguration {@Autowiredprivate RestTemplate restTemplate;@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("route1", r -> r.path("/api/service1/**").uri("lb://service1"))  // 使用负载均衡器,实现对service1服务的负载均衡.route("route2", r -> r.path("/api/service2/**").uri("lb://service2")).build();}
}

以上项目使用Spring Cloud Gateway构建API网关的基本步骤和配置。

性能调优和扩展

1. 缓存机制

缓存机制是提高性能的有效手段之一。在Spring Cloud Gateway中,你可以使用缓存来减少对后端服务的请求次数。以下是使用缓存的基本步骤:

  • 引入所需的依赖项:在pom.xml文件中添加以下依赖项,以支持缓存功能。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
  • 配置缓存管理器:在配置类中添加@EnableCaching注解,启用缓存功能,并配置缓存管理器。
@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager() {return new ConcurrentMapCacheManager("myCache");}
}

在上述示例中,我们使用ConcurrentMapCacheManager作为缓存管理器,并创建了一个名为"myCache"的缓存。

  • 使用缓存注解:在需要缓存的方法上添加@Cacheable注解,指定缓存的名称和缓存的键。
@RestController
public class MyController {@GetMapping("/data")@Cacheable(cacheNames = "myCache", key = "#param")public String getData(@RequestParam String param) {// 从后端服务获取数据的逻辑return data;}
}
在上述示例中,@Cacheable注解指定了缓存的名称为"myCache",并以param作为缓存的键。如果相同的param参数被重复调用,将直接从缓存中获取数据,而不是访问后端服务。

2. 熔断器

熔断器是一种用于提高系统稳定性的机制,当后端服务出现故障或超时时,可以快速失败并返回预设的错误响应,避免系统崩溃。在Spring Cloud Gateway中,你可以使用Hystrix来实现熔断器的功能。以下是使用熔断器的基本步骤:

  • 引入所需的依赖项:在pom.xml文件中添加以下依赖项,以支持Hystrix和熔断器功能。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 使用熔断器注解:在需要使用熔断器的方法上添加@HystrixCommand注解,指定熔断器的配置和处理逻辑。
@RestController
public class MyController {@GetMapping("/data")@HystrixCommand(fallbackMethod = "fallback")public String getData() {// 调用后端服务获取数据的逻辑return data;}public String fallback() {return "Fallback response";}
}

在上述示例中,@HystrixCommand注解指定了熔断器的回退方法为fallback()。当调用后端服务的逻辑出现故障时,将执行回退方法并返回预设的响应。

3. 高可用部署

将Spring Cloud Gateway部署为高可用的架构是确保系统可靠性和容错性的重要措施。以下是探讨将Spring Cloud Gateway部署为高可用架构的一些建议:

  • 使用负载均衡:使用负载均衡器将请求分发到多个Spring Cloud Gateway实例。可以使用诸如Nginx、HAProxy等负载均衡工具来实现。这样可以提高系统的吞吐量和可扩展性。
     

    • 首先,你需要安装和配置一个负载均衡器,比如Nginx或HAProxy。这里以Nginx为例。

    • 编辑Nginx配置文件,将请求分发到多个Spring Cloud Gateway实例。以下是一个简单的Nginx配置示例:

      http {upstream gateway {server gateway1.example.com:8080;server gateway2.example.com:8080;server gateway3.example.com:8080;}server {listen 80;server_name mydomain.com;location / {proxy_pass http://gateway;}}
      }

  • 高可用的注册中心:确保注册中心(如Eureka、Consul等)也是高可用的部署。这样可以保证Spring Cloud Gateway实例能够及时注册和发现服务。
     

    • 首先,你需要搭建一个高可用的注册中心,比如Eureka或Consul。这里以Eureka为例。

    • 在Spring Cloud Gateway项目的配置文件中,配置Eureka注册中心的地址和其他相关配置。以下是一个简单的配置示例:

      spring.application.name=gateway-service
      server.port=8080eureka.client.serviceUrl.defaultZone=http://eureka1.example.com:8761/eureka,http://eureka2.example.com:8761/eureka
      eureka.instance.prefer-ip-address=true

  • 异地多活部署:在不同的地理位置部署多个Spring Cloud Gateway实例,以提高系统的容灾能力。这样即使某个地区的实例发生故障,其他地区的实例仍然可以正常提供服务。
     

    • 在不同的地理位置部署多个Spring Cloud Gateway实例。

    • 配置每个实例的注册中心地址和其他相关配置。以下是一个简单的配置示例:

      spring.application.name=gateway-service
      server.port=8080eureka.client.serviceUrl.defaultZone=http://eureka1.example.com:8761/eureka,http://eureka2.example.com:8761/eureka
      eureka.instance.prefer-ip-address=true

  • 监控和日志:使用监控和日志工具来实时监测和记录Spring Cloud Gateway的运行状态和日志。这样可以及时发现和解决潜在的问题,提高系统的稳定性和可维护性。

    • 使用Spring Boot Actuator模块提供的监控和管理功能。在Spring Cloud Gateway项目的配置文件中,配置Actuator端点的相关配置。以下是一个简单的配置示例:
      management.endpoints.web.exposure.include=*
      management.endpoint.health.show-details=always

      在上述示例中,management.endpoints.web.exposure.include配置了暴露所有的Actuator端点,management.endpoint.health.show-details配置了健康检查端点显示详细信息。

    • 配置日志框架,如Logback或Log4j,以记录Spring Cloud Gateway的运行状态和日志。以下是一个简单的Logback配置示例:
      <configuration><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><logger name="org.springframework.cloud.gateway" level="INFO" additivity="false"><appender-ref ref="console" /></logger><root level="INFO"><appender-ref ref="console" /></root>
      </configuration>

      配置了一个名为"console"的控制台输出日志的appender,并将Spring Cloud Gateway的日志级别设置为INFO。

  • 异常处理和降级策略:定义合适的异常处理和降级策略,当后端服务出现故障或网络问题时,能够快速失败或返回预设的响应,避免系统崩溃。
     

    在Spring Cloud Gateway中,你可以通过定义全局过滤器或针对特定路由的过滤器来实现异常处理和降级策略。以下是一个简单的示例:

    • 创建一个全局异常处理器的过滤器类:
      import org.springframework.cloud.gateway.filter.GatewayFilterChain;
      import org.springframework.cloud.gateway.filter.GlobalFilter;
      import org.springframework.core.Ordered;
      import org.springframework.http.HttpStatus;
      import org.springframework.web.server.ServerWebExchange;
      import reactor.core.publisher.Mono;public class ExceptionHandlingFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return chain.filter(exchange).onErrorResume(throwable -> {exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);return exchange.getResponse().setComplete();});}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
      }

      在上述示例中,ExceptionHandlingFilter是一个实现了GlobalFilter接口的全局过滤器。它会捕获所有的异常并将响应的状态码设置为500。

    • 在Spring Cloud Gateway的配置类中注册该过滤器:
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;@Configuration
      public class GatewayConfig {@Beanpublic ExceptionHandlingFilter exceptionHandlingFilter() {return new ExceptionHandlingFilter();}
      }

      GatewayConfig是一个Spring配置类,通过@Bean注解将ExceptionHandlingFilter注册为一个Bean。

 

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

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

相关文章

Base64 编码 lua

Base64 编码 -- Base64 字符表 local base64_chars { A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,…

Qt_纯虚函数的信号和槽

简介 在C中&#xff0c;纯虚函数是一个在基类中声明但没有实现的虚函数。纯虚函数的声明以 “ 0” 结尾。纯虚函数的目的是为了提供一个接口&#xff0c;但是不提供实现。派生类必须实现纯虚函数&#xff0c;否则它也会成为一个抽象类。纯虚函数可以在基类中定义&#xff0c;也…

leetcode hot100单词拆分

在本题中&#xff0c;我们是要把一个字符串&#xff0c;判断是否能用给的字符串数组中的单词进行拆分&#xff0c;如果可以则返回true&#xff0c;不能的话则返回false。这个题一开始看无法与背包问题联系在一起。但仔细考虑&#xff0c;就是用物品&#xff08;给的字符串数组中…

Unity3D 使用 Proto

一. 下载与安装 这里下载Google Protobuff下载 1. 源码用来编译CSharp 相关配置 2. win64 用于编译 proto 文件 二. 编译 1. 使用VS 打开 2. 点击最上面菜单栏 工具>NuGet 包管理器>管理解决方案的NuGet 管理包 版本一定要选择咱们一开始下载的对应版本否则不兼容&am…

Linux系统——nginx服务介绍

目录 一、Nginx——高性能的Web服务端 1.nginx概述 2.影响用户体验的因素 2.1客户端 2.2服务端 3.Nginx请求过程 二、Input Output 模型 1.零拷贝技术 1.1零拷贝技术的定义 1.2MMAP ( Memory Mapping ) 1.3总结 2.I/O模型相关概念 3.网络I/O模型 3.1阻塞型 I/O …

Android TV遥控器探索,Android 桌面应用程序

Android TV 的遥控功能是通过红外遥控器或蓝牙遥控器来实现的。下面分别介绍这两种遥控器的工作原理&#xff1a; 红外遥控器&#xff1a; 红外遥控器是最常见的 Android TV 遥控器类型之一。 红外遥控器通过发送红外信号来控制电视或机顶盒。每个按键都有一个特定的红外编码&…

matlab滤波器设计

1、内容简介 略 51-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 matlab滤波器设计-butter、ellip、cheby1、cheby2_哔哩哔哩_bilibili 4、参考论文 略

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为&#xff1a;感知机(Neuron)的学习算法主要包括以下步骤&#xff1a;感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法&#xff0c;用于将输入…

msvcr110.dll找不到怎么修复?多种解决msvcr110.dll缺失方法分析

面对如“程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll”这样的错误提示时&#xff0c;你的日常工作或游戏娱乐很可能会被迫暂停。这种问题在Windows用户中相当普遍&#xff0c;它们来源于某些共享的系统文件缺失。不过&#xff0c;好消息是解决此类错误通常并非困难任务…

Arduino中安装ESP32网络抽风无法下载 暴力解决办法 python

不知道什么仙人设计的arduino连接网络部分&#xff0c;死活下不下来。&#xff08;真的沙口&#xff0c;第一次看到这么抽风的下载口&#xff09; 操作 给爷惹火了我踏马解析json选zip直接全部下下来 把这个大家的开发板管理地址下下来跟后面python放在同一目录下&#xff0c…

IT廉连看——C语言——函数

IT廉连看——C语言——函数 一、函数是什么&#xff1f; 数学中我们常见到函数的概念。但是你了解C语言中的函数吗&#xff1f; 维基百科中对函数的定义&#xff1a;子程序 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, …

蛇形矩阵2

题目描述 把数1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;…&#xff0c;按照“蛇形2”放入N*N矩阵的左三角形中&#xff0c;输出结果。 下面是N6的蛇形2的图示 输入格式 第一行1个正整数&#xff1a;N&#xff0c;范围在[1,100]。 输出格式 N行&a…

C++ 学习之函数对象

C 函数对象基本概念 在C中&#xff0c;函数对象&#xff08;Function Objects&#xff09;是一种类或结构体&#xff0c;它重载了函数调用运算符operator()&#xff0c;因此可以像函数一样被调用。函数对象有时也被称为仿函数&#xff08;Functor&#xff09;。 以下是关于C函…

ONLYOFFICE 8.0版本深度测评:革新之作还是失望之作?

引言 &#xff1a; 随着办公自动化需求的不断升级&#xff0c;拥有一款功能全面、操作便捷的办公软件显得尤为重要。在这个背景下&#xff0c;ONLYOFFICE作为一款集文档编辑、表格处理、演示制作等多功能于一体的办公套件&#xff0c;吸引了众多用户的关注。近期&#xff0c;O…

进程间通信:共享内存与信号灯集(2024/2/26)

作业1&#xff1a;共享内存 shmsnd.c: #include <myhead.h> #define PAGE_SIZE 4096int main(int argc, const char *argv[]) {//一、创建key值key_t key-1;if((keyftok("/",k))-1){perror("ftok error");return -1;}//二、根据key值创建共享内存i…

HTML+CSS+JS:花瓣登录组件

效果演示 实现了一个具有动态花朵背景和简洁登录框的登录页面效果。 Code <section><img src"./img/background.jpeg" class"background"><div class"login"><h2>Sign In</h2><div class"inputBox"…

学习磁盘管理

文章目录 一、磁盘接口类型二、磁盘设备的命名三、fdisk分区四、自动挂载五、扩容swap六、GPT分区七、逻辑卷管理八、磁盘配额九、RAID十、软硬链接 一、磁盘接口类型 IDE、SATA、SCSI、SAS、FC&#xff08;光纤通道&#xff09; IDE, 该接口是并口。SATA, 该接口是串口。SCS…

如何使用自动化工具编写测试用例?

以下为作者观点&#xff0c;仅供参考&#xff1a; 在快速变化的软件开发领域&#xff0c;保证应用程序的可靠性和质量至关重要。随着应用程序复杂性和规模的不断增加&#xff0c;仅手动测试无法满足行业需求。 这就是测试自动化发挥作用的地方&#xff0c;它使软件测试人员能…

用Python实现创建餐厅评分数据分析表

代码的功能是创建一个雷达图&#xff08;Radar Chart&#xff09;&#xff0c;也称为蜘蛛网图&#xff08;Spider Chart&#xff09;&#xff0c;用来展示不同餐厅在多个维度上的评分。雷达图是一种非常适合展示多维数据的图形&#xff0c;它能够清楚地显示每个数据点在多个变量…

抖音视频评论数据提取软件|抖音数据抓取工具

一、开发背景&#xff1a; 在业务需求中&#xff0c;我们经常需要下载抖音视频。然而&#xff0c;在网上找到的视频通常只能通过逐个复制链接的方式进行抓取和下载&#xff0c;这种操作非常耗时。我们希望能够通过关键词自动批量抓取并选择性地下载抖音视频。因此&#xff0c;为…