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

Kafka SASL/SCRAM介绍

文章目录

  • Kafka SASL/SCRAM介绍
  • 1. SASL/SCRAM 认证机制
  • 2. SASL/SCRAM 认证工作原理
    • 2.1 SCRAM 认证原理
      • 2.1.1 密码存储和加盐
      • 2.1.2 SCRAM 认证流程
    • 2.2 SCRAM 认证的关键算法
    • 2.3 SCRAM 密码存储
    • 2.4 SCRAM 密码管理
  • 3. 配置和使用 Kafka SASL/SCRAM
    • 3.1 Kafka 服务器端配置
    • 3.2 创建 SCRAM 用户并设置密码
    • 3.3 Kafka 客户端配置
    • 3.4 使用 SSL 加密连接
    • 3.5 SCRAM 配置管理和维护
  • 4. 安全性与最佳实践
    • (1)使用强密码
    • (2)使用 SASL_SSL
    • (3)定期更新密码
    • (4)启用审计日志
  • 5. 总结

Kafka SASL/SCRAM介绍

Kafka SASL/SCRAM 是一种更为安全的认证机制,相比于 SASL/PLAIN,它提供了更高的密码保护和认证强度。SASL/SCRAM(Salted Challenge Response Authentication Mechanism)使用加密的密码存储和认证机制,可以有效防止密码明文传输,因此在生产环境中得到了广泛应用。

1. SASL/SCRAM 认证机制

SASL/SCRAM 是基于 Challenge-Response 的认证机制,其中客户端使用经过哈希加盐(salted hash)处理的密码进行身份验证,而 Kafka 集群通过比较存储在服务器上的加密密码来验证客户端身份。该机制具有以下特点:

  • 加盐密码存储:密码通过 SCRAM 算法(通常是 SHA-256SHA-512)进行加盐哈希,避免了明文密码泄露的风险。
  • 双向认证:客户端和 Kafka 服务器使用相同的密钥进行相互认证,防止中间人攻击(MITM)。
  • 适用于生产环境SASL/SCRAM 提供了比 SASL/PLAIN 更强的安全性,适合用于需要更高安全性的生产环境。

2. SASL/SCRAM 认证工作原理

2.1 SCRAM 认证原理

SASL/SCRAM 基于挑战-响应机制(Challenge-Response)。在这种机制中,客户端和服务器在认证过程中交换加密的认证信息,而不是传递明文密码。其核心思想是,客户端和服务器都使用一个加盐哈希算法(如 SHA-256SHA-512)来生成密码的散列值,以此进行身份验证。

具体步骤如下:

2.1.1 密码存储和加盐

  • 密码存储:与其他认证机制不同,SCRAM 在服务器端不会存储明文密码,而是将密码经过哈希算法加盐处理后存储。加盐(salt)意味着将随机生成的盐值与密码进行拼接,然后进行哈希处理,这样即使两个用户使用相同密码,其哈希值也是不同的。

  • 加盐哈希(Salted Hash):SCRAM 使用加盐和迭代哈希来增加密码的安全性,防止通过彩虹表等方式暴力破解密码。

2.1.2 SCRAM 认证流程

SASL/SCRAM 认证流程涉及多个步骤,客户端和服务器会进行一系列的相互验证:

(1)客户端发起认证请求

客户端生成请求:客户端首先向 Kafka 服务器发送认证请求。此请求包含客户端的身份(如用户名)和一个初始的响应(称为 “Client First Message”)。

客户端发送的初始消息:这个消息包含客户端的用户名和一个生成的随机 nonce(一次性使用的随机数)。

示例:

n=user,r=nonce

(2)服务器响应请求

服务器生成挑战消息:服务器收到客户端的请求后,会生成一个挑战消息,响应客户端。挑战消息包含一个随机生成的 nonce,以及一个 salt(盐值)和迭代次数等信息。服务器还会将该信息进行哈希后存储,用于后续的密码验证。

示例:

r=nonce, s=salt, i=iterations
  • r: 随机数(nonce),保证每次认证的唯一性。
  • s: 盐值(salt),用于加盐哈希。
  • i: 迭代次数(iterations),用于增加计算难度,防止暴力破解。

(3)客户端响应挑战

客户端计算密码哈希并发送响应:客户端使用自己的密码、服务器提供的盐值、迭代次数和挑战信息计算出一个响应信息(称为 “Client Final Message”)。此响应信息包含客户端生成的密码哈希值。

客户端通过以下公式生成哈希:

HMAC(Salt + Password + Iterations, Nonce)

然后将这个结果(包括一个用户名、客户端响应、以及 nonce)作为响应返回给服务器。

示例:

c=biws,r=nonce,p=HMAC(Salt + Password + Iterations, Nonce)
  • c: 表示编码格式,通常为 biws
  • p: 客户端计算出的密码哈希值。

(4)服务器验证客户端响应

服务器验证客户端的响应:服务器接收到客户端的响应后,使用自己的存储的盐值、迭代次数、以及密码来验证客户端提供的密码哈希是否匹配。如果验证成功,表示客户端身份合法。

  • 服务器使用相同的盐值和迭代次数进行哈希计算,然后与客户端发送过来的哈希值进行比对。如果一致,表示认证通过。

(5)服务器发送验证结果

服务器发送最终响应:如果客户端提供的密码验证成功,服务器向客户端发送一个成功的响应消息,完成认证过程。如果验证失败,则返回认证失败的错误信息。

2.2 SCRAM 认证的关键算法

SCRAM 使用以下关键算法来加密和保护密码:

  • 哈希算法SCRAM 使用标准的哈希算法(通常为 SHA-256SHA-512)对密码进行加盐处理。盐值(salt)是一个随机生成的字节序列,确保相同密码的哈希结果不同。

  • HMAC:客户端和服务器在认证过程中使用 HMAC(Hash-based Message Authentication Code) 算法来生成密码的哈希。HMAC 结合了密码、盐值、迭代次数和随机数,使得破解密码更加困难。

  • 迭代次数:为了提高密码保护的强度,SCRAM 认证要求使用多次迭代的哈希操作。这意味着密码的哈希计算不仅仅是一次简单的哈希,而是重复进行多次迭代,从而增加了计算的复杂度,防止暴力破解。

2.3 SCRAM 密码存储

在 SCRAM 中,密码不以明文存储,而是存储加盐哈希值。服务器存储的是密码的哈希信息(通常是经过多次迭代的 HMAC 值),而不是密码本身。

存储结构示例

SCRAM-SHA-256$4096:randomSalt:hashedPassword
  • SCRAM-SHA-256: 表示使用的哈希算法(SHA-256)。
  • 4096: 迭代次数(密码哈希计算的迭代次数)。
  • randomSalt: 随机生成的盐值,用于加盐哈希。
  • hashedPassword: 密码的最终哈希值。

2.4 SCRAM 密码管理

  • 添加用户和设置密码:使用 Kafka 提供的 kafka-configs.sh 命令或 Kafka 管理界面来添加用户,并设置用户的 SCRAM 密码。

    示例命令:

    bin/kafka-configs.sh --bootstrap-server localhost:9093 --alter --add-config 'SCRAM-SHA-256=[password=secretpassword]' --entity-type users --entity-name user1
    
  • 查看密码配置:管理员可以通过 kafka-configs.sh 查询用户的 SCRAM 密码配置。

    示例命令:

    bin/kafka-configs.sh --bootstrap-server localhost:9093 --describe --entity-type users --entity-name user1
    

3. 配置和使用 Kafka SASL/SCRAM

3.1 Kafka 服务器端配置

为了启用 SASL/SCRAM 认证机制,需要在 Kafka 服务器端进行相关配置。

(1)修改 Kafka 服务器配置文件 server.properties

  1. 打开 Kafka 配置文件 server.properties
  2. 配置 SASLSCRAM 相关参数:
# 启用 SASL/SCRAM 认证
listeners=SASL_PLAINTEXT://0.0.0.0:9093
listener.security.protocol=SASL_PLAINTEXT  # 传输层协议,支持 SASL 和 PLAIN 认证# 支持的 SASL 认证机制
sasl.enabled.mechanisms=SCRAM-SHA-256,SCRAM-SHA-512  # 选择支持的机制(SCRAM-SHA-256 或 SCRAM-SHA-512)# Kafka 集群与集群之间的通信协议配置(如分区副本等)
security.inter.broker.protocol=SASL_PLAINTEXT# 使用 SCRAM 算法(通常为 SCRAM-SHA-256 或 SCRAM-SHA-512)
scram.algorithm=SCRAM-SHA-256
  • listeners: 配置 Kafka 接受连接的端口,这里设置为 SASL_PLAINTEXT,代表使用没有加密的 SASL 认证。
  • sasl.enabled.mechanisms: 启用 SCRAM-SHA-256SCRAM-SHA-512 机制,可以选择其中之一。
  • security.inter.broker.protocol: 配置 Kafka 集群内的节点间通信协议。

(2)启动或重启 Kafka 服务

配置完成后,重启 Kafka 服务器使配置生效:

bin/kafka-server-start.sh config/server.properties

3.2 创建 SCRAM 用户并设置密码

Kafka 中的 SCRAM 用户和密码信息可以通过命令行工具 kafka-configs.sh 配置。我们使用 kafka-configs.sh 命令来创建 SCRAM 用户并为其设置密码。

(1)创建 SCRAM 用户并设置密码

bin/kafka-configs.sh --bootstrap-server localhost:9093 --alter --add-config 'SCRAM-SHA-256=[password=secretpassword]' --entity-type users --entity-name kafka-client
  • --alter: 修改现有配置。
  • --add-config: 添加新的配置项,这里是添加密码信息。
  • SCRAM-SHA-256=[password=secretpassword]: 指定使用 SCRAM-SHA-256 并设置密码为 secretpassword
  • --entity-type users: 指定要操作的实体类型为 users
  • --entity-name kafka-client: 指定用户名为 kafka-client

(2)检查用户配置

可以使用以下命令查看已配置用户的 SCRAM 信息:

bin/kafka-configs.sh --bootstrap-server localhost:9093 --describe --entity-type users --entity-name kafka-client

这将列出与 kafka-client 用户相关的 SCRAM 配置信息,包括算法、密码哈希值等。

3.3 Kafka 客户端配置

Kafka 客户端(如生产者或消费者)需要配置 SASL/SCRAM 认证来连接到 Kafka 集群。

(1)配置 Kafka 生产者

在 Kafka 生产者的配置文件中,设置使用 SASL/SCRAM 进行认证:

# Kafka 生产者配置
bootstrap.servers=localhost:9093
security.protocol=SASL_PLAINTEXT  # 配置为使用 SASL 认证
sasl.mechanism=SCRAM-SHA-256  # 选择 SCRAM-SHA-256 认证机制# 配置 JAAS 登录模块(用户名和密码)
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \username="kafka-client" \password="secretpassword";
  • security.protocol: 配置为 SASL_PLAINTEXT,表示 Kafka 客户端与服务器之间的通信使用 SASL 认证。
  • sasl.mechanism: 指定使用的认证机制,这里设置为 SCRAM-SHA-256
  • sasl.jaas.config: 配置 JAAS(Java Authentication and Authorization Service)认证模块,设置用户名和密码。

(2)配置 Kafka 消费者

对于 Kafka 消费者的配置,与生产者类似,只需确保配置正确的认证信息:

# Kafka 消费者配置
bootstrap.servers=localhost:9093
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256# 配置 JAAS 登录模块
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \username="kafka-client" \password="secretpassword";

(3)使用 Kafka 客户端

在客户端配置好之后,可以启动生产者或消费者应用,进行数据的发送和消费。

示例:Kafka 生产者代码

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9093");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("security.protocol", "SASL_PLAINTEXT");
props.put("sasl.mechanism", "SCRAM-SHA-256");
props.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"kafka-client\" password=\"secretpassword\"");KafkaProducer<String, String> producer = new KafkaProducer<>(props);ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value");
producer.send(record);producer.close();

3.4 使用 SSL 加密连接

如果需要加密通信,建议使用 SASL_SSL,结合 SSL/TLS 进行数据加密,避免密码和数据被中间人攻击者截取。

(1)配置 Kafka 服务器启用 SSL

server.properties 文件中进行 SSL 配置:

listeners=SASL_SSL://0.0.0.0:9094  # 启用加密的 SASL 连接
security.inter.broker.protocol=SASL_SSL  # 配置集群内部通信协议
ssl.keystore.location=/path/to/keystore.jks  # 配置 keystore 路径
ssl.keystore.password=<keystore-password>
ssl.truststore.location=/path/to/truststore.jks  # 配置 truststore 路径
ssl.truststore.password=<truststore-password>

(2)客户端启用 SSL 加密

客户端(生产者或消费者)也需要启用 SSL 配置:

bootstrap.servers=localhost:9094
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-256# 配置 JAAS 登录模块
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \username="kafka-client" \password="secretpassword";# 配置 SSL
ssl.truststore.location=/path/to/truststore.jks
ssl.truststore.password=<truststore-password>

(3)启动客户端

在配置完成后,客户端可以通过 SSL 加密连接到 Kafka 集群,确保所有数据都在加密通道中传输。

3.5 SCRAM 配置管理和维护

(1)修改用户密码

如果需要修改 SCRAM 用户的密码,可以通过 kafka-configs.sh 工具进行更改:

bin/kafka-configs.sh --bootstrap-server localhost:9093 --alter --add-config 'SCRAM-SHA-256=[password=newpassword]' --entity-type users --entity-name kafka-client

(2)查看用户配置

可以查看 SCRAM 配置的详细信息,检查用户的认证状态和密码配置:

bin/kafka-configs.sh --bootstrap-server localhost:9093 --describe --entity-type users --entity-name kafka-client

4. 安全性与最佳实践

SASL/SCRAM 提供了比 SASL/PLAIN 更强的安全性,但在使用时需要注意以下几点:

(1)使用强密码

  • 配置 SASL/SCRAM 时,确保使用强密码。避免使用简单、易猜的密码,如 password123
  • 可以通过强密码策略来保证密码的复杂性。

(2)使用 SASL_SSL

  • 虽然 SASL/SCRAM 本身提供了强大的认证机制,但在公开网络中传输认证信息时,仍然推荐使用 SASL_SSL,以保证数据的加密传输,防止中间人攻击。
  • 配置 SSL/TLS 加密后,密码和认证过程会通过加密的通道传输,增加额外的安全性。

(3)定期更新密码

  • 定期更换 Kafka 用户的密码,以增强集群的安全性。
  • 可以通过 kafka-configs.sh 命令轻松更换用户密码。

(4)启用审计日志

  • 对于生产环境,建议启用 Kafka 的审计日志,记录认证过程中的活动。可以通过外部日志管理系统来审计和追踪认证请求。

5. 总结

SASL/SCRAM 是一种比 SASL/PLAIN 更安全的 Kafka 认证机制。它通过使用加盐哈希密码存储方式避免了明文密码的泄露,并提供了强大的认证保障,特别适合用于生产环境。配置过程相对简单,但在部署时需要配合 SSL/TLS 以确保认证过程的安全性。正确的用户管理、强密码策略以及定期更新密码是保证系统安全的最佳实践。

相关文章:

Kafka SASL/SCRAM介绍

文章目录 Kafka SASL/SCRAM介绍1. SASL/SCRAM 认证机制2. SASL/SCRAM 认证工作原理2.1 SCRAM 认证原理2.1.1 密码存储和加盐2.1.2 SCRAM 认证流程 2.2 SCRAM 认证的关键算法2.3 SCRAM 密码存储2.4 SCRAM 密码管理 3. 配置和使用 Kafka SASL/SCRAM3.1 Kafka 服务器端配置3.2 创建…...

中间件漏洞之CVE-2024-53677

目录 什么是struts&#xff1f;CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts&#xff1f; 在早期的 Java Web 开发中&#xff0c;代码往往混乱不堪&#xff0c;难以维护和扩展。比如&#xff0c;一个简单的用户登录功能&#xff0c;可能在不同的 Java 类…...

pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)

以下是一个完整的词嵌入&#xff08;Word Embedding&#xff09;示例代码&#xff0c;使用 modelscope 下载 tiansz/bert-base-chinese 模型&#xff0c;并通过 transformers 加载模型&#xff0c;获取中文句子的词嵌入。 from modelscope.hub.snapshot_download import snaps…...

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …...

区间覆盖问题

文章目录 1. 题面2. 简单分析3. 代码解答4. TLE的2点可能 1. 题面 给定 N N N个区间 [ a i , b i ] [a_i,b_i] [ai​,bi​] 以及一个区间 [ s , t ] [s,t] [s,t]&#xff0c;请你选择尽量少的区间&#xff0c;将指定区间完全覆盖。 输出最少区间数&#xff0c;如果无法完全…...

【LLM-agent】(task2)用llama-index搭建AI Agent

note LlamaIndex 实现 Agent 需要导入 ReActAgent 和 Function Tool&#xff0c;循环执行&#xff1a;推理、行动、观察、优化推理、重复进行。可以在 arize_phoenix 中看到 agent 的具体提示词&#xff0c;工具被装换成了提示词ReActAgent 使得业务自动向代码转换成为可能&am…...

SpringAI 人工智能

随着 AI 技术的不断发展&#xff0c;越来越多的企业开始将 AI 模型集成到其业务系统中&#xff0c;从而提升系统的智能化水平、自动化程度和用户体验。在此背景下&#xff0c;Spring AI 作为一个企业级 AI 框架&#xff0c;提供了丰富的工具和机制&#xff0c;可以帮助开发者将…...

【axios二次封装】

axios二次封装 安装封装使用 安装 pnpm add axios封装 // 进行axios二次封装&#xff1a;使用请求与响应拦截器 import axios from axios import { ElMessage } from element-plus//创建axios实例 const request axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,…...

P7497 四方喝彩 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作&#xff0c;分四种&#xff1a; add ⁡ ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v)&#xff1a;对于所有 i ∈ [ l , r ] i \in [l,r…...

深入剖析 Bitmap 数据结构:原理、应用与优化策略

深入理解 Bitmap 数据结构 一、引言 在计算机科学领域&#xff0c;数据的高效存储和快速处理一直是核心问题。随着数据量的不断增长&#xff0c;如何用最少的空间和最快的速度来表示和操作数据变得至关重要。Bitmap&#xff08;位图&#xff09;作为一种简洁而强大的数据结构…...

bypass hcaptcha、hcaptcha逆向

可以过steam&#xff0c;已支持并发&#xff0c;欢迎询问&#xff01; 有事危&#xff0c;ProfessorLuoMing...

WebForms DataList 深入解析

WebForms DataList 深入解析 引言 在Web开发领域,控件是构建用户界面(UI)的核心组件。ASP.NET WebForms框架提供了丰富的控件,其中DataList控件是一个灵活且强大的数据绑定控件。本文将深入探讨WebForms DataList控件的功能、用法以及在实际开发中的应用。 DataList控件…...

C# List 列表综合运用实例⁓Hypak原始数据处理编程小结

C# List 列表综合运用实例⁓Hypak原始数据处理编程小结 1、一个数组解决很麻烦引出的问题1.1、RAW 文件尾部数据如下:1.2、自定义标头 ADD 或 DEL 的数据结构如下&#xff1a; 2、程序 C# 源代码的编写和剖析2.1、使用 ref 关键字&#xff0c;通过引用将参数传递&#xff0c;以…...

【C++基础】字符串/字符读取函数解析

最近在学C以及STL&#xff0c;打个基础 参考&#xff1a; c中的char[] ,char* ,string三种字符串变量转化的兼容原则 c读取字符串和字符的6种函数 字符串结构 首先明确三种字符串结构的兼容关系&#xff1a;string>char*>char [] string最灵活&#xff0c;内置增删查改…...

大模型-CLIP 详细介绍

CLIP简介 CLIP&#xff08;Contrastive Language–Image Pre-training&#xff09;是由OpenAI在2021年提出的一种多模态机器学习模型。它旨在通过大量的文本-图像对进行训练&#xff0c;从而学会理解图像内容&#xff0c;并能将这些内容与相应的自然语言描述相匹配。CLIP的核心…...

1.4 Go 数组

一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中&#xff0c;数组的长度是类型的一部分&#xff0c;因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定&#xff0c;且不可更改。 简单来说&#xff0c;数组…...

WebSocket——环境搭建与多环境配置

一、前言&#xff1a;为什么要使用多环境配置&#xff1f; 在开发过程中&#xff0c;我们通常会遇到多个不同的环境&#xff0c;比如开发环境&#xff08;Dev&#xff09;、测试环境&#xff08;Test&#xff09;、生产环境&#xff08;Prod&#xff09;等。每个环境的配置和需…...

三、递推关系与母函数,《组合数学(第4版)》卢开澄 卢华明

文章目录 一、似函数、非函数1.1 母函数1.2 母函数的简单应用1.3 整数拆分1.4 Ferrers 图像1.5 母函数能做什么1.6 递推关系1.6.1 Hanoi 问题1.6.2 偶数个5怎么算 1.7 Fibonacci 序列1.7.1 Fibonacci 的奇妙性质1.7.2 Fibonacci 恒等式1.7.3 Fibonacci 的直接表达式1.7.4 Fibon…...

线程互斥同步

前言&#xff1a; 简单回顾一下上文所学&#xff0c;上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么&#xff0c;总结一句话&#xff0c;就是tid是用户视角下所认为的概念&#xff0c;因为在Linux系统中&#xff0c;从来没有线程这一说法&#xff0c;…...

DeepSeek R1 AI 论文翻译

摘要 原文地址&#xff1a; DeepSeek R1 AI 论文翻译 我们介绍了我们的第一代推理模型&#xff0c;DeepSeek-R1-Zero 和 DeepSeek-R1。 DeepSeek-R1-Zero 是一个通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;且在此过程中未使用监督微调&#xff08;…...

如何计算态势感知率?

态势感知率&#xff08;Situational Awareness Rate&#xff09;的计算通常需要结合具体应用场景和定义目标&#xff0c;通常涉及对感知、理解、预测三个层次的量化分析。不同领域&#xff08;如网络安全、军事、工业控制等&#xff09;可能有不同的量化方式。通用思路和常见方…...

二、CSS笔记

(一)css概述 1、定义 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离。 2、要点 怎么找到标签怎么操作标签对象(element) 3、css的四种引入方式 3.1 行内式 在标签的style属性中设定CSS样式。这种方…...

Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱

文章目录 引言1. 使用SLF4J日志门面规则解释代码示例正例反例 2. 日志文件的保存时间规则解释 3. 日志文件的命名规范规则解释代码示例正例反例 4. 使用占位符进行日志拼接规则解释代码示例正例反例 5. 日志级别的开关判断规则解释代码示例正例反例 6. 避免重复打印日志规则解释…...

使用istio实现权重路由

istio概述 **概述&#xff1a;**Istio 是一个开源的 服务网格&#xff08;Service Mesh&#xff09;解决方案&#xff0c;主要用于管理、保护和监控微服务架构中的服务通信。它为微服务提供了基础设施层的控制功能&#xff0c;不需要更改应用程序的代码&#xff0c;从而解决服…...

M. Triangle Construction

题目链接&#xff1a;Problem - 1906M - Codeforces 题目大意&#xff1a;给一个 n 边形&#xff0c; 每一个边上有a[ i ] 个点&#xff0c; 在此多边形上求可以连的三角形有多少个&#xff0c; 每个点只能用一次。 输入&#xff1a; 第一行是一个整数 N ( 3 ≤ N ≤ 200000…...

每天学点小知识之设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基…...

机试题——到邻国目标城市的最短距离

题目描述 A国与B国是相邻的两个国家&#xff0c;每个国家都有很多城市。国家内部有很多连接城市的公路&#xff0c;国家之间也有很多跨国公路&#xff0c;连接两个国家的边界城市。两个国家一共有N个城市&#xff0c;编号从1到N&#xff0c;一共有M条公路&#xff0c;包括国内…...

Python + Tkinter + pyttsx3实现的桌面版英语学习工具

Python Tkinter pyttsx3实现的桌面版英语学习工具 在多行文本框输入英文句子&#xff0c;双击其中的英文单词&#xff0c;给出英文读音和中文含义和音标。 本程序查询本地词典数据。通过菜单栏"文件"->"打开词典编辑器"进入编辑界面。 词典数据存储…...

【Vite + Vue + Ts 项目三个 tsconfig 文件】

Vite Vue Ts 项目三个 tsconfig 文件 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件&#xff1f;首先我们先了解什么是 tsconfig.json ? 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件&#xff1f; 在使用 Vite 创建 vue-ts 模板的项目时&#xff0c;会发现除了 ts…...

AI时代IT行业职业方向规划大纲

一、引言 AI时代的颠覆性影响 ChatGPT、Midjourney等生成式AI对传统工作模式的冲击 案例&#xff1a;AI编程助手&#xff08;GitHub Copilot&#xff09;改变开发者工作流程 核心问题&#xff1a;IT从业者如何避免被AI替代&#xff0c;并找到新机遇&#xff1f; 二、AI时代…...