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

Kafka、Kafka Streams、Drools、Redis 和分布式数据库的风控系统程序

由于实时风控系统难度较大,集成框架设计各个单位均有特点,快速建立一个通用性较强,学习、实施和使用成本较低的框架尤其重要。

提供一个简化的 Java 程序示例,演示如何将 Kafka 消息中间件、Kafka Streams 计算引擎、Drools 规则引擎、Redis 内存数据库和分布式数据库集成在一起。程序的主要功能是:

  1. 从 Kafka 中消费实时交易数据。
  2. 从 Redis 获取对应的风险标签,如果没有则从分布式数据库获取并更新到 Redis。
  3. 使用 Drools 规则引擎对交易数据和风险标签进行评估。
  4. 将评估结果发送回支付业务系统或记录下来。

示例图:

实时交易模块:接收交易数据 -> 获取风险标签(Redis)---> 调用规则引擎 —> 评估结果返回
      ↓                                                                                     ↓                                      ↑
规则引擎模块:交易数据 + 风险标签 ---> 规则执行 -----------> 输出评估结果(通过/拒绝)
 

为了简化示例,我们将:

创建一个简单的 Kafka 生产者,向 transaction-topic 发送交易数据。

2. 生产测试数据

  • 使用简单的交易数据结构和风险标签。
  • 定义基本的 Drools 规则。
  • 使用内存中的 H2 数据库模拟分布式数据库
  • 项目结构和依赖

    1. 项目结构

    risk-control-demo/
    ├── src/
    │   ├── main/
    │   │   ├── java/
    │   │   │   └── com.example.riskcontrol/
    │   │   │       ├── RiskControlApplication.java       // 主应用程序
    │   │   │       ├── Transaction.java                  // 交易数据模型
    │   │   │       ├── RiskTag.java                      // 风险标签模型
    │   │   │       ├── RiskEvaluator.java                // 风险评估类
    │   │   │       ├── RedisService.java                 // Redis 服务类
    │   │   │       ├── DatabaseService.java              // 数据库服务类
    │   │   │       └── KafkaStreamsConfig.java           // Kafka Streams 配置
    │   │   └── resources/
    │   │       ├── drools/
    │   │       │   └── rules.drl                         // Drools 规则文件
    │   │       └── application.properties                // 应用程序配置
    ├── pom.xml                                           // Maven 项目配置
  • 2. 依赖库(在 pom.xml 中)
  • <dependencies><!-- Kafka Streams --><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><version>3.4.0</version></dependency><!-- Drools Core --><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>7.73.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.73.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.73.0.Final</version></dependency><!-- Redis Client (Jedis) --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency><!-- H2 Database --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>2.1.214</version><scope>runtime</scope></dependency><!-- JSON Processing --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.0</version></dependency><!-- Logging --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.36</version></dependency>
    </dependencies>
    

    详细代码

    1. Transaction.java(交易数据模型)
  • package com.example.riskcontrol;import java.io.Serializable;public class Transaction implements Serializable {private String transactionId;private String accountId;private double amount;private long timestamp;// Constructors, getters, setters, toString()public Transaction() {}public Transaction(String transactionId, String accountId, double amount, long timestamp) {this.transactionId = transactionId;this.accountId = accountId;this.amount = amount;this.timestamp = timestamp;}// Getters and Setters// toString() method
    }
    

    2. RiskTag.java(风险标签模型)

  • package com.example.riskcontrol;import java.io.Serializable;public class RiskTag implements Serializable {private String accountId;private int riskLevel; // 1-低风险, 2-中风险, 3-高风险// Constructors, getters, setters, toString()public RiskTag() {}public RiskTag(String accountId, int riskLevel) {this.accountId = accountId;this.riskLevel = riskLevel;}// Getters and Setters// toString() method
    }
    

    3. RedisService.java(Redis 服务类)

  • package com.example.riskcontrol;import redis.clients.jedis.Jedis;public class RedisService {private Jedis jedis;public RedisService(String host, int port) {jedis = new Jedis(host, port);}public RiskTag getRiskTag(String accountId) {String riskLevelStr = jedis.get("risk:" + accountId);if (riskLevelStr != null) {int riskLevel = Integer.parseInt(riskLevelStr);return new RiskTag(accountId, riskLevel);}return null;}public void setRiskTag(RiskTag riskTag) {jedis.set("risk:" + riskTag.getAccountId(), String.valueOf(riskTag.getRiskLevel()));}public void close() {jedis.close();}
    }
    

    4. DatabaseService.java(数据库服务类)

  • package com.example.riskcontrol;import java.sql.*;public class DatabaseService {private Connection connection;public DatabaseService() throws SQLException {// 连接 H2 内存数据库connection = DriverManager.getConnection("jdbc:h2:mem:testdb");initializeDatabase();}private void initializeDatabase() throws SQLException {Statement stmt = connection.createStatement();// 创建风险标签表String sql = "CREATE TABLE IF NOT EXISTS risk_tags (" +"account_id VARCHAR(255) PRIMARY KEY," +"risk_level INT" +")";stmt.executeUpdate(sql);// 插入示例数据sql = "INSERT INTO risk_tags (account_id, risk_level) VALUES ('account123', 2)";stmt.executeUpdate(sql);stmt.close();}public RiskTag getRiskTag(String accountId) throws SQLException {String sql = "SELECT risk_level FROM risk_tags WHERE account_id = ?";PreparedStatement pstmt = connection.prepareStatement(sql);pstmt.setString(1, accountId);ResultSet rs = pstmt.executeQuery();if (rs.next()) {int riskLevel = rs.getInt("risk_level");rs.close();pstmt.close();return new RiskTag(accountId, riskLevel);} else {rs.close();pstmt.close();return null;}}public void close() throws SQLException {connection.close();}
    }
    

    5. RiskEvaluator.java(风险评估类)

  • package com.example.riskcontrol;import org.kie.api.KieServices;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;public class RiskEvaluator {private KieSession kieSession;public RiskEvaluator() {// 初始化 DroolsKieServices kieServices = KieServices.Factory.get();KieContainer kieContainer = kieServices.newKieClasspathContainer();kieSession = kieContainer.newKieSession("ksession-rules");}public boolean evaluate(Transaction transaction, RiskTag riskTag) {kieSession.insert(transaction);kieSession.insert(riskTag);int fired = kieSession.fireAllRules();kieSession.dispose();return fired > 0;}
    }
    

    6. drools/rules.drl(Drools 规则文件)

  • package com.example.riskcontrolimport com.example.riskcontrol.Transaction;
    import com.example.riskcontrol.RiskTag;rule "High Risk Transaction"
    when$transaction : Transaction( amount > 10000 )$riskTag : RiskTag( riskLevel == 3 )
    thenSystem.out.println("High risk transaction detected: " + $transaction);
    endrule "Medium Risk Transaction"
    when$transaction : Transaction( amount > 5000 && amount <= 10000 )$riskTag : RiskTag( riskLevel >= 2 )
    thenSystem.out.println("Medium risk transaction detected: " + $transaction);
    endrule "Low Risk Transaction"
    when$transaction : Transaction()$riskTag : RiskTag( riskLevel == 1 )
    thenSystem.out.println("Transaction passed: " + $transaction);
    end
    

    7. KafkaStreamsConfig.java(Kafka Streams 配置)

  • package com.example.riskcontrol;import org.apache.kafka.common.serialization.Serdes;
    import org.apache.kafka.streams.StreamsConfig;import java.util.Properties;public class KafkaStreamsConfig {public static Properties getProperties() {Properties props = new Properties();props.put(StreamsConfig.APPLICATION_ID_CONFIG, "risk-control-app");props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());return props;}
    }
    

    8. RiskControlApplication.java(主应用程序)

  • package com.example.riskcontrol;import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.kafka.common.serialization.Serdes;
    import org.apache.kafka.streams.KafkaStreams;
    import org.apache.kafka.streams.StreamsBuilder;
    import org.apache.kafka.streams.kstream.KStream;import java.sql.SQLException;public class RiskControlApplication {public static void main(String[] args) throws SQLException {// 初始化服务RedisService redisService = new RedisService("localhost", 6379);DatabaseService databaseService = new DatabaseService();RiskEvaluator riskEvaluator = new RiskEvaluator();// 配置 Kafka StreamsStreamsBuilder builder = new StreamsBuilder();KStream<String, String> sourceStream = builder.stream("transaction-topic");// 处理流sourceStream.foreach((key, value) -> {try {ObjectMapper objectMapper = new ObjectMapper();Transaction transaction = objectMapper.readValue(value, Transaction.class);// 从 Redis 获取风险标签RiskTag riskTag = redisService.getRiskTag(transaction.getAccountId());if (riskTag == null) {// 如果 Redis 中没有,从数据库获取并更新到 RedisriskTag = databaseService.getRiskTag(transaction.getAccountId());if (riskTag != null) {redisService.setRiskTag(riskTag);} else {// 如果数据库中也没有,设定默认风险标签riskTag = new RiskTag(transaction.getAccountId(), 1);}}// 使用 Drools 进行风险评估boolean isRisk = riskEvaluator.evaluate(transaction, riskTag);// 根据评估结果进行处理if (isRisk) {System.out.println("Transaction " + transaction.getTransactionId() + " is risky. Action: Block");// 发送阻止交易的消息或记录日志} else {System.out.println("Transaction " + transaction.getTransactionId() + " is safe. Action: Approve");// 发送通过交易的消息或记录日志}} catch (Exception e) {e.printStackTrace();}});// 启动 Kafka StreamsKafkaStreams streams = new KafkaStreams(builder.build(), KafkaStreamsConfig.getProperties());streams.start();// 添加关闭钩子Runtime.getRuntime().addShutdownHook(new Thread(() -> {streams.close();redisService.close();try {databaseService.close();} catch (SQLException e) {e.printStackTrace();}}));}
    }
    

    运行示例

    1. 启动必要的服务

  • Redis:确保 Redis 服务在本地的 6379 端口运行。
  • Kafka:确保 Kafka 服务在本地的 9092 端口运行,并创建主题 transaction-topic
package com.example.riskcontrol;import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.kafka.clients.producer.*;import java.util.Properties;public class TransactionProducer {public static void main(String[] args) {Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("acks", "all");props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");Producer<String, String> producer = new KafkaProducer<>(props);try {ObjectMapper objectMapper = new ObjectMapper();// 创建示例交易数据Transaction transaction = new Transaction("tx1001", "account123", 12000.0, System.currentTimeMillis());String transactionJson = objectMapper.writeValueAsString(transaction);ProducerRecord<String, String> record = new ProducerRecord<>("transaction-topic", transaction.getTransactionId(), transactionJson);producer.send(record);System.out.println("Transaction sent: " + transactionJson);} catch (Exception e) {e.printStackTrace();} finally {producer.close();}}
}

. 运行应用程序

  • 先运行 RiskControlApplication,启动风控系统。
  • 再运行 TransactionProducer,发送交易数据。

4. 预期输出

风控系统将处理交易数据,使用 Drools 规则引擎进行评估,并根据规则打印评估结果。例如:

High risk transaction detected: Transaction{transactionId='tx1001', accountId='account123', amount=12000.0, timestamp=...}
Transaction tx1001 is risky. Action: Block

说明

  • Kafka Streams:用于实时消费交易数据,并进行数据处理。
  • Drools:规则引擎,用于评估交易的风险级别。
  • Redis:作为缓存,存储风险标签,快速获取账户的风险级别。
  • 分布式数据库(H2 数据库模拟):当 Redis 中没有风险标签时,从数据库获取,并更新到 Redis。
  • 风险标签:简单地使用风险级别(1-低风险,2-中风险,3-高风险)来表示。

注意事项

  • 异常处理:在实际应用中,需要更完善的异常处理机制,防止因异常导致程序崩溃。
  • 多线程与并发:在高并发场景下,需要考虑线程安全和性能优化。
  • 资源管理:确保所有的资源(如数据库连接、Redis 连接、Kafka Streams)在程序结束时正确关闭。
  • 配置管理:将硬编码的配置(如主机地址、端口、主题名)提取到配置文件中,便于管理和修改。

5、系统整体各个模块的调度关系流程

以下是系统各模块之间的交互流程,详细说明了调度关系:

  1. 交易数据的接收与预处理

    • 支付业务系统将实时交易数据通过消息队列模块(Kafka)接口与通信模块(API/gRPC)发送到实时交易数据处理模块
    • 实时交易数据处理模块接收数据后,进行数据预处理,如格式验证和完整性检查。
  2. 风险标签的获取

    • 实时交易数据处理模块需要获取交易涉及的账户或用户的风险标签。
    • 首先从**数据存储与缓存模块(Redis)**中查询风险标签。
    • 如果缓存中没有对应的风险标签,则从分布式数据库中读取,并更新到缓存。
  3. 风险评估

    • 实时交易数据处理模块将交易数据和风险标签一起传递给规则引擎模块
    • 规则引擎模块根据预定义的业务规则,对交易进行风险评估,生成评估结果(如通过、拒绝、需人工审核)。
  4. 评估结果的返回

    • 规则引擎模块将评估结果返回给实时交易数据处理模块
    • 实时交易数据处理模块通过接口与通信模块将评估结果反馈给支付业务系统,执行相应的业务操作。
  5. 风险标签的批量更新

    • 批量风险标签处理模块定期执行,获取历史数据进行风险标签的重新计算。
    • 计算出的风险标签存储在分布式数据库中,并同步更新到Redis 缓存
  6. 系统监控与安全

    • 监控与运维模块持续监控各模块的状态和性能,收集日志信息,设置报警机制。
    • 安全与合规模块确保数据传输和存储的安全性,对各模块的访问进行权限控制,满足合规要求。
[支付业务系统]|v
1. 发送交易数据|v
[消息队列模块(Kafka)/接口与通信模块(API/gRPC)]|v
[实时交易数据处理模块]|+--> 2. 从缓存获取风险标签|         ||         v|    [数据存储与缓存模块(Redis)]|         ||     若未命中|         v|    从数据库获取并更新缓存|         ||    [分布式数据库]|+--> 3. 调用规则引擎模块|         ||         v|    [规则引擎模块]|         ||     执行风险评估|         ||    返回评估结果|+--> 4. 返回评估结果给支付业务系统|         |v         v
[接口与通信模块] <---> [支付业务系统]

总结

上述示例提供了一个基本的程序框架,演示了如何将 Kafka、Kafka Streams、Drools、Redis 和分布式数据库集成在一起,完成实时风控的基本功能。在实际项目中,需要根据具体的业务需求和技术环境,对程序进行扩展和优化。

相关文章:

Kafka、Kafka Streams、Drools、Redis 和分布式数据库的风控系统程序

由于实时风控系统难度较大&#xff0c;集成框架设计各个单位均有特点&#xff0c;快速建立一个通用性较强&#xff0c;学习、实施和使用成本较低的框架尤其重要。 提供一个简化的 Java 程序示例&#xff0c;演示如何将 Kafka 消息中间件、Kafka Streams 计算引擎、Drools 规则…...

C++在实际项目中的应用第一课:游戏开发中的C++

第五章&#xff1a;C在实际项目中的应用 第一课&#xff1a;游戏开发中的C 1. 游戏引擎架构的详细分析 游戏引擎是现代游戏开发的核心&#xff0c;负责处理图形渲染、物理计算、音频管理和用户输入等多项功能。以下是游戏引擎架构的各个主要组成部分及其详细分析。 1.1 渲染…...

一键下载海外youtbe视频 解锁版 支持多分辨率

下载&#xff1a;https://pan.quark.cn/s/387e1110ebe5 【应用名称】&#xff1a;Snaptube 【应用版本】&#xff1a;7.28.0 【应用大小】&#xff1a;26.6M 【测试机型】&#xff1a;小米10S 【适用平台】&#xff1a;Andriod 【版本说明】&#xff1a;解锁版...

Scala内部类的运用

内部类&#xff1a;定义在类里面的类&#xff08;内部类可以访问私有成员用它来操作类的私有成员&#xff0c;封闭性更好&#xff09; class Student{var age18def say():Unit{}class Book{val bookName: Any "Scala程序设计"}}object Test19 {def main(args: Arra…...

【在Linux世界中追寻伟大的One Piece】Socket编程UDP

目录 1 -> UDP网络编程 1.1 -> V1版本 -echo server 1.2 -> V2版本 -DictServer 1.3 -> V2版本 -DictServer(封装版) 1 -> UDP网络编程 1.1 -> V1版本 -echo server 简单的回显服务器和客户端代码。 备注&#xff1a;代码中会用到地址转换函数。 noc…...

机器学习在聚合物及其复合材料中的应用与实践

在当前的工业和科研领域&#xff0c;聚合物及其复合材料因其卓越的物理和化学性能而受到广泛关注。这些材料在航空航天、汽车制造、能源开发和生物医学等多个行业中发挥着至关重要的作用。随着材料科学的发展&#xff0c;传统的实验和理论分析方法已逐渐无法满足新材料研发的需…...

用大模型或者预训练模型对图片进行OCR

背景:使用大模型或者预训练模型(比如来自huggingface上的模型)对图片进行OCR,并将识别结果标记在图片原文的下方。 愿我们终有重逢之时,而你还记得我们曾经讨论的话题。 QQ group 868373192 QQ second group 277356808 要使用预训练模型对图片进行OCR(光学字符识别)…...

如何使用的是github提供的Azure OpenAI服务

使用的是github提供的Azure OpenAI的服务gpt-4o 说明&#xff1a;使用的是github提供的Azure OpenAI的服务&#xff0c;可以无限薅羊毛。开源地址 进入&#xff1a; 地址 进入后点击 右上角“Get API key”按钮 点击“Get developer key” 选择Beta版本“Generate new to…...

elementUI进度条el-progress不显示白色

效果图 通过设置百分比为100,动态修改进度条的宽度完成 <template><div class"myProgressBox"><div class"index">{{ index }}</div><div class"typeTitle">{{ typeTitle }}</div><div class"twoP…...

学习笔记——路由——IP组播-PIM(协议无关组播)-概述/PIM模式

八、PIM(协议无关组播) 1、前言 在单播中&#xff0c;是一对一的模型&#xff0c;路由器将IP数据包发往目标地址&#xff0c;因此&#xff0c;单播路由器不用关心发送数据包得源地址。而组播数据流量由组播产生&#xff0c;发向一组接收者&#xff0c;那们组播路由器如何这道…...

TCP 协议学习

一、引言 在当今的网络通信世界中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是最为重要的协议之一。它为各种网络应用提供了可靠的、有序的数据传输服务&#xff0c;是互联网通信的基石。无论是网页浏览、电子邮件发送、…...

python3的基本数据类型:String(字符串)

一. 简介 本文简单学习了一下 python3中的一种数据类型&#xff1a; String&#xff08;字符串&#xff09;。 Python中的String类型是一种用于表示文本数据的数据类型。‌ 它可以包含字母、数字、符号等字符&#xff0c;用于存储文本信息。 二. python3的基本数据类型&…...

面试总结(2024/10/16)

面试总结&#xff08;2024/10/16&#xff09; 面试11.闭包2.promise3.全局数据的保存4.多模板切换&#xff0c;布局&#xff0c;系统主题颜色5.同一个搜索&#xff0c;不同的搜索条件&#xff0c;输入框不同的校验方法6.自定义一个组件&#xff0c;包括哪些属性7.多个父组件之间…...

从图像识别到聊天机器人:Facebook AI的多领域应用

随着人工智能技术的快速发展&#xff0c;Facebook已在多个领域内广泛应用AI技术&#xff0c;以提升用户体验、提高效率并推动创新。从图像识别到聊天机器人&#xff0c;Facebook的AI应用涵盖了社交媒体的方方面面&#xff0c;下面我们将深入探讨这些应用的具体实现及其对用户生…...

linux中级(NFS服务器)

NFS&#xff1a;用于在NNIX/Linux主机之间进行文件共享的协议 流程&#xff1a;首先服务端开启RPC服务&#xff0c;并开启111端口&#xff0c;服务器端启动NFS服务&#xff0c;并向RPC注册端口信息&#xff0c;客户端启动RPC&#xff0c;向服务器RPC服务请求NFS端口&#xff0…...

微软主动出击,“钓”出网络钓鱼者

微软正采取一种巧妙的策略来对抗网络钓鱼行为者&#xff0c;其手段是通过访问Azure平台创建高度仿真的蜜罐租户&#xff0c;以此作为诱饵&#xff0c;吸引网络犯罪分子进入&#xff0c;进而收集他们的相关信息。 凭借所收集的数据&#xff0c;微软能够绘制出恶意基础设施的地图…...

Xcode16 编译运行YYCache iOS18 sqlite3_finalize 闪退问题解决方案

问题原因 升级Xcode 16 之后&#xff0c;真机运行APP&#xff0c;发现会有Crash&#xff0c;崩溃堆栈线上Crash 在 YYCache 之中。如下图所示 崩溃堆栈如下&#xff1a; * thread #1, queue com.apple.main-thread, stop reason signal SIGABRTframe #0: 0x00000001d9391…...

Kafka-Windows搭建全流程(环境,安装包,编译,消费案例,远程连接,服务自启,可视化工具)

目录 一. Kafka安装包获取 1. 官网地址 2. 百度网盘链接 二. 环境要求 1. Java 运行环境 (1) 对 java 环境变量进行配置 (2) 下载完毕之后进行解压 三. 启动Zookeeper 四. 启动Kafka (1) 修改Conf下的server.properties文件&#xff0c;修改kafka的日志文件路径 (2)…...

django模板相关配置

模板引擎配置 Django支持多种模板引擎&#xff0c;最常用的是Django自带的模板引擎和Jinja2模板引擎。模板引擎的配置主要在settings.py文件中的TEMPLATES列表中进行。 BACKEND&#xff1a;指定模板引擎。例如&#xff0c;BACKEND: django.template.backends.django.DjangoTe…...

MongoDB等保限制下的连接认证问题

目录 一、问题描述 二、解决方案 三、代码示例 四、拓展知识 一、问题描述 用户调整用户连接认证机制以满足等保要求,调整后程序连接mongodb失败。数据库日志报错如下: {"t":{"$date":"2024-10-10T14:39:07.825+08:00"},"s":&q…...

2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP

文章目录 一、前言二、MICS你是黑客么循环的压缩包Goodtime 三、WEBpy 四、Crypto变异凯撒RSAcrypto3 一、前言 WP不完整&#xff0c;仅供参考&#xff01; 除WEB&#xff0c;RE&#xff0c;PWN外&#xff0c;其余附件均已打包完毕 也是一个对MISC比较友好的一个比赛~ 123网…...

idea 无法输入中文 快速解决

idea在某些情况会出现无法输入中文的情况&#xff0c;我们不去深究内部原因&#xff0c;直接上解决方案&#xff1a; 1、点击菜单help->Edit Custom VM Options 2、最后一行&#xff0c;追加&#xff1a; -Drecreate.x11.input.methodtrue 、 3、重启...

掌握ElasticSearch(五):查询和过滤器

一、查询和过滤器的区别 在 Elasticsearch 中&#xff0c;查询&#xff08;Query&#xff09;和过滤器&#xff08;Filter&#xff09;是用于检索和筛选数据的重要组成部分。它们虽然都能用来查找文档&#xff0c;但在性能和用法上有所不同。下面详细介绍查询和过滤器的概念以…...

自学[vue+SpringCloud]-012-SpringCloud工程发送邮件

文章目录 前言一、配置QQ邮箱1.1 设置1.2 获取授权码 二、服务发送邮件2.1 引入依赖包2.2 新建AlarmMessageDto2.3 增加controller代码2.4 main方法测试 总结 前言 skywalking监控通过webhook调用SpringCloud服务接口&#xff0c;接口中发送告警邮件。 一、配置QQ邮箱 1.1 设…...

STM32通信协议-I2C

目录 一&#xff0c;IC2的协议规则 I2C总线是PHILIPS公司开发的两线式串行总线&#xff0c;I2C总线主要解决了单片机一对多通信的问题 两根通信线&#xff1a;SCL,SDA&#xff0c;同步&#xff0c;半双工通信&#xff0c;支持数据应答机制&#xff0c;支持总线挂载多设备。 …...

廉颇老矣尚能饭否,实践甘肃数据挖掘挑战赛作物与杂草的智能识别,基于YOLOv3全系列【tiny/l/spp】参数模型开发构建田间低头作物杂草智能化检测识别模型

一、背景 田间杂草的有效管理是现代农业生产中面临的重要挑战之一。杂草不仅竞争作物的养分、 水分和阳光&#xff0c;还可能成为害虫和病原体的寄主&#xff0c;从而降低农作物的产量和品质。因此&#xff0c;开发 高效、精确的杂草检测和管理系统对于提高农业生产效率、降低化…...

基于Django+Python的宾馆管理系统设计与实现

项目运行 需要先安装Python的相关依赖&#xff1a;pymysql&#xff0c;Django3.2.8&#xff0c;pillow 使用pip install 安装 第一步&#xff1a;创建数据库 第二步&#xff1a;执行SQL语句&#xff0c;.sql文件&#xff0c;运行该文件中的SQL语句 第三步&#xff1a;修改源…...

MySQL--mysql的安装

1.Linux上mysql的安装: Ubuntu下: (1)安装前首先切换到管理员身份:sudo su (2)然后执行命令:apt install mysql-server (注意:装的是服务器端,客户端自动就安装了) (3)执行过程中按y; 2.Mysql初始化配置 注意,一定是sudo su,必须是管理员才能进行Mysql的初始化设置; 初始化…...

qt 构建、执行qmake、运行、重新构建、清除

qt右键功能有 构建、执行qmake、运行、重新构建、清除&#xff0c;下面简单介绍一下各个模块的作用。 1. 执行qmake qmake是一个工具&#xff0c; 它根据pro文件生成makefile文件&#xff0c;而makefile文件中则定义编译与连接的规则。pro文件中定义了头文件&#xff0c;源文件…...

微软发布 Win11 22H2/23H2 十月可选更新KB5044380!

系统之家于10月23日发出最新报道&#xff0c;微软针对Win11 22H2和23H2用户&#xff0c;发布了10月可选更新KB5044380&#xff0c;用户安装后版本号升至22621.4391和22631.4391。本次更新开始推出屏幕键盘的新游戏板键盘布局&#xff0c;支持用户使用Xbox控制器在屏幕上移动和键…...

自己做同城购物网站/网络营销的现状

{tb;【?】;ct;} bc printf(\12.完成程序填空&#xff0c;实现已知三个数a&#xff0c;b&#xff0c;c&#xff0c;找出最大值放于max中。 if(a>b) 【?】; maxa else maxb;if (【?】) maxc; c>max printf(\【?】); ,max13.完成程序填空&#xff0c;实现求s135??99. …...

网站引导动画/如何做seo优化

1&#xff0c;带缓冲的字符流, BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率 BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率 2&#…...

万网 网站建设/百度问答怎么赚钱

作用 例子 备注 E#name 产生一个id为name的标签 span#name 可以直接使用#name,默认产生的标签是div E.name 产生一个class为name的标签 span.name span.name.title 可以直接使用.name,默认产生的标签是div E>E 产生父子级结构 div>span EE 产生兄弟级结构 .side.main…...

网站模板加盟代理/全国各城市感染高峰进度查询

1086.花生米&#xff08;五&#xff09; 时限&#xff1a;1000ms 内存限制&#xff1a;10000K 总时限&#xff1a;3000ms 描述 五一长假第六天&#xff0c;Tom在QQ上遇到了Kitty。呵呵&#xff0c;Kitty&#xff0c;在离散数学课上认识的PPMM……等等&#xff01;Tom恍然大…...

动态网站和静态网站有什么区别/长春网站优化体验

...

快速搭建网站工具/天津百度关键词seo

题意&#xff1a; 给定n个城市的坐标&#xff0c;要在城市中建k个飞机场&#xff0c;使城市距离最近的飞机场的最长距离最小&#xff0c;求这个最小距离。 分析&#xff1a; 最小化最大值&#xff0c;显然二分最大距离。然后我们将距离在范围内的两个城市建边&#xff0c;建一个…...