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

【微服务】网关 - Gateway(下)(day8)

网关过滤工厂

在上一篇文章中,主要是对网关进行了一个总体的介绍,然后对网关中的断言进行了一个描述。在这篇文章中,主要是对网关中的最后一大核心——过滤进行介绍。

当客户端发送过来的请求经过断言之后,如果还想在请求前后添加一些逻辑,那么就可以使用过滤器来做。这个过滤器其实就相当于SpringMVC中的拦截器、Servlet中的过滤器。同样,过滤和断言类似,SpringCloudGateway内部也内置了许多Filter。

过滤器可以分为全局默认过滤器(GlobalFilter)、单一内置过滤器(GatewayFilter)以及自定义过滤器。

过滤器可以在请求前后对业务逻辑进行处理,因此它的功能有:请求鉴权、记录接口耗时等。

GatewayFilter

GatewayFilter,表示单一内置过滤器,一般应用到单个路由或者一个分组的路由上。

和断言相同,在网关服务的配置文件中配置条件,然后在订单服务创建一个FilterController类来测试项目。

跟请求头相关的

AddRequestHeaderGatewayFilterFactory

该过滤器表示在请求头上添加内容,具体内容跟自己配置的文件相关。

如下配置表示在/filter/addRequestHeader请求的请求头上加上key为role,value为admin的内容。

spring:cloud:gateway:routes:- id: 11uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addRequestHeaderfilters:- AddRequestHeader=role, admin
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** AddRequestHeaderGatewayFilterFactory* 表示在请求头中添加一些内容* 测试添加的是role=admin*/@GetMapping("/addRequestHeader")public String addRequestHeader() {ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = servletRequestAttributes.getRequest();String role = request.getHeader("role");return "在过滤内置工厂中添加的内容为:role = " + role;}}

RemoveRequestHeaderGatewayFilterFactory

改过滤器表示将请求头上的内容删除,具体删除内容跟配置文件有关。

如下配置表示移除请求头中key为content的内容。在postman的请求中,专门加入要移除的内容,测试之后发现请求头中确实没有,表示验证成功。

spring:cloud:gateway:routes:- id: 12uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeRequestHeaderfilters:- RemoveRequestHeader=content
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RemoveRequestHeaderGatewayFilterFactory* 表示移除请求头中的一些内容* 测试移除的是content*/@GetMapping("/removeRequestHeader")public String removeRequestHeader(HttpServletRequest request) {String value = "";Enumeration<String> headers = request.getHeaderNames();while (headers.hasMoreElements()) {String headerKey = headers.nextElement();String headValue = request.getHeader(headerKey);value = value +  headerKey + '\t' + headValue + '\n';}return value;}}

SetRequestHeaderGatewayFilterFactory

该过滤器表示修改请求头原先的一些设置,测试发现好像即使没加这个请求头,他也会自动加上。

如下配置表示将请求头中key为usernmae的内容,将其value设置成wbz。

spring:cloud:gateway:routes:- id: 13uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/setRequestHeaderfilters:- SetRequestHeader=username, wbz
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** SetRequestHeaderGatewayFilterFactory* 表示将原先请求头中的内容进行更换* 测试是将key为username的wky更换成wbz*/@GetMapping("/setRequestHeader")public String setRequestHeader(HttpServletRequest request) {return "请求头中username对应的是:" + request.getHeader("username");}}

跟请求参数相关的 

AddRequestParameterGatewayFilterFactory

该过滤器表示在请求参数上添加一些内容。

如下配置表示在请求参数上添加key为phone,value为13191038888的内容。

这里有一个值得注意的地方是,如果在过滤器中声明一个,然后自己写接口时再声明一个,那么使用参数接收到的就是两个内容,使用request.getParameter接收到的就是自己传过来的。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** AddRequestParameterGatewayFilterFactory* 表示在请求参数中加入一些内容* 测试是加入一个key为phone,value为1319103888的键值对*/@GetMapping("/addRequestParameter")public String addRequestParameter(HttpServletRequest request, String phone) {log.info("测试" + phone);return "phone:" + request.getParameter("phone");}}
spring:cloud:gateway:routes:- id: 14uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addRequestParameterfilters:- AddRequestParameter=phone,13191038888

RemoveRequestParameterGatewayFilterFactory

该过滤器表示删除请求参数上的一些内容。

如下配置表示删除请求参数上key为nickName的内容。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RemoveRequestParameterGatewayFilterFactory* 表示在请求参数中删除一些内容* 测试是删除一个key为nickName,无论value是啥的内容*/@GetMapping("removeRequestParameter")public String removeRequestParameter(HttpServletRequest request) {return "nickName:" + request.getParameter("nickName");}}
spring:cloud:gateway:routes:- id: 15uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeRequestParameterfilters:- RemoveRequestParameter=nickName

跟响应头相关的

AddResponseHeaderFilterGatewayFactory

该过滤器表示在响应头上添加一些内容。

如下配置表示在响应头上新增一个key为role,value为admin的键值对。

spring:cloud:gateway:routes:- id: 16uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addResponseHeaderfilters:- AddResponseHeader=role, admin
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** AddResponseHeaderGatewayFilterFactory* 表示在响应头中新增一些内容* 测试是新增一个key为role,content为admin的键值对*/@GetMapping("/addResponseHeader")public String addResponseHeader(HttpServletResponse response) {return "响应";}}

RemoveResponseHeaderFilterGatewayFactory

该过滤器表示移除响应头上的一些内容。

如下配置表示将响应头中key为content的内容移除

spring:cloud:gateway:routes:- id: 17uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeResponseHeaderfilters:- RemoveResponseHeader=content
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RemoveResponseHeaderGatewayFilterFactory* 表示在响应头中移除一些内容* 测试是将key为content的内容移除*/@GetMapping("/removeResponseHeader")public String removeResponseHeader(HttpServletResponse response) {response.setHeader("content", "delete");return "响应";}}

SetResponseHeaderFilterGatewayFactory

该过滤器表示设置响应头上的一些内容,即使原本响应头上没有,依旧可以设置成功,有的话就换成设置之后的。

如下配置表示将key为username的对应的value设置成wbz。

spring:cloud:gateway:routes:- id: 18uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/setResponseHeaderfilters:- SetResponseHeader=username, wbz
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** SetResponseHeaderGatewayFilterFactory* 表示在响应头中设置一些内容* 测试是将key为username的对应value设置为wbz*/@GetMapping("/setResponseHeader")public String setResponseHeader(HttpServletResponse response) {response.setHeader("username", "wky");return "响应";}}

跟路径有关的

PrefixPathGatewayFilterFactory

该过滤器是用来设置统一前缀的,假设某个服务的路径都带有一个相同的前缀,那么就可以使用该过滤器进行设置。当请求通过断言之后,过滤器路由服务之前就会自动加上前缀。

如下配置请求的完整URL是/filter/prefixPath,我将filter抽取出来放到过滤器中,因此我在输入URL时,只输入127.0.0.1:9527/prefixPath,就可以成功路由到/filter/prefixPath上。

spring:cloud:gateway:routes:- id: 19uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/prefixPathfilters:- PrefixPath=/filter
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** PrefixPathGatewayFilterFactory* 表示设置一个响应统一前缀*/@GetMapping("/prefixPath")public String prefixPath() {return "设置统一前缀成功";}}

SetPathGatewayFilterFactory

该过滤器是用来进行地址替换的,客户端发送的地址经过断言之后,就会替换成过滤器中给出的真实地址。

如下配置是客户端发送的请求地址是127.0.0.1:9527/random/test,断言判断为true之后,过滤器就会将这个地址进行替换,然后再向服务端发送请求。

spring:cloud:gateway:routes:- id: 20uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/random/{regexp}filters:- SetPath=/filter/setPath/{regexp}
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** SetPathGatewayFilterFactory* 地址替换,即客户端发送的请求是根据断言来的* 断言成功之后过滤器会将其替换成真实的地址*/@GetMapping("/setPath/{regexp}")public String setPath(@PathVariable String regexp) {return "地址替换成功";}}

 RedirectToGatewayFilterFactory

该过滤器表示重定向。

如下配置表示当客户端访问127.0.0.1:9527/redirectTo时,网关就会重定向到百度。

spring:cloud:gateway:routes: - id: 21uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/redirectTofilters:- RedirectTo=302,https://www.baidu.com

其他

RequestRateLimiterGatewayFilterFactory

该过滤器表示为当前网关的所有请求执行限流过滤,如果被限流,默认会响应HTTP 429-Too ManyRequests。默认提供了RedisRateLimiter的限流算法,采用令牌桶算法实现限流功能(对于具体的限流算法,在介绍Sentinel或其他限流组件时会详细介绍)。

如下配置表示限流过滤器的内容。

spring:cloud:gateway:routes: - id: 22uri:predicates:- Path=/filter/**filters:- RequestRateLimiter=redis-rate-limiter.replenishRate, 10# 令牌填充速度,即每秒钟允许多少个请求(不丢弃任何请求)- RequestRateLimiter=redis-rate-limiter.burstCapacity, 20# 令牌桶容量,即每秒⽤⼾最⼤能够执⾏的请求数量(不丢弃任何请求)。将此值设置为零将阻⽌所有请求。- RequestRateLimiter=redis-rate-limiter.requestedTokens, 1# 每次请求占⽤⼏个令牌,默认为1。

RetryGatewayFilterFactory

该过滤器表示重试过滤器,会针对不同的响应进行重试。当后端服务不可用时,网关会根据配置参数来发起重试。

如下配置中,设置重试3次,然后针对BAD_GATEWAY的响应进行重试。BAD_GATEWAY是HttpStatus中的状态码,只要配置文件中配置的状态和服务响应回去的状态相同,那么就会进行重试。从结果可以看出,共发送了四次请求,正常发送一次,重试三次。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RetryGatewayFilterFactory* 重试过滤器*/@GetMapping("/retry")public String retry(HttpServletResponse response) {log.info("重试机制");response.setStatus(502);return "重试机制";}}
spring:cloud:gateway:routes:  - id: 23uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/retryfilters:- name: Retryargs:retries: 3statuses: BAD_GATEWAY

RequestSizeGatewayFilterFactory

该过滤器表示设置允许接收最大请求包的大小,如果请求大小超过设置的值,则返回413 Payload Too Large。请求包默认大小为5M,单位是字节。

spring:cloud:gateway:routes:  - id: 24uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/requestSizefilters:- name: RequestSizeargs:maxSize: 2048 
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RequestSizeGatewayFilterFactory* 该过滤器表示能接收的请求包的大小,默认是5MB*/@PostMapping("/requestSize")public String requestSize(@RequestPart MultipartFile file) {return "文件大小为:" + file.getSize();}}

DefaultGatewayFilterFactory

前面写的都是针对某一路由生效的,若需要对全部路由生效,则可以使用该过滤器,这个过滤器就需要一个过滤列表,例如上述的重试过滤器、限流过滤器等等,就可以加入1到默认过滤器中,这样就可以对所有服务生效。

spring:cloud:gateway:default-filters:- name: Retryargs:retries: 3statuses: BAD_GATEWAY- name: RequestSizeargs:maxSize: 2048

 GlobalFilter

GloablFilter表示全局过滤器,他和GatewayFilter的作用是相同的,只不过GlobalFilter会作用到所有的路由请求上。全局过滤器常用于实现与安全性、性能监控和日志记录等相关的全局功能。

全局过滤器Gateway中也内置有许多,例如:

GatewayMetricsFilter:网关指标,提供监控指标。

ForwardRoutingFilter:用于本地forword,请求不转发到下游服务器。

LoadBalancerClientFilter:针对下游服务,实现负载均衡。

具体内容见官网。

自定义过滤器

自定义GatewayFilter

1. 继承AbstarctGatewayFilterFactory抽象类,并实现Orderd接口,而且自定义的类名必须以GatewayFilterFactory结尾。

2. 在自定义类内部新建一个Config类。

3. 重写apply方法,其中写的就是最重要的逻辑。

4. 空参构造方法,内部调用super。

5. 给Orderd赋值,值越小,优先级越高。

@Slf4j
@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> implements Ordered {public MyGatewayFilterFactory() {super(MyGatewayFilterFactory.Config.class);}@Overridepublic GatewayFilter apply(MyGatewayFilterFactory.Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("进入了自定义pre过滤器 + " + config.getName());ServerHttpRequest request = exchange.getRequest().mutate().headers((httpHeaders) -> {httpHeaders.add("name", config.getName());}).build();return chain.filter(exchange).then(Mono.fromRunnable(() -> {ServerHttpResponse response = exchange.getResponse();response.getHeaders().set("role", "admin");log.info("进入了自定义post过滤器");}));}};}@Overridepublic int getOrder() {return 0;}public static class Config{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}

测试:

如下配置中,表示在请求头中加入name:web的内容,在响应头中加入role:admin的内容,经过测试表明,想要加入的内容全部成功,证明自定义过滤器成功。

spring:cloud:gateway:routes:  - id: 25uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/myGatewayFilterfilters:- name: Myargs:name: wbz
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** 自定义的GatewayFilter* 在请求头上新增* 在响应头上新增*/@GetMapping("/myGatewayFilter")public String myGatewayFilter(HttpServletRequest request) {Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {String headerKey = headerNames.nextElement();String headerValue = request.getHeader(headerKey);log.info(headerKey + '\t' + headerValue);}return "成功";}}

自定义GloablFilter

1. 实现GlobalFilter接口和Orderd接口。

2. 重写apply方法。

3. 自定义Orderd值,表示执行顺序。

@Slf4j
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {exchange.getAttributes().put("begin", System.currentTimeMillis());return chain.filter(exchange).then((Mono.fromRunnable(() -> {Long begin = exchange.getAttribute("begin");if(begin != null) {log.info("接口的时间为:" + (System.currentTimeMillis() - begin));}})));}@Overridepublic int getOrder() {return 0;}}

启动项目之后随便找个接口进行测试,但是必须是走网关的接口,只要日志中出现下述内容就表示全局过滤器自定义成功。 

执行顺序

请求路由之后,会把该接口要经过的过滤器整合成一个链式结构,依次执行。每一个过滤器都有一个指定的order值,默认为0,表示该过滤器的优先级。值越小时,优先级越高,执行顺序越靠前。

假设order值相同时,按照默认过滤器 GatewayFilter GlobalFilter的顺序执行。

相关文章:

【微服务】网关 - Gateway(下)(day8)

网关过滤工厂 在上一篇文章中&#xff0c;主要是对网关进行了一个总体的介绍&#xff0c;然后对网关中的断言进行了一个描述。在这篇文章中&#xff0c;主要是对网关中的最后一大核心——过滤进行介绍。 当客户端发送过来的请求经过断言之后&#xff0c;如果还想在请求前后添…...

【C#】创建一个控制台应用程序来管理学生成绩

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 在C#中创建一个控制台应用程序来管理学生成绩编写程序程序解释 在C#中创建一个控制台应用程序来管理学生成绩 在这篇文章中&#xff0c;我将向你展示如何使用C#创建…...

鸿蒙开发之ArkUI 界面篇 三十四 容器组件Tabs 自定义TabBar

如果需要修改Tabs的图标和文字之间的距离我们该怎么办呢&#xff1f;好在tabBar是联合类型&#xff0c;提供了自定义tabBar&#xff0c;这里就可以显示特殊图标或者是文字图片&#xff0c;如下图&#xff1a; 这里定义了myBuilder的函数&#xff0c;用了 来修饰&#xff0c;没有…...

AI核身-金融场景凭证篡改检测YOLO原理

引言 YOLO (You Only Look Once) 模型是一种先进的实时目标检测算法&#xff0c;它在计算机视觉领域具有重要的地位。YOLO以其速度和准确性而闻名&#xff0c;能够快速识别图像和视频中的各种物体。这使得它在自动驾驶、安全监控、机器人技术、医学影像分析等众多领域都有着广…...

鹅厂JS面试题——0.1+0.2=0.3吗?

首先公布答案:在JavaScript 中&#xff0c;0.1 0.2 ≠ 0.3 为什么&#xff1f; JavaScript 中的数字使用 IEEE 754 标准的双精度浮点数&#xff08;64 位&#xff09;进行表示。这种表示方式在处理十进制小数时&#xff0c;不能精确地表示某些数字。比如0.1 和 0.2 这样的十进…...

软件功能测试重点和流程有哪些?专业软件测评服务公司推荐

软件功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。功能测试也叫黑盒测试或数据驱动测试&#xff0c;只需考虑需要测试的各个功能&#xff0c;不需要考虑整个软件的内部结构及代码.一般从软…...

【数据结构】AVL树(C++实现)

文章目录 前言AVL树节点的定义AVL树的插入AVL树的旋转AVL树的验证AVL树的删除AVL树的性能与源码 前言 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&…...

AMD新推EPYC与MI325X,挑战英伟达AI市场地位

在人工智能&#xff08;AI&#xff09;加速器领域&#xff0c;AMD近日于美国旧金山举办的“推进人工智能”&#xff08;Advancing AI Event&#xff09;活动中&#xff0c;宣布了一系列新产品的发布&#xff0c;直接对标英伟达&#xff0c;意图在AI芯片市场占据更大份额。 AMD新…...

电脑桌面文件不见了怎么恢复?8个方法帮你解决问题

电脑桌面文件突然不见了凭空消失了怎么恢复&#xff1f;电脑桌面文件日常使用电脑时&#xff0c;很多用户喜欢将重要文件、快捷方式存放在桌面上&#xff0c;以方便快速访问。然而&#xff0c;有时我们会突然发现桌面上的文件不见了。桌面文件消失可能有多种原因&#xff0c;例…...

如果想转行AI领域却不知如何开始?可以试试这五步,超详细_ai行业怎么入行

我看了计算机科学家大卫格维茨写的一篇博客&#xff0c;里面介绍了如果想从事AI行业&#xff0c;却不知道如何开始的话&#xff0c;可以走下面五步&#xff0c;从而达到转行的目的。因为这是个国外作家写的&#xff0c;跟我们国内的情况有一些出入&#xff0c;但是大思路是没有…...

个人博客搭建 | Hexo框架

文章目录 1.Hexo安装2.创建博客3.将博客通过GitHub来部署4.更换主题 1.Hexo安装 Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。搭建Hexo首先要…...

[Gtk] layout.ui

播放器layout&#xff1a; # <?xml version"1.0" encoding"UTF-8"?> <!-- Generated with glade 3.38.2 --> <interface> <requires lib"gtk" version"3.20"/> <object class"GtkWindow"…...

Spring MVC:精通JSON数据返回的几种高效方式

前言 在实际开发中&#xff0c;我们在前后端传送数据通常使用Json格式&#xff0c;而在Spring MVC中返回Json格式的方式有多种&#xff0c;接下来我将介绍其中一些。 准备工作 为了演示Json格式的数据&#xff0c;我们准备一个实体类&#xff0c;例如User&#xff0c;这些可以测…...

[LeetCode 题3] 没有重复字符的最长的子字符串

问题描述 输入&#xff1a;一个字符串 s。输出&#xff1a;最长的无重复字符的子串的长度。 示例 输入: s "abcabcbb" 输出: 3 解释: 最长的无重复字符的子串是 "abc"&#xff0c;长度为 3。 输入: s "bbbbb" 输出: 1 解释: 最长的无重复字…...

YoloDotNet 在工业检测中的应用详解

文章目录 一、数据收集与标注二、模型选择与训练三、检测流程设计四、结果评估与优化五、与工业生产线集成一、数据收集与标注 在工业检测中,首先需要收集大量的相关工业产品图像数据。这些数据应涵盖不同的产品类型、缺陷种类以及各种可能的生产状态。例如,对于电子产品的检…...

DataFrame增删改数据

目录 准备数据 DataFrame添加列 直接添加列数据 使用insert添加列数据 DataFrame删除行列 准备数据 删除行 删除列 DataFrame数据去重 准备数据 import pandas as pd df pd.read_csv("../data/b_LJdata.csv") df DataFrame添加列 直接添加列数据 1&…...

一站式解决App下载量统计,Xinstall引领新潮流

在移动应用市场中&#xff0c;App下载量是衡量应用受欢迎程度和市场表现的重要指标。然而&#xff0c;对于许多开发者而言&#xff0c;如何精准统计App下载量却是一个不小的挑战。幸运的是&#xff0c;如今有了一款专业的App全渠道统计服务商——Xinstall&#xff0c;它能够帮助…...

ijkMediaPlayer+ TextureView 等比全屏播放视频(避免拉伸)

TextureView默认以fitxy的方式加载surface数据&#xff0c;如果需要等比全屏播放视频&#xff0c;避免拉伸&#xff0c;可以采用Matrix对TextureView进行变换 废话不多说&#xff0c;直接上代码 public class BaseIjkPlayer implements TextureView.SurfaceTextureListener{/…...

【RS】GEE(Python):数据处理

在前面的章节中&#xff0c;我们已经学习了如何加载影像数据。现在&#xff0c;让我们进一步探讨如何在 Google Earth Engine (GEE) 中进行数据处理。数据处理通常包括图像预处理、裁剪、过滤、重采样等操作。 栅格影像的处理 栅格影像处理包括了裁剪、波段选择、重采样、合成…...

非线性磁链观测器推导

<div id"content_views" class"htmledit_views"><p id"main-toc"><strong>目录</strong></p> 电机方程 电压方程 磁链方程 定义状态变量和输出变量 非线性观测器方程 电角度的计算--锁相环 锁相环调参 电机…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...