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

[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网关(简称网关)也是一个服务,通常是后端服务的唯一入口,它的定义类似设计模式中的门面模式.它就类似与整个微服务架构的门面,所有的外部客户访问,都要经过它来进行调度和过滤.
在这里插入图片描述
网关核心功能:

  1. 权限控制: 作为微服务的入口,对于用户进行权限校验,如果校验失败则进行拦截.
  2. 动态路由: 一切请求先经过网关,但是网关不做业务处理,而是根据某种规则把请求转发到某个微服务.
  3. 负载均衡: 当路由的目标服务有多个时,还需要做负载均衡.
  4. 限流: 请求过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大.

常见的网关实现也有很多种,我们今天要讲的是Spring Cloud Gateway

2. Spring Cloud Gateway

2.1 快速上手

我们通过一下的演示,先来了解网关的基本功能.

  1. 创建网关项目
    API网关也是一个服务
    在这里插入图片描述
  2. 引入网关依赖
<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>
  1. 编写启动类
@SpringBootApplication
public class GateWayApplication {public static void main(String[] args) {SpringApplication.run(GateWayApplication.class,args);}
}
  1. 添加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参数指定的地址.
  1. 测试
    启动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提供一个函数式编程接口,它接受一个参数并返回一个布尔值,用于条件过滤,请求参数的校验.
代码演示:

  1. 定义一个Predicate
public class StringPredicate implements Predicate<String> {@Overridepublic boolean test(String s) {return s.isEmpty();}
}
  1. 使用这个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"));
}
  1. 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 代码演示

  1. 添加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该如何使用.

快速上手
  1. 在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 "接收参数成功";
}
  1. 测试
    发送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

快速上手
  1. 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. 添加配置
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).这允许通过向特定的端点发送请求来优雅地关闭应用程序.
  1. 测试
    重启网关,访问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详解

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

音叉模态分析

目录 0 序言 1 自由状态下模态求解 1.1 添加模态项目 1.2 生成网格 1.3 设置最大模态阶数 1.4 求解 1.5 结果查看 1.6 结果分析 2 音叉能否释放频率440Hz的音调 3 预应力模态求解 3.1 静态结构分析 3.1.1 添加静态结构项目 3.1.2生成网格 3.1.3添加边界条件 3.1…...

BW AO/工作簿权限配置

场景&#xff1a; 按事业部配置工作簿权限&#xff1b; 1、创建用户 事务码&#xff1a;SU01&#xff0c;用户主数据的维护&#xff0c;可以创建、修改、删除、锁定、解锁、修改密码等 用户设置详情页 2、创建权限角色 用户的权限菜单是通过权限角色分配来实现的 2.1、自定…...

C++ 字母大小写转换两种方法统计数字字符的个数

目录 题目&#xff1a; 代码1&#xff1a; 代码2&#xff1a; 题目描述输入一行字符&#xff0c;统计出其中数字字符的个数。 代码如下&#xff1a; 判断⼀个字符是否是数字字符有⼀个函数是 isdigit ,可以直接使⽤。 代码如下&#xff1a; 题目&#xff1a; 大家都知道…...

如何使用 ChatBox AI 简化本地模型对话操作

部署模型请看上一篇帖子&#xff1a;本地部署DeepSeek教程&#xff08;Mac版本&#xff09;-CSDN博客 使用 ChatBox AI 简化本地模型对话操作&#xff1a; 打开 ChatBox AI 官网&#xff1a;Chatbox AI官网&#xff1a;办公学习的AI好助手&#xff0c;全平台AI客户端&#xf…...

前端面试笔试题目(一)

以下模拟了大厂前端面试流程&#xff0c;并给出了涵盖HTML、CSS、JavaScript等基础和进阶知识的前端笔试题目&#xff0c;以帮助你更好地准备面试。 面试流程模拟 1. 自我介绍&#xff08;5 - 10分钟&#xff09;&#xff1a;面试官会请你进行简单的自我介绍&#xff0c;包括…...

Docker Hello World

Docker Hello World 引言 Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。本文将带领您从零开始,学习如何使用 Docker 运行一个简单的 "Hello World"…...

UE 5.3 C++ 对垃圾回收的初步认识

一.UObject的创建 UObject 不支持构造参数。 所有的C UObject都会在引擎启动的时候初始化&#xff0c;然后引擎会调用其默认构造器。如果没有默认的构造器&#xff0c;那么 UObject 将不会编译。 有修改父类参数的需求&#xff0c;就使用指定带参构造 // Sets default value…...

ARM内核:嵌入式时代的核心引擎

引言 在当今智能设备无处不在的时代&#xff0c;ARM&#xff08;Advanced RISC Machines&#xff09;处理器凭借其高性能、低功耗的特性&#xff0c;成为智能手机、物联网设备、汽车电子等领域的核心引擎。作为精简指令集&#xff08;RISC&#xff09;的典范&#xff0c;ARM核…...

需求分析应该从哪些方面来着手做?

需求分析一般可从以下几个方面着手&#xff1a; 业务需求方面 - 与相关方沟通&#xff1a;与业务部门、客户等进行深入交流&#xff0c;通过访谈、问卷调查、会议讨论等方式&#xff0c;明确他们对项目的期望、目标和整体业务需求&#xff0c;了解项目要解决的业务问题及达成的…...

【Unity2D 2022:C#Script】DoTween插件的使用

一、插件介绍 DOTween 是一个快速、高效、完全类型安全的 Unity 面向对象的动画引擎&#xff0c;针对 C# 用户进行了优化&#xff0c;免费和开源&#xff0c;具有大量高级功能 二、插件的下载 1. DoTween官网&#xff1a;DOTween (HOTween v2) 2. DoTween下载&#xff1a; …...

【Docker】ubuntu中 Docker的使用

之前记录了 docker的安装 【环境配置】ubuntu中 Docker的安装&#xff1b; 本篇博客记录Dockerfile的示例&#xff0c;docker 的使用&#xff0c;包括镜像的构建、容器的启动、docker compose的使用等。   当安装好后&#xff0c;可查看docker的基本信息 docker info ## 查…...

【数据结构篇】时间复杂度

一.数据结构前言 1.1 数据结构的概念 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结构&#xff0c; 如&#xff1a…...

linux 环境安装 dlib 的 gpu 版本

默认使用 pip 安装的 dlib 是不使用 gpu 的 在国内社区用百度查如何安装 gpu 版本的 dlib 感觉信息都不太对&#xff0c;都是说要源码编译还有点复杂 还需要自己安装 cuda 相关的包啥的&#xff0c;看着就头大 于是想到这个因该 conda 自己就支持了吧&#xff0c;然后查了一下…...

springboot集成钉钉,发送钉钉日报

目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api&#xff0c;主要用到以下几个api&#xff1a; ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…...

【机器学习】自定义数据集 使用scikit-learn中svm的包实现svm分类

一、支持向量机(support vector machines. &#xff0c;SVM)概念 1. SVM 绪论 支持向量机&#xff08;SVM&#xff09;的核心思想是找到一个最优的超平面&#xff0c;将不同类别的数据点分开。SVM 的关键特点包括&#xff1a; ① 分类与回归&#xff1a; SVM 可以用于分类&a…...

快速提升网站收录:利用网站历史数据

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/38.html 利用网站历史数据可以有效提升网站的收录速度&#xff0c;以下是一些具体的策略和方法&#xff1a; 一、理解网站历史数据的重要性 网站历史数据记录了网站过去的运营情况、用户行…...

【Git】初识Git Git基本操作详解

文章目录 学习目标Ⅰ. 初始 Git&#x1f4a5;注意事项 Ⅱ. Git 安装Linux-centos安装Git Ⅲ. Git基本操作一、创建git本地仓库 -- git init二、配置 Git -- git config三、认识工作区、暂存区、版本库① 工作区② 暂存区③ 版本库④ 三者的关系 四、添加、提交更改、查看提交日…...

Python NumPy(11):NumPy 排序、条件筛选函数

1 NumPy 排序、条件筛选函数 NumPy 提供了多种排序的方法。 这些排序函数实现不同的排序算法&#xff0c;每个排序算法的特征在于执行速度&#xff0c;最坏情况性能&#xff0c;所需的工作空间和算法的稳定性。 下表显示了三种排序算法的比较。 种类速度最坏情况工作空间稳定性…...

AJAX综合案例——图书管理

黑马程序员视频地址&#xff1a; AJAX-Day02-10.案例_图书管理AJAX-Day02-10.案例_图书管理_总结_V1.0是黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖的第25集视频&#xff0c…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...