[Spring] Gateway详解
🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (93平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
🎃Redis(97平均质量分)https://blog.csdn.net/2301_80050796/category_12777129.html?spm=1001.2014.3001.5482
🐰RabbitMQ(97平均质量分) https://blog.csdn.net/2301_80050796/category_12792900.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
目录
- 1. 网关介绍
- 1.1 问题
- 1.2 什么是API网关
- 2. Spring Cloud Gateway
- 2.1 快速上手
- 2.2 Route Predicate Factories(路由谓词工厂)
- 2.2.1 Predicate
- 2.2.2 Route Predicate Factories
- 2.2.3 代码演示
- 2.3 Gateway Filter Factories(网关过滤器工厂)
- 2.3.1 GatewayFilter
- 快速上手
- 常见的GatewayFilter类型
- Default Filters
- 2.3.2 GlobalFilter
- 快速上手
- 2.4 过滤器的执行顺序
- 2.5 自定义过滤器
- 2.5.1 自定义Gateway Filter
- 定义GatewayFilter
- 配置过滤器
- 2.5.2 自定义GlobalFilter
- 自定义GlobalFilter
1. 网关介绍
1.1 问题
在前面,我们通过Eureka,Nacos解决了服务注册,服务发现的问题,使用Spring Cloud LoadBalance解决了负载均衡的问题,使用OpenFeign解决了远程调用的问题.
但是当前所有微服务的接口都是直接对外暴露的,可以直接通过外部访问.为了保证对外服务的安全性,服务端实现的微服务接口通常都带有一定的权限校验机制.由于使用了微服务,原本⼀个应用的的多个模块拆分成了多个应用,我们不得不实现多次校验逻辑.当这套逻辑需要修改时,我们需要修改多个应用,加重了开发人员的负担.
针对上述的问题,一个最常用的方案就是使用API网关.
比如外部人员去一个公司办理业务,公司需要先核实对方的身份之后再去进行办理,而且公司划分为了多个部门,每个部门都需要先对对方的身份进行核实之后再进行办理.这样的效率是非常低的,
为此我们对此进行了改进,设立前台,统一又前台来进行身份的核实,前台身份校验通过之后,其他部门就可以设置信任,直接办理业务.
1.2 什么是API网关
API网关(简称网关)也是一个服务,通常是后端服务的唯一入口,它的定义类似设计模式中的门面模式.它就类似与整个微服务架构的门面,所有的外部客户访问,都要经过它来进行调度和过滤.
网关核心功能:
- 权限控制: 作为微服务的入口,对于用户进行权限校验,如果校验失败则进行拦截.
- 动态路由: 一切请求先经过网关,但是网关不做业务处理,而是根据某种规则把请求转发到某个微服务.
- 负载均衡: 当路由的目标服务有多个时,还需要做负载均衡.
- 限流: 请求过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大.
常见的网关实现也有很多种,我们今天要讲的是Spring Cloud Gateway
2. Spring Cloud Gateway
2.1 快速上手
我们通过一下的演示,先来了解网关的基本功能.
- 创建网关项目
API网关也是一个服务
- 引入网关依赖
<dependencies><!--⽹关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--基于nacos实现服务发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
</dependencies>
- 编写启动类
@SpringBootApplication
public class GateWayApplication {public static void main(String[] args) {SpringApplication.run(GateWayApplication.class,args);}
}
- 添加Gateway的路由设置
创建application.yml文件,添加如下的配置:
server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/product/**- id: order-serviceuri: lb//order-servicepredicates:- Path=/order/**
配置解释:
- id: 自定义路由ID,保持唯一即可.
- uri: 目标服务地址,支持普通URI以及以及
lb://应用注册服务名称
.lb表示负载均衡,使用该格式表示从注册中心获取服务地址. - predicates: 路由条件,根据匹配的结果决定是否执行该请求路由,上述代码中,我们把符合Path规则的一切请求,都代理到uri参数指定的地址.
- 测试
启动API网关服务
通过网关服务访问product-service
http://127.0.0.1:10030/order/select?id=1
url符合yml文件中配置的/product/**
规则
通过网关访问服务order-service
url符合yml配置文件中的/order/**
规则.
2.2 Route Predicate Factories(路由谓词工厂)
2.2.1 Predicate
Predicate是java8提供一个函数式编程接口,它接受一个参数并返回一个布尔值,用于条件过滤,请求参数的校验.
代码演示:
- 定义一个Predicate
public class StringPredicate implements Predicate<String> {@Overridepublic boolean test(String s) {return s.isEmpty();}
}
- 使用这个Predicate
public static void main(String[] args) {Predicate<String> predicate = new StringPredicate();System.out.println(predicate.test(""));System.out.println(predicate.test("aaaa"));
}
3. Predicate的其他写法
可以使用匿名内部类的写法
public static void main(String[] args) {Predicate<String> predicate = new Predicate<String>() {@Overridepublic boolean test(String s) {return s.isEmpty();}};System.out.println(predicate.test(""));System.out.println(predicate.test("aaa"));
}
lambda写法:
public static void main(String[] args) {Predicate<String> predicate = s -> s.isEmpty();System.out.println(predicate.test(""));System.out.println(predicate.test("aaa"));
}
- Predicate的其他方法
2.2.2 Route Predicate Factories
Route Predicate Factories (路由断言工厂,也称为路由谓词工厂,此处谓词表示一个函数),在SpringCloud Gateway中,Predicate提供了路由规则的匹配机制.
我们在配置文件中写的断言规则只是字符串,这些字符串会被Route Predicate Factory读取并处理,转变为路由判断条件.
比如前面章节配置的Path=/product/**
就是通过Path属性来匹配URL前缀是/product
的请求.
这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory
来实现的.
SpringCloud Gateway默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求不同的属性,并且多个Predicate可以通过and逻辑进行组合.
2.2.3 代码演示
- 添加Predicate规则
在application.yml中添加如下的规则
在application中添加如下规则
server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/product/**- After=2025-01-30T00:00:00.000+08:00[Asia/Shanghai]- id: order-serviceuri: lb://order-servicepredicates:- Path=/order/**- After=2025-01-30T00:00:00.000+08:00[Asia/Shanghai]
测试:http://127.0.0.1:10030/product/select?id=1001
返回了404.把时间改为2025-1-22之后再试.可以正常获取到请求.
2.3 Gateway Filter Factories(网关过滤器工厂)
Predicate决定了请求由哪一个路由处理,如果在请求之外处理前后需要加上一些逻辑,这就是Filter的作用范围了.
Filter分为两种类型: Pre类型和Post类型.
Pre类型过滤器: 路由处理之前执行(请求转发到后端服务之前),在Pre类型过滤器中可以做鉴权,限流等.
Post类型过滤器: 请求之心完成之后,将结果返回给客户端之前执行.
SpringCloud Gateway中内置了很多Filter,用于拦截和链式处理web请求,比如权限校验,访问超时等设定.
SpringCloud Gateway从作用范围上,把Filter可分为GatewayFilter和GlobalFilter.
GatewayFilter: 应用到单个路由或者一个分组路由上.
GlobalFilter: 应用到所有路由上,也就是对所有的路由生效.
2.3.1 GatewayFilter
GatewayFilter同Predicate类似,都是在配置文件application.yml中配置.每个过滤器的逻辑都是固定的.比如配置文件中写AddRequestParameter
,就可以为所有的请求添加一个参数,我们通过一个例子来演示GatewayFilter该如何使用.
快速上手
- 在application文件中添加过滤器.
server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/product/**- After=2025-01-22T00:00:00.000+08:00[Asia/Shanghai]filters:- AddRequestParameter=name,zhangsan- id: order-serviceuri: lb://order-servicepredicates:- Path=/order/**- After=2025-01-22T00:00:00.000+08:00[Asia/Shanghai]
该filter值添加在了product-service路由下,因此只对product-service路由生效,也就是/product/**
生效.
2. 接收参数并打印
在product-service服务中接收请求的参数,并打印出来.
@RequestMapping("/getParam")
public String getParam(Integer id,String name){System.out.println(id);System.out.println(name);return "接收参数成功";
}
- 测试
发送http://127.0.0.1:10030/product/getParam?id=3
观察控制台日志:
常见的GatewayFilter类型
SpringCloud Gateway提供了非常多的Filter.下面列出一些常见过滤器的说明:
具体可参考Spring官方文档:
https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/gatewayfilter-factories.html
Default Filters
前面的filter添加在指定路由下,所以只对当前路由生效,若需要对全部路由生效,可以使用spring.cloud.gateway.default-filters
这个属性.和上面指定路由下一样,下面都是一个filter的列表.
举例:
spring:cloud:gateway:default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue- PrefixPath=/httpbin
2.3.2 GlobalFilter
GlobalFilter是Spring Cloud Gateway中的全局过滤器,它和GatewayFilter的作用是相同的.GlobalFilter会应用到所有的路由请求上,全局过滤器通常用于实现安全性,性能监控和日志记录等相关的全局功能.
Spring Cloud Gateway内置的全局过滤器也有很多,比如:
- Gateway Metric Filter:网关指标,提供监控指标
- Forward Routing Filter: 用于本地forword,请求不转发到下游服务器.
- LoadBalancer Client Filter:针对下游服务,实现负载均衡.
更多过滤器参考官方文档:https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/global-filters.html
快速上手
- 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 添加配置
spring:cloud:gateway:metrics:enabled: true
management:endpoints:web:exposure:include: "*"endpoint:health:show-details: alwaysshutdown:enabled: true
解释上面的配置信息:
spring.cloud.gateway.metrics.enabled
: metrics表示指标相关的配置项,enabled 是一个布尔类型的配置参数,当设置为 true 时,意味着开启Spring Cloud Gateway的指标收集功能.开启指标收集功能后,Spring Cloud Gateway会收集一系列与网关运行相关的指标数据.这些指标数据能够帮助开发者和运维人员更好地了解网关的运行状态,性能表现以及流量情况等.management.endpoints.web.exposure.include: "*"
:该配置用于指定哪些端点(endpoints)可以通过 Web 暴露出去.* 表示所有端点都将被暴露.端点是 Spring Boot Actuator提供的用于监控和管理应用程序的接口,比如健康检查、指标统计、环境变量查看等功能都通过这些端点来实现.management.endpoint.health.show-details: always
:此配置针对健康检查端点(health),设置为 always 表示在健康检查响应中始终显示详细信息.management.endpoint.shutdown.enabled: true
: 启用了应用程序的关闭端点(shutdown).这允许通过向特定的端点发送请求来优雅地关闭应用程序.
- 测试
重启网关,访问http://127.0.0.1:10030/actuator
,显示所有监控的信息链接.
2.4 过滤器的执行顺序
一个项目中,即有GatewayFilter,又有GlobalFilter时,执行的先后顺序是什么呢?
请求路由之后,网关会把当前项目中GatewayFilter和GlobalFilter合并到一个过滤器链中,并进行排序,依次执行过滤器.
每个过滤器都必须指定一个int类型的order值,默认值为0,表示该过滤器的优先级.order值越小,优先级越高,执行顺序越靠前.
- Filter通过实现Order接口或者添加
@Order
注解来指定order值. - SpringCloud Gateway提供的Filter由Spring指定,用户也可以自定义Filter,由用户指定.
- 当过滤器的order值一样时,会按照defaultFilter>GatewayFilter>GlobalFilter的顺序来执行.
2.5 自定义过滤器
SpringCloud Gateway提供了过滤器的扩展功能,开发者可以根据实际业务来自定义过滤器,同样自定义过滤器也支持GatewayFilter和GlobalFilter两种.
2.5.1 自定义Gateway Filter
自定义Gateway Filter,需要去实现对应的接口GatewayFilterFactory
,SpringBoot默认帮我们实现的抽象类是AbstractGatewayFilterFactory
,我们可以直接使用.
定义GatewayFilter
首先针对Filter的配置,使用CustomConfig来定义.
@Data
public class CustomConfig {private String Name;
}
继承AbstractGatewayFilterFactory
抽象类并重写抽象方法,实现Ordered
接口用于指定优先级.
@Component
@Slf4j
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomConfig> implements Ordered {/*** 执行优先级,LOWEST_PRECEDENCE表示的是最低优先级* @return 返回最低优先级*/@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}@Overridepublic GatewayFilter apply(CustomConfig config) {return new GatewayFilter() {/*** Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChainchain)* ServerWebExchange: HTTP请求-响应交互的契约, 提供对HTTP请求和响应的访问, 服务器端请求属性, 请求实例,响应实例等, 类似Context角色* GatewayFilterChain: 过滤器链* Mono: Reactor核心类, 数据流发布者, Mono最多只触发⼀个事件, 所以可以把Mono 用于在异步任务完成时发出通知.* Mono.fromRunnable: 创建⼀个包含Runnable元素的数据流.类似与创建了一个线程*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("[Pre] Filter Request:"+config.getName());return chain.filter(exchange).then(Mono.fromRunnable(()-> log.info("[Post] Response Filter")));//执行请求}};}
}
代码说明:
- 自定义过滤器类名统一以GatewayFilterFactory结尾,因为在默认情况下,过滤器的name会采用该定义类的前缀,这里的
name=Custom
(yml配置中使用). - apply方法中,同时包含了Pre和Postman过滤,then方法中是请求执行结束之后处理的.
- CustomConfig是一个配置类,该类只有一个属性name,和yml的配置对应.
- 该类需要交给Spring进行管理,所以需要加
@Comopent
注解. - getOrder表示该过滤器的优先级.
配置过滤器
spring:cloud:gateway:metrics:enabled: trueroutes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/product/**filters:- name: Customargs:name: custom filter
2.5.2 自定义GlobalFilter
GlobalFilter的实现比较简单,它不需要额外的配置,只需要实现GlobalFilter接口,自动会过滤掉所有的Filter.
自定义GlobalFilter
@Component
@Slf4j
public class CustomGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("[Pre] CustomGlobalFilter enter...");return chain.filter(exchange).then(Mono.fromRunnable(()-> log.info("[Post] CustomGlobalFilter return...")));//执行请求}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}
}
相关文章:
[Spring] Gateway详解
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
计数排序算法
基本思想 先确定待排序数组的最大值(Max)和最小值(Min),随后创建Max - Min 1个长度的数组称为计数数组,计数数组的索引对应着待排序数组中元素的值,数组的值表示该元素的出现次数。通过从前往…...
Spring--基于注解的声明式事务
基于注解的声明式事务 1.选择一个合适的事务管理器实现加入到ioc容器 2.使用注解指定哪些方法需要添加事务即可 1.事务属性:只读 // readOnly true把当前事务设置为只读 默认是false! Transactional(readOnly true)Transactional注解放在类上 生效原则 如果一…...
SQL-leetcode—1164. 指定日期的产品价格
1164. 指定日期的产品价格 产品数据表: Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | new_price | int | | change_date | date | ---------------------- (product_id, change_date) 是此表的主键(具…...
微服务搭建----springboot接入Nacos2.x
springboot接入Nacos2.x nacos之前用的版本是1.0的,现在重新搭建一个2.0版本的,学如逆水行舟,不进则退,废话不多说,开搞 1、 nacos2.x搭建 1,首先第一步查询下项目之间的版本对照,不然后期会…...
JavaEE:多线程进阶
JavaEE:多线程进阶 一、对比不同锁策略之间的应用场景及其区别1. 悲观锁 和 乐观锁1.1 定义和原理1.2 应用场景1.3 示例代码 2. 重量级锁 和 轻量级锁2.1 定义和原理2.2 应用场景2.3 示例代码 3. 挂起等待锁 和 自旋锁3.1 定义和原理3.2 应用场景3.3 示例代码 4. 几…...
软件测试 —— jmeter(2)
软件测试 —— jmeter(2) HTTP默认请求头(元件)元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组(Stepping Thread Group)参数解析总结 Response Times over TimeActive Thre…...
[java] 面向对象进阶篇1--黑马程序员
目录 static 静态变量及其访问 实例变量及其访问 静态方法及其访问 实例方法及其访问 总结 继承 作用 定义格式 示例 总结 子类不能继承的内容 继承后的特点 成员变量 成员变量不重名 成员变量重名 super访问父类成员变量 成员方法 成员方法不重名 成员方法…...
openstack单机安装
openstack单机安装 网卡配置安装依赖开启虚拟环境修改配置文件 部署openstack部署openstack客户端访问可视化界面Horizon补充 本篇主要讲述Ubuntu2204单机安装openstackstable/2024.2。其他版本的Linux系统或者openstack版本,请参考openstack官网。 网卡配置 需要配…...
OFD、PDF 电子签章系统处理流程
在C#中实现电子签章系统的处理流程,可以参考以下步骤和技术实现: 1. 电子签章系统的基本流程 电子签章系统的核心流程包括以下几个步骤: 密钥生成:生成公钥和私钥对,私钥由签章人保管,公钥用于验证签名。…...
「 机器人 」系统辨识实验浅谈
前言 系统辨识实验是一种通过实验和数据分析的方法,用于建立物理系统的数学模型的技术。系统辨识是控制工程和系统科学中的重要环节,尤其是在模型未知或复杂的情况下。以下是系统辨识实验的详细介绍: 1. 系统辨识实验的目的 1.1 建模 为动态系统(如机械系统、电气系统或生…...
15.7k!DISM++一款快捷的系统优化工具
软件介绍 链接 软件介绍 dism是一款由初雨团队开发的win系统优化工具,可当作是微软系统命令行工具dism的GUI版本。可用作系统垃圾清除、启动项管理、程序卸载、驱动管理、系统优化等 该工具个人感觉最重要的就是系统优化选项,它将一些实用、无用或者没…...
Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决
个人博客地址:Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决 | 一张假钞的真实世界 msvcp120.dll、msvcr120.dll、vcomp120.dll属于VC2013版中的动态链接库,如果丢失重新安装VC2013即可。下载地址:https://www.microsoft.com…...
Vue 3 30天精进之旅:Day 03 - Vue实例
引言 在前两天的学习中,我们成功搭建了Vue.js的开发环境,并创建了我们的第一个Vue项目。今天,我们将深入了解Vue的核心概念之一——Vue实例。通过学习Vue实例,你将理解Vue的基础架构,掌握数据绑定、模板语法和指令的使…...
被遮挡QT窗口置顶
问题描述 开发环境:windows QT 需求: 单击托盘将桌面窗口在被遮挡的情况下置顶解决方案 方案1 资料链接 代码实现 Qt::WindowFlags flags windowFlags(); this->setWindowFlags((flags | Qt::WindowStaysOnTopHint)); this->showMaximized();…...
Apache Flink 概述学习笔记
一、引言 在大数据处理领域,Apache Flink 是一个极具影响力的开源流批一体化计算框架,它以其独特的架构和强大的功能,为大规模数据处理提供了高效、灵活的解决方案。 二、基本概念 Flink 是什么:Flink 是一个分布式流批处理框架…...
系统思考—复杂问题的根源分析
在企业中,许多问题看似简单,背后却潜藏着复杂的因果关系。传统的思维方式往往只能看到表面,而无法深入挖掘问题的真正根源。我们常常通过“表面解决”来应对眼前的症状,但这往往只是治标不治本。 比如,销量下降时&…...
Python 之 Excel 表格常用操作
示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…...
《用DOTS解决实际需求》集锦
去年作者发布了一篇《DOTS-ECS系列课程》,深受同学们的好评!前期课程是基于0.51版本录制的,DOTS升级至1.0版本后,同学们纷纷希望能使用DOTS 1.0版本录制实战课程。 今年作者带着DOTS 1.0版本的实战课程回来啦!&#x…...
【MySQL】存储引擎有哪些?区别是什么?
频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大,只是涉及到的相关知识比较繁杂,比如事务、锁机制等等,都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎࿰…...
ios打包:uuid与udid
ios的uuid与udid混乱的网上信息 新人开发ios,发现uuid和udid在网上有很多帖子里是混淆的,比如百度下,就会说: 在iOS中使用UUID(通用唯一识别码)作为永久签名,通常是指生成一个唯一标识…...
Jadx动态调试安卓逆向
adb shell su ls 找到default.prop cat default.prop ro.debuggable0(代表没有调试权限) adb shell getprop ro.debuggable # 检查设备是否可调试(1可调试) adb shell getprop ro.product.cpu.abi # 获取设备 CPU 架构(如 arm64-v…...
在Ubuntu上使用Apache+MariaDB安装部署Nextcloud并修改默认存储路径
一、前言 Nextcloud 是一款开源的私有云存储解决方案,允许用户轻松搭建自己的云服务。它不仅支持文件存储和共享,还提供了日历、联系人、任务管理、笔记等丰富的功能。本文将详细介绍如何在 Ubuntu 22.04 LTS 上使用 Apache 和 MariaDB 安装部署 Nextcl…...
FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转
本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转,关于视频180度实时旋转,请见本专栏前面的文章,旋转效果示意图如下: 为了实时对比旋转效果,采用分屏显示进行处理,左边代表旋转前的视频在屏幕中…...
六、深入了解DI
依赖注入是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象. 在上⾯程序案例中,我们使⽤了 Autowired 这个注解,完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…...
kotlin内联函数——let,run,apply,also,with的区别
一、概述 为了帮助您根据使用场景选择合适的作用域函数(scope function),我们将对它们进行详细描述并提供使用建议。从技术上讲,许多情况下范围函数是可以互换使用的,因此示例中展示了使用它们的约定俗成的做法。 1.…...
火语言RPA—超级鹰打码
🚩【组件功能】:通过传入图像返回图像中的文字或结果信息 针对不同类型图片形式的验证码,提交至平台api,以字符串形式返回图片识别结果。 配置预览 配置说明 文件路径 支持T或# 默认FLOW输入项 待识别本地图片的完整路径。 用…...
C#新语法
目录 顶级语句(C#9.0) using 全局using指令(C#10.0) using资源管理问题 using声明(C#8.0) using声明陷阱 错误写法 正确写法 文件范围的命名空间声明(C#10.0) 可空引用类型…...
Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析
第一部分:问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…...
lightgbm做分类
python import pandas as pd#导入csv文件的库 import numpy as np#进行矩阵运算的库 import json#用于读取和写入json数据格式#model lgb分类模型,日志评估,早停防止过拟合 from lightgbm import LGBMClassifier,log_evaluation,early_stopping #metric from sklearn.metrics …...
下载Visual Studio Community 2019
官方链接如下:Visual Studio Community 2019下载链接 https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/system-requirements#download 目前官方仅建议2022版,已经关闭vs2019等旧版本,哪天开放了,记得踢我一下。 …...
深入理解MySQL事务(万字详)
文章目录 什么是事务为什么会出现事务事务的版本支持事务的提交方式事务常见操作方式正常演示 - 证明事务的开始与回滚非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)非正常演示2 - 证明commit了…...
FFPlay命令全集合
FFPlay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器。 ffplay工具下载并播放视频,可以辅助卡看流信息。 官网下载地址:http://ffmpeg.org/download.html#build-windows 下载build好的exe程序: 此处下载…...
AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码
AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码 前言一、通义灵码介绍1.1 通义灵码简介1.2 主要功能1.3 版本选择1.4 支持环境 二、Visual Studio Code介绍1.1 VS Code简介1.2 主要特点 三、安装VsCode3.1下载VsCode3.2.安装VsCode3.3 打开VsCod…...
开源的Text-to-SQL工具WrenAI
WrenAI是一个开源的Text-to-SQL工具,旨在通过自然语言交互界面,帮助用户更便捷地查询数据库。以下是对WrenAI的详细介绍: 一、主要功能 自然语言交互:用户可以通过对话方式提出问题,WrenAI能够理解和解析复杂的查询需…...
python创建一个httpServer网页上传文件到httpServer
一、代码 1.server.py import os from http.server import SimpleHTTPRequestHandler, HTTPServer import cgi # 自定义请求处理类 class MyRequestHandler(SimpleHTTPRequestHandler):# 处理GET请求def do_GET(self):if self.path /:# 响应200状态码self.send_response(2…...
Linux中page、buffer_head、bio的关系
在Linux中,page、buffer_head、bio这三个概念紧密相关,共同构成了块设备I/O和内存管理的重要部分,它们的联系主要体现在以下方面: page与buffer_head 基于page构建:buffer_head通常是基于page来构建的,一…...
C++11新特性之decltype
1.decltype的作用 decltype是C11新增的一个关键字,与auto的功能一样,都是在编译期间推导变量类型的。不了解auto的可以转到——C11新特性之auto。 为什么引入decltype?看过上边那篇博客的读者应该知道auto在有些场景中并不适用,所以引入declt…...
对神经网络基础的理解
目录 一、《python神经网络编程》 二、一些粗浅的认识 1) 神经网络也是一种拟合 2)神经网络不是真的大脑 3)网络构建需要反复迭代 三、数字图像识别的实现思路 1)建立一个神经网络类 2)权重更新的具体实现 3&am…...
后端开发Web
Maven Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具 Maven的作用 依赖管理 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题 统一项目结构 提供标准、统一的项目结构 项目构建 标准跨平台(…...
QT 通过ODBC连接数据库的好方法:
效果图: PWD使用自己的,我的这是自己的,所以你用不了。 以下是格式。 // 1. 设置数据库连接 QSqlDatabase db QSqlDatabase::addDatabase("QODBC");// 建立和QMYSQL数据库的连接 // 设置数据库连接名称(DSN&am…...
【Feature Scaling】:加速梯度下降法的利器
目录 特征缩放的目的常见的特征缩放方法1. 最小-最大缩放(Min-Max Scaling)2. 标准化(Standardization 或 Z-Score Normalization)3. 最大绝对值缩放(Max Abs Scaling) Rescale的使用场景结论 在机器学习中…...
QT:控件属性及常用控件(3)-----输入类控件(正则表达式)
输入类控件既可以进行显示,也能让用户输入一些内容! 文章目录 1.Line Edit1.1 用户输入个人信息1.2 基于正则表达式的文本限制1.3 验证两次输入的密码是否一致1.4 让输入的密码可以被查看 2.Text Edit2.1 输入和显示同步2.1 其他信号出发情况 3.ComboBox…...
计算机网络 (59)无线个人区域网WPAN
前言 无线个人区域网(WPAN,Wireless Personal Area Network)是一种以个人为中心,采用无线连接方式的个人局域网。 一、定义与特点 定义:WPAN是以个人为中心,实现活动半径小、业务类型丰富、面向特定群体的无…...
Python Typing: 实战应用指南
文章目录 1. 什么是 Python Typing?2. 实战案例:构建一个用户管理系统2.1 项目描述2.2 代码实现 3. 类型检查工具:MyPy4. 常见的 typing 用法5. 总结 在 Python 中,静态类型检查越来越受到开发者的重视。typing 模块提供了一种方式…...
Redis存储③Redis基本命令+内部编号和架构
目录 1. Redis 命令行客户端 1.1 与 Redis 服务器交互 1.2 set 和 get 命令 2. 基本全局命令 2.1 keys 2.2 exists 2.3 del 2.4 expire 2.5 ttl 2.6 type 3. 数据结构和内部编码 4. 单线程架构 本篇完。 1. Redis 命令行客户端 1.1 与 Redis 服务器交互 根据上篇…...
Vivado生成X1或X4位宽mcs文件并固化到flash
1.生成mcs文件 01.在vivado里的菜单栏选择"tools"工具栏 02.在"tools"里选择"生成内存配置文件" 03.配置参数 按照FPGA板上的flash型号进行选型,相关配置步骤可参考下图。 注意:Flash数据传输位宽如果需要选择X4位宽&am…...
07 区块链安全技术
概述 区块链的安全特性 区块链解决了在不可靠网络上可靠地传输信息的难题,由于不依赖与中心节点的认证和管理,因此防止了中心节点被攻击造成的数据泄露和认证失败的风险。 区块链安全防护的三大特点 共识机制代替中心认证机制数据篡改“一发动全身”…...
第84期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…...
柔性数组与c/c++程序中内存区域的划分
1.柔性数组 1.1柔性数组的定义 柔性数组是指在结构体中定义的,其大小在编译时未确定,而在运行时动态分配的数组。这种数组允许结构体的大小根据需要动态变化。语法如下: struct D {int a;int arry1[0]; };struct F {int a;int arry2[]; };…...