Gateway 网关 快速开始
一、核心概念
- 路由(route)
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的 URL 和配置的路由匹配。
- 断言(predicates)
断言函数允许开发者去定义匹配 Http Request 中的任何信息,比如请求头和参数等。
- 过滤器(Filter)
SpringCloud Gateway 中的 filter 分为 Gateway FilIer和 Global Filter。Filter 可以对请求和响应进行处理。
二、快速开始
假设我们现在有一个父工程 mall4cloud,它有一个子模块 user,现在我们要新建一个网关项目,以便对 user 的路由转发以及后续的认证授权。
user 对外提供服务:
// 请求路径为 http://localhost:8020/user/findUserById/1
@RestController
@RequestMapping("/user")
public class UserController {@Value("${server.port}")private String port;@RequestMapping("/findUserById/{id}")public String findUserById(@PathVariable String id) {// 模拟从数据库获取用户Map<String, String> map = new HashMap<>();map.put("1", "小林:"+port);map.put("2", "小王:"+port);return map.get(id);}}
-----------------application.yml-----------------
server:port: 8020spring:cloud:nacos:discovery:username: nacospassword: nacosgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848application:name: user-service
三、项目搭建
3.1、新建一个子模块 gateway
3.2、引入依赖
<!--Spring Cloud Gateway 网关场景启动器 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
3.3、修改 application.yml
server:port: 8050spring:application:name: api-gatewaycloud:gateway:routes: # 路由数组[路由-就是指定当请求满足什么条件的时候请求转发到哪个微服务]- id: user_route # 当前路由的标识, 要求唯一uri: http://localhost:8020 # 请求要转发到的地址order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言[就是路由转发要满足的条件]- Path=/user-service/** # 当请求路径满足 Path 指定的规则时,才进行路由转发filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 # 转发之前去掉1层路径
配置参数,都在 RouteDefinition 类里面:
@Validated public class RouteDefinition {private String id;private @NotEmpty @Valid List<PredicateDefinition> predicates = new ArrayList();private @Valid List<FilterDefinition> filters = new ArrayList();private @NotNull URI uri;private Map<String, Object> metadata = new HashMap();private int order = 0;//...... }
3.4、访问测试
启动 user、gateway,浏览器访问:http://localhost:8050/user-service/user/findUserById/1
请求先到达 gateway 8050,gateway 根据断言 predicates 判断当前请求路径是否满足 Path 指定的规则(匹配以 /user-service/ 开头的任意路径,/user-service/a, /user-service/a/b 都满足要求,但 http://localhost:8050/a/user-service/b 不满足要求),当前请求满足断言规则,请求需要转发到 http://localhost:8020/user-service/user/findUserById/1,在请求转发之前经过 StripPrefixGatewayFilterFactory 过滤器对请求路径进行加工,去掉1层路径,请求变为http://localhost:8020/user/findUserById/1 访问到 UserController#findUserById。
修改一下路径:http://localhost:8050/a/user-service/user/findUserById/1
当前配置存在一个问题:
当我的 user 服务有多个的时候,比如 8020、8021 当前配置无法进行负载均衡的访问。
四、接入 Nacos
4.1、引入 Nacos 依赖
<dependencies><!--Spring Cloud Gateway 网关场景启动器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--Spring Cloud Alibaba Nacos 注册中心客户端 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 新版本的 Nacos 不再依赖 Ribbon --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>
</dependencies>
4.2、修改 application.yml
server:port: 8050spring:application:name: api-gatewaycloud:nacos:discovery: # nacos 注册中心地址username: nacospassword: nacosgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848gateway:routes: # 路由数组[路由-就是指定当请求满足什么条件的时候请求转发到哪个微服务]- id: user_route # 当前路由的标识, 要求唯一uri: lb://user-service # 请求要转发到的地址order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言[就是路由转发要满足的条件]- Path=/user-service/** # 当请求路径满足 Path 指定的规则时,才进行路由转发filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 # 转发之前去掉1层路径
uri 改为 lb://user-service
user-service 是 nacos 注册的服务名。
lb 表示负载均衡(loadbalance)地访问 user-service。
4.3、启动服务
启动两个 user 服务:user-8020、user-8021
可以通过在 8020 右键-Copy Configuration 配置 VM Options 来启动多个服务实例。
4.4、访问测试
多次访问 http://localhost:8050/user-service/user/findUserById/1
会发现,用户服务在 8020、8021 之间来回切换。
五、自动寻找服务
如果请求的路径,是严格按照 网关地址/微服务名/接口的格式,那 yml 配置可以简化为:
server:port: 8050spring:application:name: api-gatewaycloud:nacos:discovery:username: nacospassword: nacosgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: true
访问的结果没有任何差别。
六、路由断言工厂(Route Predicate Factories)
- 作用
路由断言工厂根据请求的各种属性(如路径、请求方法、请求头、请求参数等)来判断请求是否符合预设的条件。如果请求满足断言工厂定义的条件,那么该请求就会被路由到对应的目标URI。如果不满足,则返回 404。
6.1、基于Datetime类型的断言工厂
6.1.1、AfterRoutePredicateFactory
// 假设我现在时间是:
ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(dateTime);2025-04-05T15:36:10.158+08:00[Asia/Shanghai]
server:port: 8050spring:application:name: api-gatewaycloud:nacos:discovery:username: nacospassword: nacosgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848gateway:routes:- id: after_routeuri: lb://user-servicepredicates:- After=2025-04-05T14:36:10.158+08:00[Asia/Shanghai]filters:- StripPrefix=1
访问 http://localhost:8050/user-service/user/findUserById/1
- 修改时间
After=2025-04-05T16:36:10.158+08:00[Asia/Shanghai]
当前时间 没有 After 配置的时间,访问 404。
6.1.2、BeforeRoutePredicateFactory
接收一个日期参数(ZonedDateTime),判断请求日期是否早于指定日期。
Before=2025-04-05T16:36:10.158+08:00[Asia/Shanghai]

6.1.3、BetweenRoutePredicateFactory
Between=2025-04-05T14:36:10.158+08:00[Asia/Shanghai],2025-04-05T16:36:10.158+08:00[Asia/Shanghai]
6.2、CookieRoutePredicateFactory
# 判断 Cookie 中是否有 token 这个参数
# 且 token 的值要符合 UUID 格式
Cookie=token,^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
直接请求 http://localhost:8050/user-service/user/findUserById/1
加上 Cookie:
6.3、HeaderRoutePredicateFactory
接收两个参数,Header 字段名和正则表达式。判断请求头中是否具有给定字段名且字段值与正则表达式匹配。
# \d+ 表示数字的正则
Header=X-Request-Id,\d+
6.4、HostRoutePredicateFactory
接收一个参数,主机名模式列表。判断请求的 Host 是否满足匹配规则。
Host=**.somehost.org,**.anotherhost.org
www.somehost.org 或者 beta.somehost.org 或者 www.anotherhost.org 域名的请求都能匹配。
6.5、MethodRoutePredicateFactory
接收一个参数,判断请求类型是否跟指定的类型匹配。
Method=POST
GET 请求:
POST 请求:
6.6、PathRoutePredicateFactory
接收一个参数,判断请求的URI部分是否满足路径规则列表中的一个。
# {segment} 占位符
Path=/user-service/user/findUserById/{segment}
6.7、QueryRoutePredicateFactory
接收两个参数,一个必填的请求参数和一个可选的正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。
# . 表示任意一个字符
- Query=green,gree.
请求 http://localhost:8050/user-service/user/findUserById/1?green=greet

6.8、RemoteAddrRoutePredicateFactory
接收一个IP地址段,判断请求主机地址是否在地址段中。
# 假设我本机IP是 192.168.101.2
# /24 表示子网掩码的长度为 24 位
# 范围为 192.168.101.1 到 192.168.101.254
# 去掉网络地址 192.168.101.0
# 去掉广播地址 192.168.101.255
RemoteAddr=192.168.101.1/24
6.9、WeightRoutePredicateFactory
接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发。
server:port: 8050spring:application:name: api-gatewaycloud:nacos:discovery:username: nacospassword: nacosgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848gateway:routes:- id: user-highuri: http://localhost:8020predicates:- Weight=user,8filters:- StripPrefix=1- id: user-lowuri: http://localhost:8021predicates:- Weight=user,2filters:- StripPrefix=1
权重是相对权重。像上面 user 群里,只有 8020、8021 两个服务。它们权重比值 8:2。
则 80%的请求会被路由到 8020。
七、自定义路由断言工厂
假设我们现在有一个断言,它会根据请求头里面有没有我们配置的用户权限,来决定路由转发。
Authorization=user.add,user.get,user.delete,user.update
POST http://localhost:8050/user-service/user/findUserById/1
Authorization: user.get
我们看看在这个场景下,用自定义路由断言工厂怎么来实现。
7.1、步骤
自定义路由断言工厂步骤如下:
- 必须是 Spring 组件 Bean。
- 类必须加上 RoutePredicateFactory 作为结尾。
- 必须继承 AbstractRoutePredicateFactory。
- 必须声明静态内部类,声明属性来接收配置文件中对应的断言的信息。
- 需要结合 shortcutFieldOrder 进行绑定。
- 重写 apply 方法。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息进行逻辑判断。true 表示匹配成功,进行路由转发;false 表示匹配失败,返回 404。
可以参考 Spring Gateway 已有的路由断言工厂 HostRoutePredicateFactory、HeaderRoutePredicateFactory、PathRoutePredicateFactory 等来写。
// 1、必须是 Spring 组件 Bean:@Component
// 2、类必须加上 RoutePredicateFactory 作为结尾:AuthorizationRoutePredicateFactory
// 3、必须继承 AbstractRoutePredicateFactory
@Component
public class AuthorizationRoutePredicateFactory extends AbstractRoutePredicateFactory<AuthorizationRoutePredicateFactory.Config> {public AuthorizationRoutePredicateFactory() {super(Config.class);}// 5、如果配置信息是逗号隔开的数组,这个方法不能少public ShortcutConfigurable.ShortcutType shortcutType() {return ShortcutType.GATHER_LIST;}// 5、需要结合 shortcutFieldOrder 进行绑定public List<String> shortcutFieldOrder() {return Collections.singletonList("auths");}// 6、重写 apply 方法@Overridepublic Predicate<ServerWebExchange> apply(Config config) {final boolean hasList = !ObjectUtils.isEmpty(config.auths);return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange exchange) {// 拿到请求头配置的 Authorization 字段值List<String> values = exchange.getRequest().getHeaders().getOrDefault("Authorization", Collections.emptyList());if (values.isEmpty()) {return false;} else if (hasList) {for (String value : values) {// 判单请求中是否包含配置的权限if (config.auths.contains(value)) {return true;}}return false;} else {return true;}}public String toString() {return String.format("Authorization= %s", config.auths);}};}// 4、必须声明静态内部类@Validatedpublic static class Config {// 4、声明属性来接收配置文件中对应的断言的信息// 接收 Authorization= 后面的 user.add,user.get,user.delete,user.update 信息private @NotEmpty List<String> auths = new ArrayList<>();public Config() {}public @NotEmpty List<String> getAuths() {return auths;}public Config setAuths(List<String> auths) {this.auths = auths;return this;}public Config setAuths(String... auths) {this.auths = Arrays.asList(auths);return this;}}
}
八、过滤器工厂(GatewayFilter Factories)
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器作用于特定的路由。Spring Cloud Gateway 包含许多内置的过滤器工厂。
8.1、AddRequestHeaderGatewayFilterFactory
为原始请求添加Header。接收两个参数,Header 字段名和字段值。
spring:cloud:gateway:routes:- id: user_routeuri: lb://user-servicepredicates:- Path=/user-service/**filters:- StripPrefix=1- AddRequestHeader=Authorization,feign123
请求到达 Gateway,在请求头增加 Authorization=feign123,在 user 校验这个 token
@RestController
@RequestMapping("/user")
public class UserController {@Value("${server.port}")private String port;@RequestMapping("/findUserNeedAuth/{id}")public String findUserNeedAuth(@PathVariable String id, @RequestHeader("Authorization") String token) {if (StringUtils.isBlank(token)) {throw new IllegalArgumentException("参数缺失!");}// 校验tokenif (!"feign123".equals(token)) {throw new IllegalArgumentException("token错误!");}// 模拟从数据库获取用户Map<String, String> map = new HashMap<>();map.put("1", "小林:"+port);map.put("2", "小王:"+port);return map.get(id);}
}
8.2、AddRequestParameterGatewayFilterFactory
为原始请求添加请求参数。接收两个参数,参数名称和值。
spring:cloud:gateway:routes:- id: user_routeuri: lb://user-servicepredicates:- Path=/user-service/**filters:- StripPrefix=1- AddRequestParameter=source,gateway
@RestController
@RequestMapping("/user")
public class UserController {@Value("${server.port}")private String port;@RequestMapping("/echo")public String echo(@RequestParam("source") String source) {return port + " 收到 " + source + " 转发过来的请求";}
}
8.3、PrefixPathGatewayFilterFactory
为原始请求路径添加前缀。接收一个参数,前缀路径。
假设我们现在 user 模块配置了请求上下文路径。
server:port: 8020servlet:context-path: /mall4user
请求路径为 http://localhost:8020/mall4user/user/findUserById/1
网关想继续能转发请求成功,则需要:
spring:cloud:gateway:routes:- id: user_routeuri: lb://user-servicepredicates:- Path=/user-service/**filters:- StripPrefix=1- PrefixPath=/mall4user
http://localhost:8050/user-service/user/findUserById/1
http://localhost:8050/user-service/user/findUserById/1
请求到达网关,先经过 StripPrefix 过滤器,变为:
http://localhost:8050/user/findUserById/1
再经过 PrefixPath 过滤器,变为:
http://localhost:8050/mall4user/user/findUserById/1
最后经过 ReactiveLoadBalancerClientFilter 全局过滤器,根据负载均衡策略,
将请求转发到
http://localhost:8020/mall4user/user/findUserById/1 或
http://localhost:8021/mall4user/user/findUserById/1
九、自定义过滤器工厂
假设现在我们需要统计某一个微服务的访问量,并将统计数据存放到 Redis。
我们看看在这个场景下,用自定义过滤器工厂怎么来实现。
9.1、引入 Redis 依赖
- pom.xml
<!-- redis 场景启动器-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- application.yml
spring:redis:host: localhostport: 6379
- RedisConfig
@Configuration
public class RedisConfig {/*** 配置 Redis 连接工厂* @return LettuceConnectionFactory 实例*/@Beanpublic RedisConnectionFactory redisConnectionFactory() {// 使用 Lettuce 作为 Redis 客户端创建连接工厂return new LettuceConnectionFactory();}/*** 配置 RedisTemplate* @param redisConnectionFactory Redis 连接工厂* @return RedisTemplate 实例*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(redisConnectionFactory);// 设置键的序列化器为 StringRedisSerializertemplate.setKeySerializer(new StringRedisSerializer());// 设置值的序列化器为 GenericJackson2JsonRedisSerializer,支持 JSON 序列化template.setValueSerializer(new GenericJackson2JsonRedisSerializer());// 设置哈希键的序列化器为 StringRedisSerializertemplate.setHashKeySerializer(new StringRedisSerializer());// 设置哈希值的序列化器为 GenericJackson2JsonRedisSerializertemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());// 初始化模板template.afterPropertiesSet();return template;}
}
9.2、步骤
跟自定义路由断言工厂类似,自定义过滤器工厂步骤如下:
- 必须是 Spring 组件 Bean。
- 类必须加上 GatewayFilterFactory 作为结尾。
- 必须继承 AbstractGatewayFilterFactory。
- 必须声明静态内部类,声明属性来接收配置文件中对应的断言的信息。
- 需要结合 shortcutFieldOrder 进行绑定。
- 重写 apply 方法。
@Component
public class RequestStatsGatewayFilterFactory extends AbstractGatewayFilterFactory<RequestStatsGatewayFilterFactory.Config> {public RequestStatsGatewayFilterFactory() {super(Config.class);}@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public List<String> shortcutFieldOrder() {return Collections.singletonList("service");}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {Long count = redisTemplate.opsForValue().increment(config.service);System.out.println(count);return chain.filter(exchange);};}public static class Config {private String service;public Config() {}public String getService() {return service;}public void setService(String service) {this.service = service;}}
}
9.3、配置路由过滤器
server:port: 8050spring:application:name: api-gatewaycloud:nacos:discovery:username: nacospassword: nacosgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848gateway:routes:- id: user_routeuri: lb://user-servicepredicates:- Path=/user-service/**filters:- StripPrefix=1- RequestStats=user-service # 自定义路由过滤器redis:host: localhostport: 6379
9.4、访问测试
在浏览器中多次访问 http://localhost:8050/user-service/user/findUserById/1
Redis 统计数据:
十、全局过滤器
全局过滤器:针对所有路由请求,一旦定义就会投入使用。
10.1、ReactiveLoadBalancerClientFilter
负载均衡过滤器,它主要是做两件事情:
- 判断请求路径是否 lb 开头
- 调用负载均衡器实现进行负载均衡的请求。
spring: gateway:routes:- id: user_routeuri: lb://user-servicepredicates:- Path=/user-service/**
十一、自定义全局过滤器
相关文章:
Gateway 网关 快速开始
一、核心概念 路由(route) 路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的 URL 和配置的路由匹配。 断言(predicates) 断言函数允许开发者去定义匹配 Http Request 中…...
C++中如何使用STL中的list定义一个双向链表,并且实现增、删、改、查操作
一、STL中的 list 是双向链表,但不是循环链表,通过指针访问结点数据,它的内存空间可以是不连续的,使用它能高效地进行各种操作。 二、代码 #include <bits/stdc.h> using namespace std;// 打印链表元素的函数 void print…...
shell脚本中捕获键盘中断信号trap
在 Shell 脚本中,可以通过 trap 命令捕获键盘中断信号(通常是 SIGINT,即 CtrlC)。以下是具体的实现方法: 1.使用 trap 捕获键盘中断信号 trap 命令用于捕获信号并执行相应的命令或函数。SIGINT(信号编号为 …...
让ChatGPT用DeepReaserch指导进行学术写作
目录 ChatGPT在学术论文写作中的作用与分阶段提示词指南 1.选题阶段(确定研究课题方向) 2.文献综述阶段(调研与综述已有研究) 3.研究设计阶段(设计研究方法与框架) 4.撰写正文阶段(撰写各部…...
Compose笔记(十四)--LazyColumn
这一节了解一下Compose中的LazyColumn,在Jetpack Compose 中,LazyColumn 是一个用于高效显示长列表或可滚动垂直布局的组件。它类似于传统 Android 开发中的 RecyclerView,但专为 Compose 的声明式 UI 框架设计,能够显著优化性能&…...
CNN-SE-Attention-ITCN多特征输入回归预测(Matlab完整源码和数据)
CNN-SE-Attention-ITCN多特征输入回归预测(Matlab完整源码和数据) 目录 CNN-SE-Attention-ITCN多特征输入回归预测(Matlab完整源码和数据)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.一种适合光伏功率回归预测的高创…...
Spring Data JPA中的List底层:深入解析ArrayList的奥秘!!!
🌟 Spring Data JPA中的List底层:深入解析ArrayList的奥秘 💡 你是否好奇过,为什么Spring Data JPA的查询方法返回的List<T>总是默认为ArrayList?本文将通过技术原理解析、验证实验和性能优化指南,为…...
redis高并发缓存架构与性能优化
Redlock实现原理 超过半数redis节点加锁成功才算成功加锁。 Redlock存在问题 如果主节点挂掉,还没有同步到从节点,重新选举出主节点,那加锁就没有加到这个新的主节点上。 如果增加redis主节点数,那么加锁的性能更差,要…...
解锁多邻国:全方位语言学习新体验
解锁多邻国:全方位语言学习新体验 在数字化学习浪潮中,多邻国(Duolingo)凭借独特优势,成为全球超 5 亿用户的语言学习首选。这款 2012 年诞生于美国匹兹堡的应用,2019 年进入中国市场后,…...
Docker部署SeraXNG接入dify报错解决
报错: 设置授权 配置凭据后,工作区中的所有成员都可以在编排应用程序时使用此工具。 SearXNG base URL* 如何获取 PluginInvokeError: {"args":{},"error_type":"ToolProviderCredentialValidationError","message&q…...
Zookeeper的作用详解
Zookeeper作为分布式协调服务,在分布式系统中承担核心协调角色,其作用可归纳为以下核心功能模块: 一、分布式协调与同步 分布式锁管理 提供独占锁和共享锁,通过创建临时顺序节点实现锁的公平竞争。例如,客户端在/distr…...
高频面试题(含笔试高频算法整理)基本总结回顾34
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
Dify 与 n8n 对比分析:AI 应用开发与自动化工作流工具的深度比较
Dify 与 n8n 对比分析:AI 应用开发与自动化工作流工具的深度比较 摘要 本文对比分析了 Dify 和 n8n 两款工具的核心定位、功能特点、适用场景及技术门槛。Dify 专注于 AI 应用开发,适合快速搭建智能客服、知识库检索等场景;n8n 则定位于通用…...
Systemd构建容器化微服务集群管理系统
实训背景 你是一家云计算公司的 DevOps 工程师,需为某客户设计一套基于 Docker 的微服务集群管理系统,需求如下: 容器自启管理:确保三个服务(webapp、api、redis)在系统启动时自动运行。依赖顺序控制&…...
手搓多模态-04 归一化介绍
在机器学习中,归一化是一个非常重要的工具,它能帮助我们加速训练的速度。在我们前面的SiglipVisionTransformer 中,也有用到归一化层,如下代码所示: class SiglipVisionTransformer(nn.Module): ##视觉模型的第二层&am…...
nano 编辑器的使用
nano 编辑器的使用 1. 启动 nano2. 编辑文本3. 基本操作4. 保存和退出5. 其他常用快捷键6. 高级用法 nano 是一个简单易用的文本编辑器,适合初学者使用: 1. 启动 nano 在终端中输入 nano 命令,后面可以跟上你想要编辑的文件的名称。如果文件…...
如何搞定学习人工智能所需的数学?
一、明确AI所需的数学核心领域 AI的数学需求并非泛泛而谈,而是集中在几个核心领域。以下是按优先级排序的关键知识点: 线性代数 核心概念:向量、矩阵、特征值分解、奇异值分解(SVD)。应用场景:图像处理&a…...
TCP/IP五层协议
目录 1. 五层模型结构 2. 各层核心功能与协议 (1) 应用层(Application Layer) (2) 传输层(Transport Layer) (3) 网络层(Network Layer) (4) 数据链路层(Data Link Layer) (5…...
解决Opencv:TypeError: points is not a numerical tuple
最近刚开始学习Opencv,跟着b站阿婆主敲代码的时候,又又又又,又出现了bug,下面听我娓娓道来~~ --------------------------------------------------------------------------(手动分界线) 首先描述一下当时…...
LLM-大语言模型浅谈
目录 核心定义 典型代表 核心原理 用途 优势与局限 未来发展方向 LLM(Large Language Model)大语言模型,指通过海量文本数据训练 能够理解和生成人类语言的深度学习模型。 核心定义 一种基于深度神经网络(如Transformer架…...
LeetCode第132题_分割回文串II
LeetCode 第132题:分割回文串 II 题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 难度 困难 题目链接 点击在LeetCode中查看题目 示例 示例 1: 输入…...
【Leetcode 每日一题】368. 最大整除子集
问题背景 给你一个由 无重复 正整数组成的集合 n u m s nums nums,请你找出并返回其中最大的整除子集 a n s w e r answer answer,子集中每一元素对 ( a n s w e r [ i ] , a n s w e r [ j ] ) (answer[i], answer[j]) (answer[i],answer[j]) 都应当…...
python三大库之---pandas(二)
python三大库之—pandas(二) 文章目录 python三大库之---pandas(二)六,函数6.1、常用的统计学函数6.2重置索引 六,函数 6.1、常用的统计学函数 函数名称描述说明count()统计某个非空值的数量sum()求和mea…...
消防车调度问题:基于Matlab的优化求解
摘要 本文聚焦消防车调度问题,介绍如何将其转化为数学模型并利用Matlab进行求解。通过建立损失矩阵,以总损失最小为目标构建线性规划模型,并针对模型求解结果可能出现的不合理情况,增加消防车到达先后次序约束条件。 关键词&…...
批量将 Markdown 转换为 Word/PDF 等其它格式
在工作当中,我们经常会接触到 Markdown 格式的文档。这是一种非常方便我们做记录,做笔记的一种格式文档。现在很多互联网编辑器都是支持 Markdown 格式的,编辑起文章来更加的方便简介。有时候,我们会碰到需要将 Markdown 格式的文…...
C语言学习笔记-9
九、结构体 构造类型: 不是基本类型的数据结构也不是指针类型, 它是若干个相同或不同类型的数据构成的集合 结构体类型: 结构体是一种构造类型的数据结构,是一种或多种基本类型或构造类型的数据的集合。 1.结构体类型定义 定…...
LLM 部署(1)——LLM 部署框架对比
1 Ollama 一个专注于简化大型语言模型(LLM)在本地部署和运行的开源框架。 简化部署:Ollama使用Docker容器技术来简化LLM的部署过程 捆绑模型组件:Ollama将模型权重、配置和数据捆绑到一个包中,称为Modelfile…...
Qt坐标体系,控件坐标的设置
Qt窗口坐标体系---平面直角坐标系(笛卡尔坐标系) 以左上角为0,0坐标原点 给Qt的某个控件,设置位置,就需要指定坐标,对应这个控件来说,坐标系原点就是相对于父控件的 如: QPushButt…...
大数据系列之:Kerberos
大数据系列之:Kerberos 基本概念工作流程安全特性应用场景总结加密原理Kerberos认证流程更改您的密码授予账户访问权限票证管理Kerberos 票据属性使用 kinit 获取票据使用 klist 查看票据使用 kdestroy 销毁票据.k5identity 文件描述 Kerberos 是一种网络认证协议&a…...
【力扣hot100题】(059)单词搜索
这道题给我最大的启示就是不要什么时候都用哈希表,偶尔也要用用数组…… 是这样,一开始还沾沾自喜的以为知道了哈希表的自己一定可以比以前傻傻用数组的我要节省空间,结果发现哈希表不能存储pair用编号存储会时间超限用数组只需要7*7的空间。…...
Java全栈面试宝典:锁机制与Spring生命周期深度解析
目录 一、synchronized锁状态机全解析 🔥 问题5:synchronized四态转换与性能对比 锁状态转换流程图 锁特性对比表 CAS操作示例 二、ReentrantLock与synchronized深度对比 🔥 问题6:两大锁机制对比 核心差异矩阵 生产级Re…...
15分钟完成Odoo18.0安装与基本配置
序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo18发行已半年有余,不少企业也已上至生产环境进行使用了。今天我们来看看 Odoo18的安装。 本次安装我们介绍通过阿里云服务器安装Odoo18社区版。 1.服务器准备 1.1操作系统 操作系统使用ubuntu22.04ÿ…...
pom导包成功,但是就是无法使用相关类,同时报错:Library:Maven ‘xxx‘ has broken path
开发环境:Intellij 2023 一、问题记录 在maven工程的pom文件导入如下某一依赖(JGit)。没有显示导包的错误,同时在maven仓库里面找到对应的包是正常下载到相应jar的。 但是就是无法引入相关的类。打开Project Structure,在Dependencies中发现…...
Cocos Creator 进行 Web 发布后,目录结构解析
在使用 Cocos Creator 进行 Web 发布后,生成的目录结构通常包含以下内容,下面为你详细介绍: 1. index.html 这是 Web 项目的入口 HTML 文件,它会加载所需的 JavaScript 文件和资源,从而启动游戏或应用程序。示例代码…...
Linux-磁盘管理
文章目录 1、查看磁盘和文件(夹)使用情况2、磁盘分区1)查看分区情况2)MBR分区3)GPT分区 3、磁盘分区格式化4、磁盘挂载1)挂载2)卸载挂载点3)永久挂载 1、查看磁盘和文件(…...
P1149 [NOIP 2008 提高组] 火柴棒等式(DFS)
题目描述 给你 n 根火柴棍,你可以拼出多少个形如 ABC 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。用火柴棍拼数字 0∼9 的拼法如图所示: 注意: 加号与等号…...
机器学习新范式:Kubernetes + Kubeflow,解锁模型训练与部署的高效密码
一、Kubernetes在机器学习模型训练与部署中的作用 Kubernetes作为一个强大的容器编排平台,为机器学习模型的训练与部署提供了以下核心支持: 分布式训练支持:Kubernetes能够自动化部署和管理PyTorch等机器学习框架的分布式训练任务。通过利用…...
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡 直接修改苹果IPA包的签名和打包信息并不是一个推荐的常规做法,因为这可能违反苹果的开发者条款,并且可能导致…...
SpringSecurity框架入门
简介 官网 Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。它支持多种…...
AIDD-人工智能药物设计-双扩散模型结合多目标优化策略助力3D小分子药物设计
Adv. Sci. | 双扩散模型结合多目标优化策略助力3D小分子药物设计 药物发现中,如何精准且高效地设计具有理想物理化学性质的潜在药物分子,对当前的研究水平来说仍然是一项重大挑战。近年来,基于深度学习的全新分子生成(de novo molecular generation)方法取得了显著进展,…...
Python面向对象编程 - 接口隔离原则(ISP)
1. 原则定义 接口隔离原则(Interface Segregation Principle, ISP) 是SOLID原则中的"I",核心思想是: 客户端不应该被迫依赖它们不使用的接口 即:多个特定功能的接口比一个通用接口更好 2. 核心思想 将臃肿的接口拆分为更小、更具…...
mac安装浏览器闪退处理
安装 Chrome或edge后打开浏览器出现闪退,是因为权限不够。 以下是针对edge的处理方法。 sudo chown -R $(whoami) ~/Library/Application\ Support/Microsoft\ Edge sudo chmod -R 755 ~/Library/Application\ Support/Microsoft\ Edge 原因分析: 在…...
408 计算机网络 知识点记忆(5)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...
Java面试黄金宝典38
1. TIME_WAIT 和 CLOSE_WAIT 的区别 定义 TIME_WAIT:是主动发起关闭连接操作的一方,在发送最后一个 ACK 确认包之后进入的状态。此状态存在的意义在于确保对端能收到最后一个 ACK 包,同时让网络中可能残留的旧数据包自然消逝,防止其干扰后续相同四元组(源 IP、源端口、目…...
【算法】筛质数
目录 埃氏筛法算法原理代码 欧拉筛法算法原理代码 埃氏筛法 算法原理 算法思想就像"筛子"一样,把合数筛掉,剩下的就是质数: 从2开始,依次检查每个数如果当前数未被标记为合数,它就是质数然后把这个质数的…...
【IDEA】✈️自定义模板,自动生成类和方法注释
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时三分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&a…...
笔试专题(六)
文章目录 最长无重复子数组(滑动窗口)题解代码 重排字符串(贪心 构造)题解代码 牛牛冲钻五(模拟)题解代码 最长无重复子数组(滑动窗口) 题目链接 题解 1. 滑动窗口 2. 什么时候…...
【算法实践】跳跃游戏——计算到达终点的最小跳数
问题描述 给定一个非负数数组 arr[],每个元素表示从该位置最多可向前跳跃的步数。 示例: 若 arr[i] 3,则可以从位置 i 跳跃到 i1、i2 或 i3。若 arr[i] 0,则无法从该位置向前跳跃。 任务:找到从数组第一个位置移动…...
sklearn的Pipeline
Pipeline类 介绍:Pipeline 可以将多个数据处理步骤和机器学习模型组合成一个序列,其中每个步骤都是一个变换器(Transformer)或者估计器(Estimator),并且Pipeline中的最后一个必须为估计器,其它的必须为变换器,如果Pipeline中的估计器为为分类器则整个Pipeline就作为分…...
Unity3D仿星露谷物语开发34之单击Drop项目
1、目标 当在道具栏中选中一个Item时,点击地面就可以实现Item的drop操作,每点击一次就drop一次,直到道具栏中Item数量不够。 这样的好处:避免每次Drop都从道具栏中拖拉Item,通过点击这种操作可以更加高效。 方法&am…...