九、Spring Cloud—gateway网关
一、引言
每个微服务都需和前端进行通信,解决每个微服务请求时的鉴权、限流、权限校验、跨域等逻辑,放在一个统一的地方进行使用。
在微服务架构中,网关是一个重要的组件,它作为系统的入口,负责接收所有的客户端请求,并将请求路由到相应的微服务。
网关的作用主要有以下几点:
-
统一入口:网关作为系统的唯一入口,可以为客户端提供一个统一的接口,简化了客户端的调用过程。
-
路由转发:网关可以根据请求的 URL 和参数等信息,将请求路由到对应的微服务,实现请求的转发。
-
负载均衡:网关可以通过负载均衡算法,将请求分发到不同的微服务实例上,提高了系统的性能和可用性。
-
安全控制:网关可以对请求进行鉴权、过滤和监控等操作,保障了系统的安全性和稳定性。
-
缓存管理:网关可以将一些常用的请求结果进行缓存,减少对后端服务的访问,提高了系统的响应速度。

二、什么是Spring Cloud Gateway
网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。
Spring cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul 1.0来说,Spring Cloud Gateway 提供更优秀的性能,更强大的有功能。使用spring boot 2.0构建。
Spring Cloud Gateway 是由 WebFlux + Nety + Reactor 实现的响应的 API 网关。它不能在传统的 servlet 容器中工作,也不能构建成 war 包。
Spring cloud Gateway 旨在为微服务架构提供种简单且有效的 API路由的管理方式,并基于 Fliter 的方式提供网关的基本功能,例如安全认证、监控、限流等等。
源码:https://github.com/spring-cloud/spring-cloud-gateway
官网文档:https://spring.io/projects/spring-cloud-gateway
特征
Spring Cloud Gateway具有以下特点:
- 基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0 构建。
- 动态路由:能够匹配任何请求属性。
- 支持路径重写。
- 集成Spring Cloud 服务发现功能(Nacos、Eruka)。
- 可继承流控降级功能你(sentinel、Hystrix)。
- 可以对路由指定已与编写的Predicate(断言)和Filter(过滤器)。
核心概念
- 路由 (route)。
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成,如果新言为真,则说明请求的URL和配置的路由匹配。 - 断言(predicdtes)。
Java8中的断言函数,SpingCloud Gateway中的断言数类型是Spring5.0架中的ServerWebExchange,断言函数允许开发者去定义匹配http request中的任何信息,比如请求头和参数等。 - 过滤器 (Filter)。
SpringCloud Gateway中的filter分为Gateway Filter和Global Filter。Filter可以对请求和响应进行处理。
三、Spring Cloud Gateway快速开始
1、添加依赖-gateway和nacos
<dependencies><!-- spring cloud gateway 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>
如果父级有spring-boot-start-web,需删除,删除spring-boot-start-web依赖项。
因为spring cloud gateway是基于webflux的,如果非要web支持的话需要导入spring-boot-starter-webflux而不是spring-boot-start-web。
2、resources/application.yml配置文件配置gateway和nacos
server:port: 8814spring:application:name: api-gateway#gateway配置cloud:gateway:#路由规则routes:# 系统模块#id 路由的唯一标识- id: order-service#需要转发的地址 lb:使用 nacos 中本地負載均衡策略# order-service 服務名uri: lb://order-service#断言,用于路由规则的匹配,匹配的路径predicates:- Path=/order-service/** #指定前缀路由# http://localhost:8814/order-service/order/test 路由到# http://localhost:8815/order-service/order/test#过滤器,去除一级路径 order-service#最终变成 http://localhost:8815/order/test 进行请求filters:- StripPrefix=1#- id#配置nacos nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos
也可以简写为:
server:port: 8814spring:application:name: api-gateway#gateway配置cloud:gateway:discovery:locator:#启动自动识别nacos服务。即服务名为第一路径enabled: true#配置nacosnacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos
请求接口测试:
http://localhost:8814/order-service/order/test
和http://localhost:8815/order/test为一个接口。
四、路由断言工厂(Route Predicate Factories)配置
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories
作用:当请求gateway的时候,使用断言对请求进行匹配,如果匹配成功就路由转发,如果匹配失败就返回404。
类型:内置,自定义。
SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:
1. 基于Datetime类型的断言工厂
此类型的断言根据时间做判断,主要有三个:
AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期。
BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期。
BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内。
ZonedDateTime.now(); 可以输出当前日期格式。
- After=2023-05-30T00:24:56.119+08:00[Asia/Shanghai]
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
2. 基于远程地址的断言工厂
RemoteAddrRoutePredicateFactory: 接收一个P地址段,判断请求主机地址是否在地址段中。
- RemoteAddr=192.168,1.1/24
3. 基于Cookie的断言工厂
CookieRoutePredicateFactory: 接收两个参数,ookie 名字和一个正则表达式。判断请求cookie是否具有给定名称且值与正则表达式匹配。
-Cookie=chocolate,ch.
4. 基于Header的断言工厂
HeaderRoutePredicateFactory: 接收两个参数,标题名称和正则表达式。判断请求Header是否具有给定名称且值与正则表达式匹配.
-Header=X-Request-Id,\d+
5. 基于Host的断言工厂
HostRoutePredicateFactory: 接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。
- Host=**.somehost.org,**.anotherhost.org
6. 基于路由-常用
routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET,POST- Path=/red/{segment},/blue/{segment}- Query=green #指定参数- RemoteAddr=192.168.1.1/24 #指定Ip
7. 基于权重
spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8 #分组,80%的权重- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2
8. 自定义路由断言工厂
自定义路由断言工厂需要继承 AbstractRoutePredicateFactory类,重写 apply 方法的逻辑。在apply方法可以通过exchange.getRequest()拿到serverHttpRequest对象,从而可以获取到请求的参数、请求方式、请求头等信息。
步骤:
- 必须spring组件 bean
- 类必须加上RoutePredicateFactory 作为结尾
- 必须继承 AbstractRoutePredicateFactory
- 必须声明静态内部类声明属性来接收配置文件中对应的断言的信息
- 需要结合shortcutFieldOrder进行绑定
- 通过apply进行逻辑判断 true就是匹配成 false匹配失败
可以借鉴 QueryRoutePredicateFactory 源码实现自定义的路由断言工厂。
1、代码CheckAuthRoutePredicateFactory
package com.tc.gateway.config;import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;import javax.validation.constraints.NotEmpty;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;@Component
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {public CheckAuthRoutePredicateFactory() {super(CheckAuthRoutePredicateFactory.Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name");}@Overridepublic Predicate<ServerWebExchange> apply(CheckAuthRoutePredicateFactory.Config config) {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange exchange) {//简单案例,判断配置文件中CheckAuth是否等于tcif(config.getName().equals("tc")){return true;}return false;}};}//用于接收断言中的配置信息@Validatedpublic static class Config {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}
}
2、配置文件。- CheckAuth=tc为自定义的断言信息
server:port: 8814spring:application:name: api-gateway#gateway配置cloud:gateway:#路由规则routes:# 系统模块#id 路由的唯一标识- id: order-service#需要转发的地址 lb:使用 nacos 中本地負載均衡策略# order-service 服務名uri: lb://order-service#断言,用于路由规则的匹配,匹配的路径predicates:- Path=/order-service/** #指定前缀路由# http://localhost:8814/order-service/order/test 路由到# http://localhost:8815/order-service/order/test
# - After=2023-05-30T00:24:56.119+08:00[Asia/Shanghai] #在该时间之前能够访问,之后直接404
# - Header=X-Request-Id,\d+ #需在请求头加入key为X-Request-Id,value为数字
# - Method=GET,POST #请求方式,支持get和post
# - Query=name #接口需加入参数?name 案例:http://localhost:8815/order-service/order/test?name
# - Query=name,tc|test #限定值只能是tc或者test 案例:http://localhost:8815/order-service/order/test?name=tc- CheckAuth=tc#过滤器,去除一级路径 order-service#最终变成 http://localhost:8815/order/test 进行请求filters:- StripPrefix=1#- id#配置nacosnacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos
五、过滤器
gateway 内置了许多的过滤工厂,可以通过过滤工厂进行一些业务逻辑的处理,比如剔除响应头,添加去除参数等。
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
1、局部过滤器
1.1 内置过滤器
内置的过滤器工厂可以在官网进行查看,使用例如:
spring:application:name: api-gatewaycloud:gateway:routes:- id: order-serviceuri: lb://order-servicefilters:#设置过滤器工厂,给请求头添加默认参数- AddRequestHeader=X-Request-red, blue# 添加路径前缀- PrefixPath=/mypath


1.2 自定义过滤器工厂
和自定义路由断言工厂类似的结构。
package com.tc.gateway.config;import com.alibaba.cloud.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;import static org.springframework.cloud.gateway.support.GatewayToStringStyler.filterToStringCreator;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl;/*** @Description: 自定义过滤器工厂* @Date: 2023/5/31 22:47*/
@Component
public class CheckAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {public CheckAuthGatewayFilterFactory() {super(CheckAuthGatewayFilterFactory.Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name");}@Overridepublic GatewayFilter apply(CheckAuthGatewayFilterFactory.Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//自己的逻辑处理。简单案例,获取请求中name参数,//如果value=设置的值成功,否则失败String name = exchange.getRequest().getQueryParams().getFirst("name");if(StringUtils.isNotEmpty(name)){if(config.getName().equals(name)){//正常请求return chain.filter(exchange);}else{//返回404exchange.getResponse().setStatusCode(HttpStatus.NOT_EXTENDED);//结束return exchange.getResponse().setComplete();}}return chain.filter(exchange);}};}public static class Config {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}
配置文件:
spring:application:name: api-gatewaycloud:gateway:routes:- id: order-serviceuri: lb://order-servicepredicates:- Path=/order-service/** filters:- StripPrefix=1#自定义的过滤器- CheckAuth=tc
2.、全局过滤器
- 局部过滤器针对某个路由进行过滤,需要在路由中配置。
- 全局过滤器针对所有路由进行过滤,一旦定义就会投入使用。
授权,权限认证会使用全局过滤器。

自定义全局过滤器
/*** @Description: 全局过滤器* @Date: 2023/5/31 23:20*/
@Component
public class LogFilter implements GlobalFilter {Logger log = LoggerFactory.getLogger(LogFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("获取请求的地址"+exchange.getRequest().getPath().value());return chain.filter(exchange);}
}
测试:
2023-05-31 23:24:04.043 INFO 11244 --- [ctor-http-nio-2] com.tc.gateway.config.LogFilter : 获取请求的地址/order/test
2023-05-31 23:24:04.968 INFO 11244 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty : Flipping property: order-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
六、日志记录
使用Reactor Netty访问日志
要启用Reactor Netty访问日志,需设置
-Dreactor.netty.http.server.accessLogEnabled=true。
可以在IDEA VM options配置-Dreactor.netty.http.server.accessLogEnabled=true即可。
第二行就是Netty访问日志。
2023-06-01 22:41:27.576 INFO 13052 --- [ctor-http-nio-2] com.tc.gateway.config.LogFilter : 获取请求的地址/order/test
2023-06-01 22:41:27.757 INFO 13052 --- [ctor-http-nio-2] reactor.netty.http.server.AccessLog : 0:0:0:0:0:0:0:1 - - [01/Jun/2023:22:41:26 +0800] "GET /order-service/order/test HTTP/1.1" 200 17 8814 972 ms
2023-06-01 22:41:28.494 INFO 13052 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty : Flipping property: order-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
也可以配置到单独的访问日志文件,使用logBack.xml配置。
<appender name="accessLog” class="ch.qos.logback.core.FileAppender"><file>access_log.log</file><encoder><pattern>%msg%n</pattern></encoder>
</appender><appender name="async class="ch,qos.logback.classic.AsyncAppender"><appender-ref ref="accessLog”/>
</appender><logger name="reactor.netty.http,server.AccessLog" level="INFO” additivity="false">
<appender-ref ref="async"/>
</logger>
七、gateway跨域配置(CORS)
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#cors-configuration
yml配置方式:
spring:cloud:gateway:globalcors:cors-configurations:'[/**]': #允许跨域访问的资源allowedOrigins: "https://docs.spring.io" #跨域允许来源allowedMethods:- GET- POST
八、gateway整合sentinel
可以针对不同的路由、接口、或者接口的特征分组限流。
https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
1、添加依赖
<!-- sentinel整合gateway的依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency><!-- sentinel的依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、添加sentinel配置信息
#配置sentinel
spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8858
启动生成网关的一个路由资源:
该路由资源和配置文件中一致:cloud:gateway:#路由规则routes:# 系统模块#id 路由的唯一标识- id: order-service

通过这个资源即可进行流控。
流控配置界面如下:可以自由灵活配置。

其中API分组流控,即把接口分层不同的Api组,根据组进行流控,分组之后,点击API分组,可以进行选择分好的组。
设置分组界面如下:

相关文章:
九、Spring Cloud—gateway网关
一、引言 每个微服务都需和前端进行通信,解决每个微服务请求时的鉴权、限流、权限校验、跨域等逻辑,放在一个统一的地方进行使用。 在微服务架构中,网关是一个重要的组件,它作为系统的入口,负责接收所有的客户端请求…...
ARM微架构与程序编写
目录 1.流水线 2.指令流水线 3. 多核处理器编辑 4. 工程搭建 4.1为Keil软件配置编译工具链 5.程序编写 5.1 数据处理指令 5.2 带标志位的加法ADC ADDS 5.3 跳转指令B\BL 5.4 单寄存器内存访问 5.5 批量寄存器内存访问 5.6 栈的应用->叶子函数的调用过程 5.…...
Windows下利用Anaconda创建多个CUDA环境
参考 https://blog.csdn.net/qq_42395917/article/details/126237388 https://blog.csdn.net/qq_42406643/article/details/109545766 (待学习补充) https://blog.csdn.net/qq_43919533/article/details/125694437 (待学习补充) 安装cudatoolkit和cudnn # 前提是我已经安装了…...
C SS复习笔记
1.img标签 img的src属性是图片显示不出来时显示的文字 ing的title属性是光标放到图片上,提示的文字 2.a标签 a标签的target属性表示打开窗口的方式,默认的值是_self表示当前窗口的打开页面,_blank表示新窗口打开页面。 a标签的href链接分…...
LeetCode 225 用队列实现栈
题目: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回…...
Java对象的共享
要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理。第2章介绍了如何通过同步来避免多个线程在同一时刻访问相同的数据,而本章将介绍如何共享和发布对象,从而使它们能够安全地由多个线程同时访问。这两…...
漏洞概述-0day漏洞利用原理(0)
0day专题对作者来说是一个很大的挑战,但无论有多难,作者会坚持进行大量的对新旧技术(精通二进制、汇编语言、操作系统底层的知识)实践并尽可能做到完善,最终利用技术发扬正能量。 bug 与漏洞 随着现代软件工业的发展,软件规模不断扩大,软件内部的逻辑也变得异常复杂。为…...
交换机的4种网络结构方式:级联方式、堆叠方式、端口聚合方式、分层方式
交换机是计算机网络中重要的网络设备之一,用于实现局域网(LAN)内部的数据转发和通信。交换机可以采用不同的网络结构方式来满足不同的网络需求和拓扑结构。本文将详细介绍交换机的四种网络结构方式:级联方式、堆叠方式、端口聚合方…...
firewall-cmd防火墙策略
--permanent 永久生效,重启后规则不消失 不执行 firewall-cmd --reload 命令配置不生效 添加单个IP为白名单 firewall-cmd --permanent --zonepublic -add-rich-rulerule family"ipv4" source address"IP" accept 删除白名单 firewall-cmd --…...
解决SQLException: Incorrect string value异常
java开发中会遇到如下异常: org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: java.sql.SQLException: Incorrect string value: \xF0\x9F\x95\xB32:... for column baseInfo at row 1 ### The error may involve com.f…...
桂院校园导航 导入 与 配置教程
将 静态项目/云开发项目 文件夹下最新版本的 文件夹下的 项目 的整个文件夹 复制到项目路径下(比如 D:\WeChatProjects),强烈建议不要直接扔在桌面上 云开发项目 需开通 云开发 功能(首月免费,次月19.9)&am…...
Linux上安装jdk Tomcat mysql redis
1.安装JDk 1.1这里使用xshell中xfxp进行文件的上传,将jdk二进制包上传到Linux服务器上 下载地址:Java Downloads | Oracle 或者这里有下载好的安装包:链接:https://pan.baidu.com/s/1ZSJxBDzDaTwCH2IG-d2Gig 提取码:…...
Postman中加url环境变量和token全局变量
环境变量引用 语法:{{变量名}} 环境变量分类 1. 全局变量:全局有效,在Postman中的任何集合中都可以使用该变量,作用域最大。 2. 环境变量:要申明环境变量,先要创建环境,然后在该环境中创建变…...
多线程事务回滚方法
多线程事务回滚方法 介绍案例演示线程池配置异常类实体类控制层业务层mapper工具类验证 解决方案使用sqlSession控制手动提交事务SqlSessionTemplate注入容器中改造业务层验证成功操作示例业务层改造 介绍 1.最近有一个大数据量插入的操作入库的业务场景,需要先做一…...
java单元测试( Hamcrest 断言)
java单元测试( Hamcrest 断言) 单元测试特征: 1 范围狭窄 2 限于单一类或方法 3 体积小 为什么要编写单元测试? 为了防止错误(很明显!) 而且还可以提高开发人员的生产力,因为单元测试: (1) 帮助实施——在…...
讨论和总结 树模型 的三种序列化 方式的区别(模型存储大小、序列化所用内存、序列化速度)...
一、前言 本文总结常用树模型: rf,xgboost,catboost和lightgbm等模型的保存和加载(序列化和反序列化)的多种方式,并对多种方式从运行内存的使用和存储大小做对比 二、模型 2.1 安装环境 pip install xgboos…...
Halcon中的一些3D算子
一、记录一些Halcon里的关于3D的算子 1.read_object_model_3d 从文件读取一个3d模型 如下图,读的一个ply文件出来是个3d点云模型 2.visualize_object_model_3d 交互式展示3d模型 即上个算子读出来后,通过这个算子可以把3d模型显示出来旋转、平移&am…...
Android:Selector + Layer-lists 实现 AppCompatCheckBox
最近做项目涉及到一些UI相关的东东,虽然比较简单,但是也很有趣,写两篇简短的博客记录一下。 一."Selector 两张图片"实现 AppCompatCheckBox AppCompatCheckBox 是 androidx的一个widget:androidx.appcompat.widget.…...
TreeMap类型添加数据
package com.test.Test11;import java.util.*;public class Test02 {public static void main(String[] args) {/** 增加:put(K key,V value)* 删除:clear() remove(Object key)* 修改:* 查看:entrySet() get(Object key) keySet(…...
iOS 16 UI 设计系统免费在线使用方法
1、iOS 16 UI 设计系统中有什么? iOS 16 UI 设计系统通常包含以下组件和元素: 1. 按钮:包括操作按钮、图标按钮、导航按钮、滚动按钮、切换按钮、单选按钮、复选框按钮、呼叫按钮等各种类型的按钮。 2. 窗口和 UI 控件:包括标签…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
