Kafka3.4 SASL/kerberos/ACL 证以及 SSL 加密连接
Kafka3.4 SASL/kerberos ACL 证以及 SSL 加密连接
序
前面我们使用 kafka3.3.1 on zookeeper
的模式进行多网段监听的 kafka
集群,顺便搭建起 kafkaui
后发现一些问题,我们 kafka
集群没有连接认证,万一谁知道了我们的 kafka
连接地址,岂不是随随便便就能消费数据、清空数据、胡乱修改数据了吗?
所以本章节进行认证连接的搭建,参考官网:
https://kafka.apache.org/documentation/#security
认证类型
如果对 Kafka
连接协议有疑问的,请优先查看 Kafka SASL ACL SSL 分别代表什么意思。
测试环境
版本信息
Kafka 3.4
CDH 6.3.2
Zookeeper 3.4.5
Krb5kdc 已经启动
服务器规划信息
环境检查项
- 关闭
selinux
- 关闭防火墙
- 如有条件请配置好
ansible
,在本文中bigdata_cluster
代指udmax0[1-4].udmax.com
Krb5Kdc 安装配置
如果已经安装 krb5kdc
可忽略这部分内容。
在主节点 udmax01.udmax.com
安装 krb5 server
,使用如下命令:
yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation openldap-clients -y
如果速度过慢可以更改
yum
源。
其他节点只需要安装执行环境:
ansible bigdata_cluster -m shell -a 'yum install krb5-workstation krb5-libs -y '
更改 /var/kerberos/krb5kdc/kdc.conf
文件,如果不存在则创建:
[kdcdefaults]kdc_ports = 88kdc_tcp_ports = 88[realms]UDMAX.COM = {#master_key_type = aes256-ctsacl_file = /var/kerberos/krb5kdc/kadm5.acldict_file = /usr/share/dict/wordsadmin_keytab = /var/kerberos/krb5kdc/kadm5.keytabsupported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normalmax_life = 3dmax_renewable_life = 7d}
这里 reaml
叫做 UDMAX.COM
,后续大量地方会使用到。
更改 /etc/krb5.conf
文件:
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crtdefault_realm = UDMAX.COMdefault_cache_name = KEYRING:persistent:%{uid}[realms]UDMAX.COM = {kdc = udmax01.udmax.comadmin_server = udmax01.udmax.com}[domain_realm].udmax.com = UDMAX.COM
udmax.com = UDMAX.COM
需要注意的有:
default_realm
指向realms
中的一项realm
中的kdc
和admin_server
都指向我们的主节点。
配置完毕后分发文件:
ansible bigdata_cluster -m copy -a "src=/etc/krb5.conf dest=/etc/krb5.conf"
如果没有
ansible
,请使用scp
命令。
初始化 kdc database
:
kdb5_util create –r UDMAX.COM -s
Enter KDC database master key:
这里需要输入密码,在这篇文章中称之为
{{kdc_master_key}}
。
开启 krb5kdc
服务:
systemctl start krb5kdc
systemctl status krb5kdc
Kafka 3.4 安装
# 先安装scala
curl -fL https://github.com/coursier/coursier/releases/latest/download/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod +x cs && ./cs setup# 或者离线安装包
wget https://downloads.lightbend.com/scala/2.12.17/scala-2.12.17.tgz
ansible bigdata_cluster -m shell -a "mkdir -p /usr/scala/"
ansible bigdata_cluster -m copy -a "src=scala-2.12.17.tgz dest=/usr/scala/scala-2.12.17.tgz"
ansible bigdata_cluster -m shell -a "cd /usr/scala/; tar -zxvf scala-2.12.17.tgz"# 环境变量
vim /etc/profile.d/scala.sh
export SCALA_HOME=/usr/scala/scala-2.12.17
export SCALA_PATH=${SCALA_HOME}/bin
export PATH=${PATH}:${SCALA_PATH}ansible bigdata_cluster -m copy -a "src=/etc/profile.d/scala.sh dest=/etc/profile.d/scala.sh"
解压离线安装包,规划安装路径:
mkdir /component/kafka/
cd /component/kafka
wget https://downloads.apache.org/kafka/3.4.0/kafka_2.12-3.4.0.tgz
tar -zxvf kafka_2.12-3.4.0.tgz
注册 Kafka 的 kerberos 用户
# 创建kafka用户
addprinc -randkey kafka/udmax01@UDMAX.COM
addprinc -randkey kafka/udmax02@UDMAX.COM
addprinc -randkey kafka/udmax03@UDMAX.COM
addprinc -randkey kafka/udmax04@UDMAX.COM# 导出票据,可以导到一个文件中,或者分开也行
xst -norandkey -k /etc/security/keytab/kafkaX.keytab kafka/udmax01@UDMAX.COM
xst -norandkey -k /etc/security/keytab/kafkaX.keytab kafka/udmax02@UDMAX.COM
xst -norandkey -k /etc/security/keytab/kafkaX.keytab kafka/udmax03@UDMAX.COM
xst -norandkey -k /etc/security/keytab/kafkaX.keytab kafka/udmax04@UDMAX.COM
此时生成的 kafkaX.keytab
文件需要分发到各个服务器上:
ansible bigdata_cluster -m copy -a "src=/etc/security/keytab/kafkaX.keytab dest=/etc/security/keytab/"
在 9092 端口开启 SASL_PLAINTEXT
认证
首先,我们可以先配置一个 SASL_PLAINTEXT
认证,这里采用 SASL/GSSAPI
进行,主体就是刚刚生成的 kafka
。
配置文件更改
conf/server.properties
备份相关文件
# 备份
cd /component/kafka/kafka_2.12-3.4.0/config
cp server.properties server.properties.backup
修改 server.properties
中的内容:
broker.id=001102
reserved.broker.max.id=255255
listeners=SASL_PLAINTEXT://udmax02.udmax.com:9092
advertised.listeners=SASL_PLAINTEXT://udmax02.udmax.com:9092
inter.broker.listener.name=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.kerberos.service.name=kafkaauto.create.topics.enable=false
delete.topic.enable=true
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/component/kafka/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=udmax02.udmax.com:2181,udmax03.udmax.com:2181,udmax04.udmax.com:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
注意 listeners
中为 Kafka broker
监听的地址,这里监听了端口 9092
,协议使用的为 SASL_PLAINTEXT
。而 sasl.mechanism.inter.broker.protocol
指定的 SASL
使用 GSSAPI
。那么对应的 SASL
相关配置为:
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.kerberos.service.name=kafka
这里表明使用
SASL/GSSAPI(Kerberos)
进行身份验证,并且采用的principal
名为kafka
conf/kerberos/krb5_kafka.conf
该文件以及目录不存在,需要创建:
# 将krb5.conf 抽离一个出来,主要是某些krb5.conf可能有问题(特别是CDH接管后)。
cp /etc/krb5.conf conf/kerberos/krb5_kafka.conf# 主要的内容如下:
[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[kdc]profile = /var/kerberos/krb5kdc/kdc.conf[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crtdefault_realm = UDMAX.COMdefault_ccache_name = KEYRING:persistent:%{uid}storeKey=false[realms]
UDMAX.COM = {kdc = udmax01.udmax.comadmin_server = udmax01.udmax.com}[domain_realm].udmax.com = UDMAX.COM
udmax.com = UDMAX.COM
conf/kerberos/client.properties
用于在服务器环境内进行连接,因为当前需要连接 kafka
集群,所以都需要认证。
我们开启了端口 9092
,为 SASL_PLAINTEXT
,所以连接时也需要配置对应的连接认证,GSSAPI
对应的就是 com.sun.security.auth.module.Krb5LoginModule
认证:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \useKeyTab=true \keyTab="/etc/security/keytab/kafkaX.keytab" \principal="kafka/udmax02.udmax.com@UDMAX.COM" \renewTGT=true \storeKey=false \useTicketCache=true;
这里使用的 principal
为最高权限的 kafka
用户,一般来说应当设置为租户。比如这样的配置:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \useKeyTab=true \keyTab="/etc/security/keytab/udmax.keytab" \principal="udmax@UDMAX.COM" \renewTGT=true \storeKey=false \useTicketCache=true;
注意 sasl.kerberos.service.name
应当是连接 kafka broker
的名称,也是 server.properties
中的 sasl.kerberos.service.name
。
conf/kerberos/kafka_server_jaas.conf
当 kafka broker
启动的时候,会根据该文件获取自身的 SASL
信息,可以理解为当 Kafka
集群启动时,他们也需要互相认证对方是否合法。常规内容如下:
KafkaServer {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/etc/security/keytab/kafkaX.keytab"principal="kafka/udmax02.udmax.com@UDMAX.COM";
};KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falseprincipal="kafka/udmax02.udmax.com@UDMAX.COM"keyTab="/etc/security/keytab/kafkaX.keytab";
};Client {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falseprincipal="kafka/udmax02.udmax.com@UDMAX.COM"keyTab="/etc/security/keytab/kafkaX.keytab";
};
请注意每个 kafka broker
的 principal
应当与自己的服务器名 hostname
一致。
Client {}
中的内容为 kafka broker
连接 zookeeper
时需要的认证信息,如果 zookeeper
未开启认证,则不需要相关配置。值得注意的是作者在测试时发现CDH 6.3.2中的Zookeeper显示开启认证,实际情况并没有。
执行文件配置
到此我们相关的配置已经配置完毕,但是常用的启停程序还需要统一更改。
涉及到的启动程序包括:
- bin/kafka-server-start.sh
- bin/kafka-console-consumer.sh
- bin/kafka-console-producer.sh
- bin/kafka-topics.sh
- bin/kafka-acls.sh
其实就是我们会在环境中使用到的 shell
都需要进行更改,更改的方式也很简单在上述文件的倒数第二行加上我们设定的环境变量:
export KAFKA_OPTS="-Dzookeeper.sasl.client=ture -Dzookeeper.sasl.client.username=kafka -Djava.security.krb5.conf=/component/kafka/kafka_2.12-3.4.0/config/kerberos/krb5_kafka.conf -Djava.security.auth.login.config=/component/kafka/kafka_2.12-3.4.0/config/kerberos/kafka_server_jaas.conf"
如果 zookeeper 未开启 sasl 请将
-Dzookeeper.sasl.client
设置为false
。
此时如果 SASL_PLAINTEXT
已经足够,则不需要继续开启 SSL
认证,跳到 启动 Kafka
即可。
在 9094 端口开启 SASL_SSL
认证
在刚刚的配置中,已经使用 SASL/GSSAPI
完成了身份验证,现在添加 SSL
传输加密。
在 SSL
中,我们还需要生成证书以及两个 jks
文件。
生成证书并配置
创建文件夹进行操作
ansible bigdata_cluster -m shell -a " mkdir -p /opt/ca "
cd /opt/ca
每个 broker 生成 server.keystore.jks
先在每台服务器生成 server.keystore.jks
文件,使用命令:
keytool -keystore server.keystore.jks \
-alias udmax01 \
-validity 36500 \
-genkey \
-keypass {{ssl.key.password}} \
-keyalg RSA \
-dname "CN=udmax01.udmax.com,OU=yd,O=yd,L=beijing,S=beijing,C=cn" \
-ext SAN=IP:{{内.网.i.p}},IP:{{外.网.i.p}},DNS:udmax01.udmax.com,DNS:udmax01 \
-storepass {{ssl.keystore.password}}
注意:
-dname
中的CN
要与每台服务器名hostname
一致-ext
中对应ip
以及DNS
最好写全,{{内.网.i.p}}
与{{外.网.i.p}}
是代指如192.168.1.100
。-keypass
与-storepass
在后续需要用到,本文使用{{ssl.key.password}}
和{{ssl.keystore.password}}
进行代指。
在主节点生成 CA 证书
通过 openssl
生成证书,如果没有可以进行安装:
yum install openssl -y
使用如下命令创建 CA 证书:
openssl req -new -x509 -keyout ca-key -out ca-cert -days 36500 \
-passin pass:{{openssl_password}} -passout pass:{{openssl_password}} \
-subj "/C=CN/ST=Beijing/L=Beijing/O=yd/CN=ud"
注意:
- pass 中的密码也被
{{openssl_password}}
代替。
生成后进行分发文件:
ansible bigdata_cluster -m copy -a " src=ca-cert dest=/opt/ca/ "
ansible bigdata_cluster -m copy -a " src=ca-key dest=/opt/ca/ "
ansible bigdata_cluster -m shell -a " ls -ltr /opt/ca "
此时的 /opt/ca
目录中有如下文件:
途中 old 文件可以忽略
每个 broker 通过 CA 证书创建客户端信任证书
# 创建 client.truststore.jks
keytool -keystore client.truststore.jks -alias UdmaxCA -import -file ca-cert -storepass {{ssl.keystore.password}} -keypass {{ssl.key.password}}# 创建 server.keystore.jks
keytool -keystore server.keystore.jks -alias udmax01 -certreq -file cert-file -storepass {{ssl.keystore.password}} -keypass {{ssl.key.password}}# 创建 cert-signed 后续进行盖章
openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 36500 -CAcreateserial -passin pass:{{openssl_password}}# 将 ca-cert 导入server.keystore.jks
keytool -keystore server.keystore.jks -alias UdmaxCA -import -file ca-cert -storepass {{ssl.keystore.password}} -keypass {{ssl.key.password}}# 将 cert-signed 导入server.keystore.jks
keytool -keystore server.keystore.jks -alias udmax01 -import -file cert-signed -storepass {{ssl.keystore.password}} -keypass {{ssl.key.password}}
此时就已经完成了 SSL
文件的准备:
实操截图如下(为了区分证书,每台的 alias
进行改动,其实根本也没必要):
Kafka SSL 配置
conf/server.properties
相关的 SSL
配置为:
ssl.keystore.location=/opt/ca/server.keystore.jks
ssl.truststore.location=/opt/ca/server.truststore.jks
ssl.keystore.password={{ssl.keystore.password}}
ssl.key.password={{ssl.key.password}}
ssl.client.auth=required
其他文件
由于 SSL
其实涉及到加解密的过程,一般只是对外使用,在内网环境可以不开启,所以内网中的各类 shell
连接 9092
端口,无需再进行 SSL
配置,如果需要请参考后续 Java SASL_SSL 程序连接 Demo
。
开启 ACL
如果需要开启 ACL
请优先开启 SASL
,ACL
配置为:
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
super.users=User:kafka
开启了 ACL 认证,采用
kafka
自带的授权验证,其中超级用户名叫做kafka
。
启动 Kafka
使用如下命令进行启动:
bin/kafka-server-start.sh -daemon /component/kafka/kafka_2.12-3.4.0/config/server.properties
使用如下命令查看 topics
信息:
/component/kafka/kafka_2.12-3.4.0/bin/kafka-topics.sh --describe --bootstrap-server udmax02.udmax.com:9092 --command-config /component/kafka/kafka_2.12-3.4.0/config/kerberos/client.properties
可能刚刚创建,并未有 topic 信息,但查看是否有报错。
使用如下命令查看 kafka broker
日志:
tailf /component/kafka/kafka_2.12-3.4.0/logs/server.log
Java SASL_SSL 程序连接 Demo
package com.huangyichun;import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.config.SslConfigs;import java.util.Properties;public class KafkaConnectionProducerSaslSsl {private static final String TOPIC_NAME = "test-topic";public static void main(String[] args) {System.setProperty("java.security.krb5.conf", "src/main/resources/krb5_kafka.conf");System.setProperty("java.security.auth.login.config", "src/main/resources/kafka_client_kafka.conf");System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");Properties props = new Properties();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "udmax02.udmax.com:9094,udmax03.udmax.com:9094,udmax04.udmax.com:9094");props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "gzip");props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, "src/main/resources/ca/client.truststore.jks");props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, "{{ssl.truststore.password}}");props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "JKS");props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");props.put("sasl.kerberos.service.name", "kafka");KafkaProducer<String, String> producer = new KafkaProducer<>(props);try {for (int i = 0; i < 1000; i++) {Thread.sleep(5000L);ProducerRecord<String, String> record = new ProducerRecord<>(TOPIC_NAME, "key" + (i / 10), "message: " + i);producer.send(record);}} catch (InterruptedException e) {e.printStackTrace();}}
}
其中 kafka_client_udmax.conf
中的内容为:
KafkaClient {com.sun.security.auth.module.Krb5LoginModule requiredrdns = falseuseKeyTab=truestoreKey=trueuseTicketCache=falseprincipal="udmax@UDMAX.COM"keyTab="src/main/resources/keytab/udmax.keytab";
};
报错锦集
Could not login: the client is being asked for a password, but the Kafka client code does not currently support obtaining a password from the user. not available to garner authentication information from the user
keytab
文件与 principal
密码不匹配。
Not authorized to access topics [XXX]
没有权限访问 XXX
topic,被 ACL 挡住,使用 kafka-acl.sh
进行赋权。
General SSLEnginge problem, No name matching xxxx.xxx.xx found
SSL 无法找到匹配的 server
证书,大概率是在生成 server.keystore.jks
时将 CN
填写错误,请填写每台 hostname
的值。
总结
如果对您有帮助,请点赞!
相关文章:

Kafka3.4 SASL/kerberos/ACL 证以及 SSL 加密连接
Kafka3.4 SASL/kerberos ACL 证以及 SSL 加密连接 序 前面我们使用 kafka3.3.1 on zookeeper 的模式进行多网段监听的 kafka 集群,顺便搭建起 kafkaui 后发现一些问题,我们 kafka 集群没有连接认证,万一谁知道了我们的 kafka 连接地址&…...

UE中低延时播放RTSP监控视频解决方案
第1章 方案简介 1.1 行业痛点 在各种智慧城市、智慧社区、智慧水利、智慧矿山等数字孪生项目中,经常使用通UE来开发三维可视化场景。在这些场景中通常都需要把现场的各种监控视频在UE的可视化场景中接入,主要包含海康威视、大华、宇视、华为等众多监控…...

iOS - 开发者账号续订会员资格更换订阅的账号
文章目录 前言开发环境续订会员资格转让账户持有人验证身份1. 实名认证2. 联系信息 更换订阅的账号最后 前言 公司有一个开发者账号快到期了需要续订会员资格,刚注册时是用我自己的个人账号完成的订阅购买。现在想来有点不妥,于是尝试更换用于订阅的账号…...

大数据课程F3——HIve的基本操作
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握HIve的基本SQL语句和注意问题; ⚪ 掌握HIve的表结构; ⚪ 掌握HIve的数据类型; ⚪ 掌握HIve的基础函数和窗口函数; 一、基本SQL 1. SQL的执行方式 1. 通过hive -e的方式来执行指…...

top解析
top - 13:52:26 up 26 days, 20:56, 2 users, load average: 0.00, 0.01, 0.05 当前时间 系统运行时间,格式为时:分 当前登陆用户数2 系统负载,即任务队列的平均长度。三个数值分别为1分钟,5分钟,15分钟前到现在的平均…...

如何让子组件,router-view,呈现左右分布格局
1.用浮动进行浮动布局,定义一个大盒子,把浮动的样式写在公共样式里(这里在main.js里定义一下全局布局)。 2、能够在右边显示了...

计算机网络—TCP和UDP、输入url之后显示主页过程、TCP三次握手和四次挥手
TCP基本认识 TCP是面向连接的、可靠的,基于字节流的传输层通信协议。 图片来源小林coding 序号:传输方向上字节流的字节编号。初始时序号会被设置一个随机的初始值(ISN),之后每次发送数据时,序号值 ISN…...

使用反汇编工具IDA查看发生异常的汇编代码的上下文去辅助分析C++软件异常
目录 1、概述 2、如何使用IDA打开并查看二进制文件的汇编代码 3、在IDA中找到发生崩溃的那条汇编指令的位置 3.1、如何在IDA中找到发生异常的那条汇编指令 3.2、示例 4、阅读汇编代码上下文需要掌握一定的基础汇编知识 5、最后 VC常用功能开发汇总(专栏文章列…...

怎么合并多个视频?简单视频合并方法分享
合并多个视频可以将它们组合成一个更长的视频,这对于需要播放多个短视频的情况非常有用。此外,合并视频还可以使视频编辑过程更加高效,因为不必将多个独立的视频文件分别处理。最后,合并视频可以减少文件数量,从而使整…...

webpack基础知识九:如何提高webpack的构建速度?
一、背景 随着我们的项目涉及到页面越来越多,功能和业务代码也会随着越多,相应的 webpack 的构建时间也会越来越久 构建时间与我们日常开发效率密切相关,当我们本地开发启动 devServer 或者 build 的时候,如果时间过长ÿ…...

批量改名字序号和前缀
echo off setlocal enabledelayedexpansion set count10 for /f %%i in (dir /b *.jpg,*.png,*.bmp,*.jpeg,*.gif) do ( set /a count1 echo %%i 前缀_!count! rename %%i 前缀_!count!.png ) REM …...

基于Spring Boot的医院预约挂号网站设计与实现(Java+spring boot+MySQL)
获取源码或者论文请私信博主 演示视频: 基于Spring Boot的医院预约挂号网站设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java spring…...

Linux命令200例:join将两个文件按照指定的键连接起来分析
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...

谈谈网络安全
目录 1.概念 2.发展现状 3.主要问题 1.概念 网络安全是指保护计算机网络和其中的数据免受未经授权访问、损坏、窃取或破坏的过程和技术。网络安全涉及预防和检测潜在的威胁和漏洞,并采取措施保护网络的机密性、完整性和可用性。 网络安全的概念包括以下几个方面&am…...

机器学习深度学习——文本预处理
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——序列模型(NLP启动!) 📚订阅专栏:机器学习&am…...

Qt实现可伸缩的侧边工具栏(鼠标悬浮控制伸缩栏)
Qt实现可伸缩的侧边工具栏 一直在网上找,发现大多的实现方案都是用一个按钮,按下控制侧边栏的伸缩,但是我想要实现鼠标悬浮在侧边栏的时候就伸出,移开就收缩的功能,也没找到好的参考,所以决定自己实现一个…...

【Spring Boot】拦截器与统一功能处理
博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE进阶 上一篇文章我们讲解了Spring AOP是一个基于面向切面编程的框架,用于将某方面具体问题集中处理,通过代理对象来进行传递,但使用原生Spring AOP实现统一的…...

RabbitMQ的6种工作模式
RabbitMQ的6种工作模式 官方文档: http://www.rabbitmq.com/ https://www.rabbitmq.com/getstarted.html RabbitMQ 常见的 6 种工作模式: 1、simple简单模式 1)、消息产生后将消息放入队列。 2)、消息的消费者监听消息队列,如果队列中…...

MFC第二十六天 CRgn类简介与开发、封装CMemoryDC类并应用开发
文章目录 CRgn类简介与开发CRgn类简介CRgn类区域管理开发CRgn类区域管理与不规则形状的选取 封装CMemoryDC类并应用开发CMemoryDC.h封装CMemoryDC开发游戏透明动画CFlashDlg.hCFlashDlg.cpp 封装CMemoryDC开发游戏动画 附录四大窗口CDC派生类 CRgn类简介与开发 CRgn类简介 CR…...

解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题
解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题 1、本方案默认本地已经安装了VScode与MobaXterm2、在服务器端3、在本地端安装MobaXterm4、测试5、opencv显示测试(测试过程中需保持MobaXterm开启的状态)6、 matplotlib显示测试&#x…...

支付模块功能实现(小兔鲜儿)【Vue3】
支付 渲染基础数据 支付页有俩个关键数据,一个是要支付的钱数,一个是倒计时数据(超时不支付商品释放) 准备接口 import request from /utils/httpexport const getOrderAPI (id) > {return request({url: /member/order/$…...

php meilisearch demo
# 创建一个meilisearch 使用完自动销毁 docker run -itd --rm -p 7700:7700 getmeili/meilisearch:v1.3docker-compose 参数 version: "3" networks:flyserver:driver: bridge services:search:image: getmeili/meilisearch:v1.3restart: alwaysenvironment:- MEILI…...

芒格之道——查理·芒格股东会讲话1987-2022
你越是认真生活,你的生活就会越美好! 这里将读书过程划线的内容摘抄在这里,方便自己回顾。 书分为两部分,我先读了后半部分,而且是从后往前读,到了前半部分,我是从前往后读。书还挺贵ÿ…...

如何运营手游联运平台游戏?
运营手游联运平台游戏需要综合考虑多个方面,包括游戏选择、合作伙伴、市场推广、用户运营等。以下是运营手游联运平台游戏的一些建议: 游戏选择:选择优质的手游,确保游戏的品质和内容能够吸引玩家,满足市场需求。 合…...

vscode连接远程Linux服务器
文章目录 一、环境安装1.1 下载vscode1.2 下载vscode-sever 二、ssh链接2.1 安装Remote-SSH2.2 设置vscode ssh2.3 设置免密登录2.3.1 本地生成公私钥2.3.2 服务器端添加公钥 三、安装插件3.1 vscode安装插件3.1.1 在线安装插件3.1.2.1 下载插件3.1.2.2 安装插件 3.2 vscode-se…...

numpy 转换成 cupy 利用GPU执行 错误
ModuleNotFoundError: No module named cupy._core. routines_sorting 提示缺少包 使用 pyinstaller -D views.py --nocons 可以正常打包出来 但是运行出现报错 说明这个打包工具 忽略了很多 隐式导入的包 解决方法很简单 hiddenimports [fastrlock, fastrlock.rlock, cu…...

力扣:55. 跳跃游戏(Python3)
题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 来源:力扣(LeetCode) 链接:力扣 示例…...

Unity 编辑器资源导入处理函数 OnPreprocessAudio :深入解析与实用案例
Unity 编辑器资源导入处理函数 OnPreprocessAudio 用法 点击封面跳转下载页面 简介 在 Unity 中,资源导入是一个非常重要的环节,它决定了资源在项目中的使用方式和效果。Unity 提供了一系列的资源导入处理函数,其中之一就是 OnPreprocessAud…...

mongodb-win32-x86_64-2008plus-3.4.24-signed.msi
Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>cd C:\MongoDB\Server\3.4\binC:\MongoDB\Server\3.4\bin>C:\MongoDB\Server\3.4\bin>mongod --help Options:General options:-h [ --help ] …...

java的反射
在java语言中,反射机制是指对于处在运行状态的类,都能够获取到这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法以及访问它的属性;这种通过动态获取类或对象的属性以及方法从而完成调用功能被称为java语言的…...