【云原生】Spring Cloud Gateway的底层原理与实践方法探究
🎉🎉欢迎光临🎉🎉
🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀
🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:从入门到入魔》 🚀
本专栏带你从Spring入门到入魔!
这是苏泽的个人主页可以看到我其他的内容哦👇👇
努力的苏泽
http://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. 高可用部署
-
引言
-
介绍API网关和其在云原生应用中的重要性
在云原生应用中,API网关是一个关键的组件,用于提供统一的入口点和访问控制,以便对后端微服务进行路由、负载均衡、安全认证等操作。API网关充当了客户端和后端服务之间的门户,简化了客户端与服务之间的通信,并提供了一些重要的功能和特性,如请求转发、认证授权、监控和限流等。
-
概述Spring Cloud Gateway作为API网关的特点和优势
Spring Cloud Gateway是Spring Cloud生态系统中的一个API网关组件,它基于Spring Framework 5、Spring Boot 2和Reactor等技术栈构建而成。Spring Cloud Gateway具有以下特点和优势:
-
基于非阻塞式编程模型:Spring Cloud Gateway使用了基于响应式编程的Reactor库,使得它可以处理大量并发请求而不阻塞线程,提高了性能和吞吐量。
-
动态路由:Spring Cloud Gateway支持动态路由配置,可以根据请求的路径、参数、标头等信息来动态地将请求路由到不同的后端服务。
-
过滤器链:Spring Cloud Gateway采用过滤器链的方式,可以在请求进入网关和响应离开网关时应用各种过滤器,如认证、鉴权、请求转换、限流等。
-
集成性:Spring Cloud Gateway与Spring Cloud生态系统中的其他组件无缝集成,如服务发现与注册(Eureka、Consul)、负载均衡(Ribbon)、断路器(Hystrix)等。
-
可插拔的架构:Spring Cloud Gateway的架构设计可插拔,可以根据需求扩展和定制各种功能和组件,使其更加灵活和可扩展。
Spring Cloud Gateway简介:
Spring Cloud Gateway是一个基于Spring Framework 5和Spring Boot 2的API网关组件,它提供了一种简单而强大的方式来管理和路由微服务的请求。Spring Cloud Gateway的核心概念包括路由(Route)、断言(Predicate)和过滤器(Filter)。
-
路由(Route):路由定义了请求的目标地址和规则,包括目标URL、请求谓词(如GET、POST)、请求头、请求参数等。通过配置多个路由规则,可以将请求转发到不同的后端服务。
-
断言(Predicate):断言用于匹配请求的条件,只有满足条件的请求才会被路由到相应的后端服务。断言可以基于请求的路径、参数、标头等信息进行匹配。
-
过滤器(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 Boot Actuator模块提供的监控和管理功能。在Spring Cloud Gateway项目的配置文件中,配置Actuator端点的相关配置。以下是一个简单的配置示例:
-
异常处理和降级策略:定义合适的异常处理和降级策略,当后端服务出现故障或网络问题时,能够快速失败或返回预设的响应,避免系统崩溃。
在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。
- 创建一个全局异常处理器的过滤器类:
相关文章:
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:从入门到入魔》 🚀 本…...
springboot 实现本地文件存储
springboot 实现本地文件存储 实现过程 上传文件保存文件(本地磁盘)返回文件HTTP访问服务器路径给前端,进行效果展示 存储 服务端接收上传的目的是提供文件的访问服务,对于SpringBoot而言,其对静态资源访问提供了很…...
Python进阶学习:Pandas--查看DataFrame中每一列的数据类型
Python进阶学习:Pandas–查看DataFrame中每一列的数据类型 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希…...
Groovy - 大数据共享搜索配置
数据共享搜索列中配置了搜索列,相应的数据共享接口中也需要支持根据配置的字段搜索,配置实体时,支持搜索的入参code必须是searchKeys,且接口应该是需要支持分页(入参必须是 current、pageSize)的。current …...
第三节:Vben Admin登录对接后端login接口
系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 文章目录 系列文章目录前言一、Flask项目介绍…...
关于CSS 优先级布局应用的教程
在前端开发中,CSS 的优先级布局是非常重要的一部分。通过合理地应用 CSS 优先级,我们可以更加灵活地控制页面的布局和样式。本教程将向您介绍如何利用 CSS 优先级进行布局,并通过实例展示其应用。 1. 了解 CSS 优先级 在 CSS 样式表中&…...
vue2+elementui上传照片(el-upload 超简单)
文章目录 element上传附件(el-upload 超详细)代码展示html代码data中methods中接口写法 总结 element上传附件(el-upload 超详细) 这个功能其实比较常见的功能,后台管理系统基本上都有,这就离不开element的…...
目标检测新SOTA:YOLOv9问世,新架构让传统卷积重焕生机(附代码)
在目标检测领域,YOLOv9 实现了一代更比一代强,利用新架构和方法让传统卷积在参数利用率方面胜过了深度卷积。 继 2023 年 1 月 YOLOv8 正式发布一年多以后,YOLOv9 终于来了! 我们知道,YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Al…...
Javascript:输入输出
目录 一.前言 二.正文 1.输出 2.输入 3.字面量 概念: 三.结语 一.前言 Javascript作为运行浏览器的语言,对于学习前端的同学来说十分重要,那么从现在开始我们将开始介绍有关 Javascript。 二.正文 1.输出 document.write() : 向body内…...
Windows系统安装TortoiseSVN并结合内网穿透实现远程访问本地服务器——“cpolar内网穿透”
文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…...
HarmonyOS 开发之———应用程序入口—UIAbility的使用
谢谢关注!! 前言:上一篇文章主要介绍ArkJS 基础—〉自定义组件使用。如需了解谢谢查阅:http://t.csdnimg.cn/01PQ2 一、UIAbility概述 UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互。UIAbility也是系统调度的单元,为应用提供窗口在其中绘制界面。 …...
推荐几款优秀免费开源的导航网站
🦩van-nav 项目地址:van-nav项目介绍:一个轻量导航站,汇总你的所有服务。项目亮点:全平台支持,单文件部署,有配套浏览器插件。效果预览 🦩发现导航 项目地址:nav项目…...
input输入框过滤非金额内容保留一个小数点和2位小数
这篇是输入框过滤非金额内容保留一个小数点和2位小数,金额的其他格式化可以看这篇文章常用的金额数字的格式化方法 js方法直接使用 该方式可以直接使用过滤内容,也可以到onInput或onblur等地方过滤,自行使用 /*** 非金额字符格式化处理* p…...
推荐系统经典模型YouTubeDNN代码
文章目录 前言数据预处理部分模型训练预测部分总结与问答 前言 上一篇讲到过YouTubeDNN论文部分内容,但是没有代码部分。最近网上教学视频里看到一段关于YouTubeDNN召回算法的代码,现在我分享一下给大家参考看一下,并附上一些我对代码的理解…...
学习加密(三)spring boot 使用RSA非对称加密,前后端传递参数加解密
1.前面一篇是AES对称加密写了一个demo,为了后面的两者结合使用,今天去了解学习了下RSA非对称加密. 2.这是百度百科对(对称加密丶非对称加密)的解释: (1)对称加密算法在加密和解密时使用的是同一个秘钥。 (2)非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥…...
面向对象编程入门:掌握C++类的基础(2/3):深入理解C++中的类成员函数
在C编程中,类是构建程序的基石,而理解类的默认成员函数对于高效使用C至关重要。本文将深入探讨这六个默认成员函数及其他相关概念,提供给读者一个全面的视角。 类的6个默认成员函数: 如果一个类中什么成员都没有,简称为…...
javaWeb学习04
AOP核心概念: 连接点: JoinPoint, 可以被AOP控制的方法 通知: Advice 指哪些重复的逻辑,也就是共性功能(最终体现为一个方法) 切入点: PointCut, 匹配连接点的条件,通知仅会在切入点方法执行时被应用 目标对象: Target, 通知所应用的对象 通知类…...
Day07:基础入门-抓包技术全局协议封包监听网卡模式APP小程序PC应用
目录 非HTTP/HTTPS协议抓包工具 WireShark 科来网络分析系统 WPE封包 思维导图 章节知识点: 应用架构:Web/APP/云应用/三方服务/负载均衡等 安全产品:CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令:文件上传下载/端口服务/Sh…...
通过elementUI学习vue
<template><el-radio v-model"radio" label"1">备选项</el-radio><el-radio v-model"radio" label"2">备选项</el-radio> </template><script>export default {data () {return {radio: 1}…...
音视频数字化(数字与模拟-电视)
上一篇文章【音视频数字化(数字与模拟-音频广播)】谈了音频的广播,这次我们聊电视系统,这是音频+视频的采集、传输、接收系统,相对比较复杂。 音频系统的广播是将声音转为电信号,再调制后发射出去,利用“共振”原理,收音机接收后解调,将音频信号还原再推动扬声器,我…...
Matlab信号处理避坑指南:freqz函数里那个容易被忽略的‘whole’参数到底有什么用?
Matlab信号处理避坑指南:freqz函数里那个容易被忽略的‘whole’参数到底有什么用? 在数字信号处理领域,Matlab的freqz函数是分析滤波器频率响应的利器。但许多工程师在使用过程中,往往对那个看似不起眼的whole参数视而不见&#x…...
Python Android开发终极指南:从Python代码到Android APK的一站式解决方案
Python Android开发终极指南:从Python代码到Android APK的一站式解决方案 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android 对于Python开发者来说&a…...
Payment扩展开发:如何自定义支付网关和添加新支付渠道
Payment扩展开发:如何自定义支付网关和添加新支付渠道 【免费下载链接】payment Payment是php版本的支付聚合第三方sdk,集成了微信支付、支付宝支付、招商一网通支付。提供统一的调用接口,方便快速接入各种支付、查询、退款、转账能力。服务端…...
鸿蒙flutter测试文章3
test...
1000_Projects安全工具开发:从端口扫描器到密码破解器完整指南
1000_Projects安全工具开发:从端口扫描器到密码破解器完整指南 【免费下载链接】1000_Projects :sunglasses: Mega List of practical projects that one can solve in any programming language! 项目地址: https://gitcode.com/gh_mirrors/10/1000_Projects …...
国产化迁移笔记:在龙芯/飞腾的银河麒麟V10中,为OpenJDK 8补全Icedtea-netx插件全记录
国产化迁移实战:在银河麒麟V10中为OpenJDK 8补全Icedtea-netx插件全流程解析 当企业级应用从传统x86架构向国产化平台迁移时,Java Web Start技术的兼容性问题往往成为拦路虎。最近在将某金融系统迁移到龙芯3A5000平台时,我们遇到了一个典型场…...
终极指南:使用Jsxer快速解密Adobe JSXBIN二进制脚本文件
终极指南:使用Jsxer快速解密Adobe JSXBIN二进制脚本文件 【免费下载链接】jsxer A fast and accurate JSXBIN decompiler. 项目地址: https://gitcode.com/gh_mirrors/js/jsxer 你是否曾经遇到过以JSXBIN开头的Adobe ExtendScript二进制文件?这些…...
生成式AI实时通信的“隐形瓶颈”:模型Tokenizer流式切分与网络MTU错配问题(附Wireshark抓包取证全过程)
第一章:生成式AI应用实时通信方案 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用对低延迟、高并发、上下文感知的实时通信能力提出全新要求。传统REST API轮询或短连接模式难以支撑流式推理响应、多模态协同编辑、Agent间动态协商等典型场景。现代架构…...
《允许孩子做自己:从“听话”到“自主”,守护成长的独特轨迹》
允许孩子做自己,本质上是尊重他们作为独立个体的天性与权利,这对孩子的成长有着深远的意义:从成长规律来看,每个孩子都有独特的气质、兴趣和节奏——有的孩子天生敏感细腻,喜欢安静观察;有的活泼好动&#…...
从零实现MDP:用Python代码拆解马尔可夫决策过程核心算法
1. 马尔可夫决策过程入门指南 第一次接触马尔可夫决策过程(MDP)时,我也被那些数学符号弄得头晕眼花。但当我用Python把它实现出来后,突然就豁然开朗了。MDP本质上是一个用来建模序列决策问题的数学框架,在机器人路径规划、游戏AI等领域都有广…...
