flink 操作mongodb的例子

简述

该例子为从一个Collection获取数据然后插入到另外一个Collection中。
Flink的基本处理过程可以清晰地分为以下几个阶段:

  1. 数据源(Source):
  • Flink可以从多种数据源中读取数据,如Kafka、RabbitMQ、HDFS等。
  • Flink会将从数据源中读取到的数据转化为一个个数据流,这些数据流可以是无限大的(如实时数据流),也可以是有限大小的(如批量数据流)。
  1. 数据转换(Transformation):
  • Flink提供了各种数据转换算子(Operators),可以对数据流进行各种操作,包括map、filter、reduce、join等。
  • 这些算子帮助用户对数据流进行各种数据处理和计算操作。
  • 在Flink中,主要有三类Operator:
    • Source Operator:负责数据来源操作,如从文件、socket、Kafka等读取数据。
    • Transformation Operator:负责数据转换,如map、flatMap、reduce等算子。
    • Sink Operator:负责数据落地操作,如将数据写入Hdfs、Mysql、Kafka等。
  1. 数据输出(Sink):
  • Flink会将处理后的数据输出到指定的目标,这些目标可以是多种类型的数据存储系统,如Kafka、HDFS、MySQL等。
  • Flink支持将数据输出到多个目标,并可以进行复制备份。
  1. Flink核心组件和工作流程:
  • Flink在运行中主要有三个核心组件:JobClient、JobManager和TaskManager。
  • 用户首先提交Flink程序到JobClient,经过JobClient的处理、解析、优化后提交到JobManager,最后由TaskManager运行task。
  • JobClient是Flink程序和JobManager交互的桥梁,主要负责接收程序、解析程序的执行计划、优化程序的执行计划,然后提交执行计划到JobManager。
  1. 执行图(ExecutionGraph):
  • Flink中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图。
  • 每一个dataflow以一个或多个sources开始,以一个或多个sinks结束,dataflow类似于任意的有向无环图(DAG)。
  1. 优化过程:
  • Flink会对用户提交的执行计划进行优化,主要优化是将相邻的Operator融合,形成OperatorChain,以提高处理效率。
    在这里插入图片描述

代码

主要函数

package com.wfg.flink.connector.mongodb;import com.alibaba.fastjson2.JSON;
import com.mongodb.client.model.InsertOneModel;
import com.wfg.flink.connector.mongodb.model.WellCastingInfo;
import com.wfg.flink.connector.mongodb.schema.WellCastingInfoDeserializationSchema;
import lombok.extern.slf4j.Slf4j;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.configuration.MemorySize;
import org.apache.flink.connector.mongodb.sink.MongoSink;
import org.apache.flink.connector.mongodb.source.MongoSource;
import org.apache.flink.connector.mongodb.source.enumerator.splitter.PartitionStrategy;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.bson.BsonDocument;/*** @author wfg*/
@Slf4j
public class Main {public static void main(String[] args) throws Exception {MongoSource<WellCastingInfo> mongoSource = MongoSource.<WellCastingInfo>builder().setUri("mongodb://root:123456@127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/admin?replicaSet=rs0&authSource=admin").setDatabase("uux").setCollection("castingInfo")
//                .setProjectedFields("_id", "f0", "f1").setFetchSize(2048).setLimit(10000).setNoCursorTimeout(true).setPartitionStrategy(PartitionStrategy.SAMPLE).setPartitionSize(MemorySize.ofMebiBytes(64)).setSamplesPerPartition(10).setDeserializationSchema(new WellCastingInfoDeserializationSchema()).build();StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 从 MongoDB 读取数据DataStream<WellCastingInfo> sourceStream = env.fromSource(mongoSource, WatermarkStrategy.noWatermarks(), "Mongo Source");// 进行转换(如果需要)DataStream<WellCastingInfo> transformedStream = sourceStream.map((MapFunction<WellCastingInfo, WellCastingInfo>) value -> {// 转换逻辑return value;});MongoSink<WellCastingInfo> sink = MongoSink.<WellCastingInfo>builder().setUri("mongodb://root:123456@127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/admin?replicaSet=rs0&authSource=admin").setDatabase("uux").setCollection("castingInfo_back").setMaxRetries(3)
//                .setDeliveryGuarantee(DeliveryGuarantee.AT_LEAST_ONCE).setSerializationSchema((input, context) -> new InsertOneModel<>(BsonDocument.parse(JSON.toJSONString(input)))).build();transformedStream.sinkTo(sink);
//        stream.sinkTo(sink);// 执行作业env.execute("Mongo Flink Demo");}
}

数据解析处理

package com.wfg.flink.connector.mongodb.schema;import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONReader;
import com.wfg.flink.connector.mongodb.model.WellCastingInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.typeutils.TypeExtractor;
import org.apache.flink.connector.mongodb.source.reader.deserializer.MongoDeserializationSchema;
import org.bson.BsonDocument;import java.util.Date;/*** @author wfg*/
@Slf4j
public class WellCastingInfoDeserializationSchema implements MongoDeserializationSchema<WellCastingInfo> {@Overridepublic WellCastingInfo deserialize(BsonDocument bsonDocument) {WellCastingInfo rs = null;try {JSONObject obj = JSONObject.parseObject(bsonDocument.toJson());obj.remove("_id");obj.remove("time");obj.remove("_class");rs = obj.to(WellCastingInfo.class, JSONReader.Feature.IgnoreAutoTypeNotMatch);if (bsonDocument.getObjectId("_id") != null) {rs.setId(bsonDocument.getObjectId("_id").getValue().toString());}if (bsonDocument.get("time") != null) {rs.setTime(new Date(bsonDocument.getDateTime("time").getValue()));}} catch (Exception e) {log.error("数据格式错误:{}:{}", bsonDocument.toJson(), e);}return rs;}@Overridepublic TypeInformation<WellCastingInfo> getProducedType() {return TypeExtractor.getForClass(WellCastingInfo.class);}}

数据类

package com.wfg.flink.connector.mongodb.model;import lombok.Data;import java.util.Date;/*** @author wfg*/
@Data
public class WellCastingInfo {private String id;private String comCode;private Date time;private String yjsfzt;private String yjsyl;private String jjaqzfzt;private String spjk01;private String jyjqy;
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wfg.flink.connector</groupId><version>1.0-SNAPSHOT</version><artifactId>connector-mongodb</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><flink.version>1.18.1</flink.version><log4j.version>2.14.1</log4j.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-mongodb</artifactId><version>1.1.0-1.18</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-base</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-streaming-java</artifactId><version>${flink.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.50</version></dependency></dependencies>
</project>

说明

MongoSource

MongoSource通常指的是一个自定义的数据源(Source),用于从MongoDB数据库中读取数据。

  1. 依赖
    首先,需要在项目的pom.xml文件中引入Flink MongoDB连接器的依赖。这通常包括Flink的MongoDB连接器以及MongoDB的Java驱动。例如:
<dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-mongodb</artifactId><version>1.1.0-1.18</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-base</artifactId><version>${flink.version}</version></dependency>
  1. 创建MongoSource
    创建一个自定义的MongoSource类,该类通常继承自Flink的RichSourceFunction或其他相关的Source Function接口。在这个类中,需要实现与MongoDB的连接、查询和数据读取的逻辑。
  2. 关键方法
  • **open(Configuration parameters):**在这个方法中,可以初始化MongoDB的连接,如创建一个MongoClient实例。
  • **run(SourceContext ctx):**这个方法负责从MongoDB中读取数据,并将数据发送到Flink的SourceContext中。可以使用MongoDB的查询API来执行查询操作,并将结果转换为Flink可以处理的数据类型(如Tuple、POJO等)。
  • **cancel():**当Flink作业被取消时,这个方法会被调用。可以在这个方法中关闭MongoDB的连接或执行其他清理操作。
  1. 配置和使用MongoSource
    可以通过调用StreamExecutionEnvironment的addSource方法来添加自定义MongoSource。例如:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();  
DataStream<YourDataType> dataStream = env.addSource(new YourMongoSource());  
// ... 后续的数据处理和转换操作 ...

注意事项:

  • 确保MongoDB服务器的地址、端口和凭据等信息在MongoSource中正确配置。
  • 根据需求,可以调整MongoDB的查询条件、分页参数等,以控制从MongoDB中读取的数据量和频率。
  • 如果Flink作业需要处理大量的数据,考虑使用MongoDB的索引来优化查询性能。
  • 在处理完数据后,确保关闭与MongoDB的连接,以避免资源泄漏。

env.fromSource

env.fromSource 并不是一个直接的方法或表达式。env 通常指的是 Flink 的 StreamExecutionEnvironment 或 ExecutionEnvironment 对象,它们用于设置 Flink 流处理或批处理作业的上下文和执行环境。
然而,为了从外部数据源读取数据到 Flink 作业中,会使用 env 对象上的各种方法来创建数据源。例如,对于流处理,可能会使用 env.addSource(sourceFunction),其中 sourceFunction 是一个实现了 SourceFunction 接口或继承自 RichParallelSourceFunction 的类,它定义了如何从外部系统(如 Kafka、文件系统、数据库等)读取数据。

对于常见的外部数据源,Flink 提供了各种预定义的连接器和数据源函数,可以直接使用它们,而无需自己实现 SourceFunction。例如:

  • Kafka: 使用 FlinkKafkaConsumer
  • Files: 使用 FileSource 或 StreamExecutionEnvironment.readFile()
  • JDBC: 使用 JdbcInputFormat 或第三方库如 flink-connector-jdbc

算子操作

算子(Operator)是数据处理的核心构建块。它们定义了如何转换或处理数据流(DataStream)或数据集(DataSet)。Flink 提供了丰富的算子库来支持各种数据处理任务。以下是一些常见的 Flink 算子操作:

  1. 转换(Transformation)算子
  • map:对每个元素应用一个函数,并返回一个新的元素。
  • flatMap:对每个元素应用一个函数,该函数可以返回任意数量的元素。
  • filter:过滤出满足特定条件的元素。
  • keyBy:按一个或多个键对流进行分区,以便后续可以进行有状态的操作(如聚合)。
  • reduce:在具有相同键的分组数据上应用一个聚合函数。
  • sum、min、max 等:针对特定数据类型的内置聚合函数。
  1. 连接(Join)和联合(Co-operation)算子
  • timeWindowAll、timeWindow:在时间窗口内对元素进行聚合。
  • intervalJoin:基于时间间隔的连接操作。
  • connect:连接两个流以进行联合操作,如 coMap、coFlatMap 等。
  • union:将两个或多个流合并为一个流。
  1. 窗口(Window)算子
  • tumblingWindow:滚动窗口,窗口之间没有重叠。
  • slidingWindow:滑动窗口,窗口之间可以重叠。
  • sessionWindow:会话窗口,基于元素之间的时间间隔动态创建窗口。
  1. 状态和容错
  • process:一个低级的算子,允许访问元素的时间戳和状态。
  • checkpointing:用于在 Flink 作业中启用容错和状态一致性。
  1. 侧边输出(Side Outputs)
  • 在某些算子中,可以定义侧边输出来处理不符合主逻辑的异常或特殊情况的元素。
  1. 异步 I/O 操作
  • asyncFunction:允许执行异步操作(如数据库查询)而不阻塞 Flink 的主数据流。
  1. 广播(Broadcast)和重分区(Redistribute)
  • broadcast:将数据发送到所有并行子任务。
  • rebalance、rescale、shuffle:用于改变流中的元素分布。
  1. 迭代(Iteration)
  • Flink 支持迭代处理,允许重复处理数据直到满足某个条件。

MongoSink

  1. MongoSink implements Sink
public SinkWriter<IN> createWriter(Sink.InitContext context) {return new MongoWriter(this.connectionOptions, this.writeOptions, this.writeOptions.getDeliveryGuarantee() == DeliveryGuarantee.AT_LEAST_ONCE, context, this.serializationSchema);}
  1. MongoWriter implements SinkWriter
  • write: 写入数据
  • flush: doBulkWrite写入数据。
  • close: 关闭链接
  1. MongoSinkBuilder
  • setUri: 设置Mongodb链接
  • setDatabase: 设置Database
  • setCollection: 设置Collection
  • setBatchSize: 为每个批处理请求设置要缓冲的最大操作数。可以通过-1到
    禁用批处理。
  • setBatchIntervalMs: 设置批处理刷新间隔(以毫秒为单位)。可以通过-1来禁用它。
  • setMaxRetries: 设置写入记录失败时的最大重试次数。
  • setDeliveryGuarantee: 设置保存保证,默认保存保证为DeliveryGuarantee#AT_LEAST_ONCE
  • setSerializationSchema: 设置对每条记录调用的序列化模式,以将其转换为MongoDB批量
    要求
MongoSink<WellCastingInfo> sink = MongoSink.<WellCastingInfo>builder().setUri("mongodb://root:123456@127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/admin?replicaSet=rs0&authSource=admin").setDatabase("sjzz").setCollection("wellCastingInfo_back").setMaxRetries(3)
//                .setDeliveryGuarantee(DeliveryGuarantee.AT_LEAST_ONCE).setSerializationSchema((input, context) -> new InsertOneModel<>(BsonDocument.parse(JSON.toJSONString(input)))).build();

transformedStream.sinkTo(sink);

Flink 1.12 之前,Sink 算子是通过调用 DataStream 的 addSink 方法来实现的:

stream.addSink(new SinkFunction(...));

从 Flink 1.12 开始,Flink 重构了 Sink 架构:

stream.sinkTo(...)

env.execute(“Mongo Flink Demo”)

env.execute() 是用于启动 Flink 作业(Job)的关键方法。这里的 env 通常是一个 StreamExecutionEnvironment 或 ExecutionEnvironment 的实例,它们分别用于 Flink 的 DataStream API 和 DataSet API。
当创建了一个 Flink 作业,定义了数据源、转换(transformations)和数据接收器(sinks)之后,需要调用 env.execute() 来触发 Flink 运行时(runtime)执行作业。

需要注意的是,一旦调用了 env.execute(),Flink 运行时就会开始执行作业,并且 env.execute() 方法会阻塞,直到作业执行完成或发生错误。如果希望程序在启动 Flink 作业后继续执行其他操作,可以考虑将 Flink 作业提交到远程集群并在本地程序中继续执行其他任务。这通常需要使用 Flink 的集群客户端(ClusterClient)或相应的 REST API 来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

21 厂商考证介绍(华为 华三 锐键 深信服)+AI 解析

一 认识考证体系 二 明确考证的大致方向 锐键 职业资格证书等级介绍 职业资格证书是由国家职业资格鉴定机构或相关行业主管部门颁发的&#xff0c;用于证明一个人在特定职业领域具备一定技能和知识水平的证明文件。职业资格证书的等级分为初级、中级、高级、技师、高级技师、…

【Python】解决Python报错:AttributeError: ‘NoneType‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

谢宁DOE培训的课程大纲分享

谢宁DOE培训旨在深入讲解谢宁问题解决方法在质量管理中的重要作用&#xff0c;学会如何利用谢宁问题解决方法工具&#xff0c;在不中断生产过程的前提下&#xff0c;找出生产中碰到的复杂而顽固的问题的原因&#xff0c;从而彻底地解决问题。 【课程内容】 第一部分&#xff1…

GEE 10m近实时 LULC 数据集Dynamic World

Google Earth Engine 和 Dynamic World Google 利用其地球引擎&#xff08;Earth Engine&#xff09;和人工智能&#xff08;AI&#xff09;平台技术&#xff0c;推出了 Dynamic World 数据库&#xff0c;能够提供接近实时的全球土地环境数据。Dynamic World 是基于 Google Ear…

c++ QT 实现QMediaPlayer播放音频显示音频级别指示器

文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了&#xff0c;就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针&#xff0c;用于监控音频流。当音频流被捕获或播放时&#xff0c;QAudioProbe 可以接收到音频数据。这个类在需要访问…

亚马逊云科技专家分享 | OPENAIGC开发者大赛能量加油站6月5日场预约开启~

由联想拯救者、AIGC开放社区、英特尔联合主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”自上线以来&#xff0c;吸引了广大开发者的热情参与。 为了向技术开发者、业务人员、高校学生、以及个体创业人员等参赛者们提供更充分的帮助与支持&#xff0c;AIGC开放社区特别…

C# WinForm —— 24 Threading.Timer 组件介绍与使用

1. 简介 System.Threading.Timer 多线程 轻量级 精度高 提供以指定的时间间隔对线程池线程执行方法的机制 和System.Timers.Timer 类似&#xff0c;每隔一段时间触发事件&#xff0c;执行操作(不是由UI线程执行的)&#xff0c;即使事件中执行了比较耗时的操作&#xff0c;也…

万字长文深度解析Agent反思工作流框架Reflexion上篇:安装与运行

今天&#xff0c;我们将迈出从理论到实践的关键一步——通过安装和测试Reflexion框架&#xff0c;我们将揭开智能体工作流的神秘面纱&#xff0c;实现知识的深度融合与应用。由于框架东西较多&#xff0c;我们暂定分为上中下三篇来讲解。 1. 安装 1.1 克隆和查看项目 git clo…

JVM学习-类加载过程(二)

Initialization初始化阶段 为类的静态变量赋予正确的初始值 具体描述 类的初始化是类装载的最后一个阶段&#xff0c;如果前面的步骤没有问题&#xff0c;那么表示类可以顺利装载到系统中&#xff0c;此时&#xff0c;类才会开始执行Java字节码(即&#xff0c;到了初始化阶段…

React-基础样式控制

组件基础样式方案 React组件基础的样式控制有两种方式 1、行内样式&#xff08;不推荐&#xff09; 属性名是多个单词的需要使用驼峰写法 也可以把样式都提取到一个变量里&#xff0c;再赋值到style里 2、class类名控制 classnames优化类名控制 classnames是一个简单的JS库&…

arcgis api for javascript点击获取要素错乱的问题

今天帮同事看了一个前端地图点击的问题&#xff1a;点击时总会获取到周边的图元&#xff0c;即使我点击线的周围&#xff0c;也是能获取到的&#xff0c;除非离得特别远。 地图组件用的是arcgis api, 图层类是grahicslayer,要素类型是线。这是添加图元的代码&#xff1a; grap…

探索多模态MR图像的脑肿瘤分割任务结构| 文献速递-深度学习肿瘤自动分割

Title 题目 Exploring Task Structure for Brain Tumor Segmentation From Multi Modality MR Images 探索多模态MR图像的脑肿瘤分割任务结构 01 文献速递介绍 脑肿瘤分割旨在从多模态磁共振&#xff08;MR&#xff09;序列中自动分割肿瘤区域&#xff0c;这些序列由先进的…

万字长文深度解析Agent反思工作流框架Reflexion中篇

前文《LLM-Agents]万字长文深度解析Agent反思工作流框架Reflexion上篇&#xff1a;安装与运行》我们已经介绍了 Reflexion 框架的背景知识、数据集以及安装运行方法。在本文中&#xff0c;我们将深入探讨 Agent 的具体运行细节。 上篇讲到agent.run(reflect_strategystrategy)…

艾体宝方案 | redis赋能游戏开发,游戏玩家纵享丝滑

掉线&#xff0c;加载缓慢&#xff0c;反馈无跟进&#xff0c;这些令游戏玩家炸毛的问题&#xff0c;同时也是游戏开发者关注的问题。开发者将目光投向了Redis&#xff0c;一个实时数据平台&#xff0c;告别卡顿延迟&#xff01; 一、玩家不掉线&#xff0c;游戏更丝滑 在大型…

NVIDIA Blackwell Architecture

本文翻译自&#xff1a;NVIDIA Blackwell Architecture https://www.nvidia.com/en-us/data-center/technologies/blackwell-architecture/ 文章目录 了解技术突破1、新型人工智能超级芯片2、第二代 Transformer 引擎3、Secure AI4、NVLink 和 NVLink 交换机5、解压缩引擎6、可…

VNC server ubuntu20 配置

介绍 最近想使用实验室的4卡服务器跑一些深度学习实验&#xff0c;因为跑的是三维建图实验&#xff0c;需要配上可视化界面&#xff0c;本来自带的IPMI可以可视化&#xff0c;但分辨率固定在640*480&#xff0c;看起来很别扭&#xff0c;就捣鼓服务器远程可视化访问了两天&…

vue2转vue3初步下载pnpm遇到的问题 pnpm : 无法加载文件 D:\nodejs\pnpm.ps1

安装pnpm npm install -g pnpm pnpm -v 提示&#xff1a; 解决&#xff1a;nvm install 18.18.0 下载最稳定版本的nodejs nvm use 18.18.0 然后注意重新下载删除pnpm npm uninstall -g pnpm npm install -g pnpmlatest 在vscode使用pnpm报错 解决&#xff1a;管理员运行Windo…

web项目规范配置(husky、eslint、lint-staged、commit)

背景&#xff1a; 团队开发为了保证提交代码格式统一&#xff0c;通常在进行代码提交的时候对暂存区代码进行校验&#xff0c;如没有通过eslint(本例使用eslint)校验&#xff0c;则不能提交到远端。 安装依赖 husky 、eslint 、prettier 、lint-staged npm install husky e…

Satellite Stereo Pipeline学习

1.在Anaconda某个环境中安装s2p pip install s2p 2.在Ubuntu系统中安装s2p源代码 git clone https://github.com/centreborelli/s2p.git --recursive cd s2p pip install -e ".[test]" 3.在s2p中进行make all处理 中间会有很多情况&#xff0c;基本上哪个包出问题…

基于网关的ip频繁访问web限制

一、前言 外部ip对某一个web进行频繁访问&#xff0c;有可能是对web进行攻击&#xff0c;现在提供一种基于网关的ip频繁访问web限制策略&#xff0c;犹如带刀侍卫&#xff0c;审查异常身份人员。如发现异常或者暴力闯关者&#xff0c;即可进行识别管制。 二、基于网关的ip频繁访…