kafka--多易杰哥讲解

news2024/11/24 13:53:19

        Kafka是一种分布式的流式数据平台,广泛应用于实时流数据处理和消息系统。它可以让处理数据的应用程序能够处理高流量的数据流,同时提供可靠性和可扩展性。 

【多易教育】-Kafka文档

1.基本概念

1.1什么是kafka  

Kafka 最初是由 LinkedIn 即领英公司基于 Scala 和 Java 语言开发的分布式消息发布-订阅系统,现已捐献给Apache 软件基金会。其具有高吞吐、低延迟的特性,许多大数据实时流式处理系统比如 Storm、Spark、Flink等都能很好地与之集成。

总的来讲,Kafka 通常具有 3 重角色:

  • 存储系统:通常消息队列会把消息持久化到磁盘,防止消息丢失,保证消息可靠性。Kafka 的消息持久化机制和多副本机制使其能够作为通用数据存储系统来使用。
  • 消息系统:Kafka 和传统的消息队列比如 RabbitMQ、RocketMQ、ActiveMQ 类似,支持流量削峰、服务解耦、异步通信等核心功能。 ==》 先进先出 ==》 只针对分区,不是全局的
  • 流处理平台:Kafka 不仅能够与大多数流式计算框架完美整合,并且自身也提供了一个完整的流式处理库,即 Kafka Streaming。Kafka Streaming 提供了类似 Flink 中的窗口、聚合、变换、连接等功能。

一句话概括:Kafka 是一个分布式的基于发布/订阅模式的消息中间件,在业界主要应用于大数据实时流式计算领域,起解耦合和削峰填谷的作用。

1.2kafka的特点

  • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, 由多个consumer group 对partition进行consume操作。
  • 可扩展性:kafka集群支持热扩展
  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  • 容错性:允许集群中有节点失败(若副本数量为n,则允许n-1个节点失败)
  • 高并发:支持数千个客户端同时读写

Kafka在各种应用场景中,起到的作用可以归纳为这么几个术语:削峰填谷,解耦!

在大数据流式计算领域中,kafka主要作为计算系统的前置缓存和输出结果缓存;

2.安装部署

2.1安装zookeeper集群

  1. 上传安装包
  1. 移动到指定文件夹

Plain Text
 mv zookeeper-3.4.6.tar.gz  /opt/apps/

  1. 解压

Plain Text
tar -zxvf zookeeper-3.4.6.tar.gz

  1. 修改配置文件

Plain Text
(1)进入到conf目录下
cd /opt/apps/zookeeper-3.4.6/conf
(2)修改配置文件名称
mv  zoo_sample.cfg   zoo.cfg
(3)编辑配置文件
vi zoo.cfg
dataDir=/opt/apps/data/zkdata
server
.1=linux01:2888:3888
server
.2=linux01:2888:3888
server
.3=linux01:2888:3888

  1. 创建数据目录

Plain Text
mkdir -p /opt/apps/data/zkdata

  1. 在各个节点的数据存储目录中,生成一个myid文件,内容为它的id

Plain Text
echo 1 > /opt/apps/data/zkdata/myid
echo 2 > /opt/apps/data/zkdata/myid
echo 3 > /opt/apps/data/zkdata/myid

  1. 分发安装包

Plain Text
# 使用for循环分发
for i in {2..3};
do scp -r zookeeper-3.4.6 linux0$i:$PWD
done

  1. 配置环境变量

Plain Text
vi /etc/profile
#ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/apps/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin

source /etc/profile
# 注意:还需要分发环境变量

  1. 启停集群

Plain Text
bin/zkServer.sh start   # zk服务启动
bin/zkServer.sh status  # zk查看服务状态
bin/zkServer.sh stop    # zk停止服务

  1. 一键启停脚本

(1)启动脚本

Plain Text
#!/bin/bash
for i in 1 2 3
do
ssh linux0${i} "source /etc/profile;/opt/apps/zookeeper-3.4.6/bin/zkServer.sh start"
done

(2)停止脚本

Plain Text
#!/bin/bash
for i in 1 2 3
do
ssh linux0${i} "source /etc/profile;/opt/apps/zookeeper-3.4.6/bin/zkServer.sh stop"
done

2.2安装kafka集群

  1. 上传安装包
  1. 解压

Plain Text
tar -zxvf kafka_2.11-2.2.2.tgz tar  -C /opt/apps/

  1. 修改配置文件

Plain Text
(1)进入配置文件目录
[root@linux01 apps]# cd kafka_2.12-2.3.1/config
(2)编辑配置文件

vi server.properties
#
为依次增长的:0、1、2、3、4,集群中唯一 id
broker.id=0   
#数据存储的⽬录
log.dirs=/opt/data/kafkadata
#底层存储的数据(日志)留存时长(默认7天)
log.retention.hours=168
#底层存储的数据(日志)留存量(默认1G)
log.retention.bytes=1073741824
#
指定zk集群地址
zookeeper.connect=linux01:2181,linux02:2181,linux03:2181

  1. 分发安装包

Plain Text
for  i  in {2..3}
do
scp  -r  kafka_2.11-2.2.2  linux0$i:$PWD
done

安装包分发后,记得修改config/server.properties中的 配置参数: broker.id

  1. 环境变量

Plain Text
vi /etc/profile
export KAFKA_HOME=/opt/apps/kafka_2.11-2.2.2
export PATH=$PATH:$KAFKA_HOME/bin

source /etc/profile
# 注意:还需要分发环境变量

  1. 启停集群(在各个节点上启动)

Plain Text
bin/kafka-server-start.sh -daemon /opt/apps/kafka_2.11-2.2.2/config/server.properties  

# 停止集群
bin/kafka-server-stop.sh

  1. 一键启停脚本:

Plain Text
#!/bin/bash

case $1 in
"start"){
        for i in linux01 linux02 linux03
        do
        echo ---------- kafka $i
启动 ------------
                ssh $i "source /etc/profile;  /opt/app/kafka2.4.1/bin/kafka-server-start.sh -daemon /opt/app/kafka2.4.1/config/server.properties"
        done
};;
"stop"){
        for i in linux01 linux02 linux03
        do
        echo ---------- kafka $i 停止 ------------
                ssh $i "source /etc/profile;  /opt/app/kafka2.4.1/bin/kafka-server-stop.sh "
        done
};;
esac

2.3Kafka运维监控:Kafka-Eagle(了解)

kafka自身并没有集成监控管理系统,因此对kafka的监控管理比较不便,好在有大量的第三方监控管理系统来使用,常见的有:

  • Kafka Eagle
  • KafkaOffsetMonitor
  • Kafka Manager(雅虎开源的Kafka集群管理器)
  • Kafka Web Console
  • 还有JMX接口自开发监控管理系统

2.3.1Kafka-Eagle安装

安装包下载地址: http://download.kafka-eagle.org/

官方文档地址:Preface - Kafka Eagle

  1. 上传,解压
  1. 配置环境变量:JAVA_HOME KE_HOME

Plain Text
vi /etc/profile

--
之前配过了就不用再配了
export JAVA_HOME=/opt/apps/jdk1.8.3_9u19
export PATH=$PATH:$JAVA_HOME/bin

export KE_HOME=/opt/apps/efak-web-2.1.0
export PATH=$PATH:$KE_HOME/bin

  1. 配置KafkaEagle

Plain Text
cd ${KE_HOME}/conf
vi system-config.properties

修改如下内容:
######################################
# multi zookeeper & kafka cluster list
# Settings prefixed with 'kafka.eagle.' will be deprecated, use 'efak.' instead
######################################
efak.zk.cluster.alias=cluster1
cluster1.zk.list=linux01:2181,linux02:2181,linux03:2181

######################################
# broker size online list
######################################
cluster1.efak.broker.size=3

######################################
# kafka sqlite jdbc driver address
######################################
efak.driver=org.sqlite.JDBC
efak.url=jdbc:sqlite:/opt/data/kafka-eagle/db/ke.db
efak.username=root
efak.password=www.kafka-eagle.org

######################################
# kafka mysql jdbc driver address
######################################
#efak.driver=com.mysql.cj.jdbc.Driver
#efak.url=jdbc:mysql://linux01:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
#efak.username=root
#efak.password=123456

如上,数据库选择的是sqlite,需要手动创建所配置的db文件存放目录:/opt/data/kafka-eagle/db/

如果使用MySQL 提前在mysql中创建指定的数据库

mysql> CREATE DATABASE IF NOT EXISTS ke DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

  1. 配置kafka服务端的JMX端口【选配】

Plaintext
在kafka的启动脚本:  kafka-server-start.sh 中添加如下命令:
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export JMX_PORT="9999"
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi
   
  
这个加在文件的最后面
 
改完后,将文件同步给所有节点
然后重启kafka集群

  1. 配置KE_HOME 环境变量
  1. 启动KafkaEagle

Plain Text
cd ${KE_HOME}/bin
chmod +x ke.sh
./ke.sh
start

  1. 访问web界面

http://192.168.232.3:8048

账号密码:Account:admin ,Password:123456

3.基本操作

3.1概述

Kafka 中提供了许多命令行工具(位于$KAFKA HOME/bin 目录下)用于管理集群的变更。

kafka-console-consumer.sh

用于消费消息

kafka-console-producer.sh

用于生产消息

z`kafka-topics.sh

用于管理主题

kafka-server-stop.sh

用于关闭Kafka服务

kafka-server-start.sh

用于启动Kafka服务

kafka-configs.sh

用于配置管理

kafka-consumer-perf-test.sh

用于测试消费性能

kafka-producer-perf-test.sh

用于测试生产性能

kafka-dump-log.sh

用于查看数据日志内容

kafka-preferred-replica-election.sh

用于优先副本的选举

kafka-reassign-partitions.sh

用于分区重分.000000000000 配

3.2topic管理操作:kafka-topics

3.2.1查看topic列表

Shell
kafka-topics.sh --bootstrap-server linux01:9092,linux02:9092,linux03:9092 --list

Shell
[root@linux01 bin]# ./kafka-topics.sh --list --zookeeper linux01:2181
__consumer_offsets
gmall2022_db_c
gmall_event_bak
gmall_start_bak
test001
topic_log

3.2.2查看topic状态信息

Shell
[root@linux01 bin]# ./kafka-topics.sh --describe --zookeeper linux01:2181  --topic test
Topic: test     PartitionCount: 3       ReplicationFactor: 3    Configs:
        Topic: test     Partition: 0    Leader: 2       Replicas: 2,0,1 Isr: 2,0,1
        Topic: test     Partition: 1    Leader: 0       Replicas: 0,1,2 Isr: 0,1,2
        Topic: test     Partition: 2    Leader: 1       Replicas: 1,2,0 Isr: 1,2,0

从上面的结果中可以看出

topic的分区数量,以及每个分区的副本数量,以及每个副本所在的broker节点,以及每个分区的leader副本所在broker节点,以及每个分区的ISR副本列表;

ISR in  sync  replica ,同步副同步本(当然也包含leader自身,replica.lag.time.max.ms =30000

OSRout  of  sync replicas 失去同步的副本(该副本上次请求leader同步数据距现在的时间间隔超出配置阈值)

  • ISR同步副本列表

ISR概念:(同步副本)。每个分区的leader会维护一个ISR列表,ISR列表里面就是follower副本的Borker编号,只有跟得上Leader的 follower副本才能加入到 ISR里面,这个是通过replica.lag.time.max.ms =30000(默认值)参数配置的,只有ISR里的成员才有被选为 leader 的可能。

踢出ISR和重新加入ISR的条件:

  • 踢出ISR的条件:  由replica.lag.time.max.ms =30000决定,如上图;
  • 重新加入ISR的条件: OSR副本的LEO(log end offset)追上leader的LEO;

3.2.3创建topic

--bootstrap-server  --zookeeper一样的效果 ,新版本建议使用 --bootstrap-server

Shell
kafka-topics.sh   --bootstrap-server  linux01:9092,linux02:9092,linux03:9092    --create --topic test01  --partitions 3  --replication-factor  3

参数解释:

--replication-factor  副本数量
--partitions 分区数量
--topic topic名称

本方式,副本的存储位置是系统自动决定的;

手动指定分配方案:分区数,副本数,存储位置

TypeScript
kafka-topics.sh --create --topic tpc-1  --zookeeper linux01:2181 --replica-assignment 0:1:3,1:2:6

该topic,将有如下partition:(2个分区 3个副本)
partition0 ,所在节点: broker0、broker1、broker3
partition1 ,所在节点: broker1、broker2、broker6


[root@linux01 logs]# kafka-topics.sh --describe --topic tpc-1 --zookeeper linux01:2181
Topic: tpc-1    PartitionCount: 2       ReplicationFactor: 3    Configs:
        Topic: tpc-1    Partition: 0    Leader: 0       Replicas: 0,1,3 Isr: 0,1
        Topic: tpc-1    Partition: 1    Leader: 1       Replicas: 1,2,6 Isr: 1,2

3.2.4删除topic

TypeScript
bin/kafka-topics.sh --zookeeper linux01:2181 --delete --topic test
删除topic,server.properties中需要一个参数处于启用状态: delete.topic.enable = true(默认是true)

使用 kafka-topics .sh 脚本删除主题的行为本质上只是在 ZooKeeper 中的 /admin/delete_topics 路径下建一个与待删除主题同名的节点,以标记该主题为待删除的状态。然后由 Kafka控制器异步完成。

3.2.5增加分区数

Shell
kafka-topics.sh --zookeeper doit01:2181 --alter --topic doitedu-tpc2 --partitions 3

Kafka只支持增加分区,不支持减少分区

原因是:减少分区,代价太大(数据的转移,日志段拼接合并)

如果真的需要实现此功能,则完全可以重新创建一个分区数较小的主题,然后将现有主题中的消息按照既定的逻辑复制过去;

3.2.6动态配置topic参数(不常用)

通过管理命令,可以为已创建的topic增加、修改、删除topic level参数

  • 添加/修改  指定topic的配置参数:

Shell
kafka-topics.sh  --zookeeper linux01:2181  --alter  --topic tpc2 --config compression.type=gzip
# --config compression.type=gzip  修改或添加参数配置
# --add-config compression.type=gzip  添加参数配置
# --delete-config compression.type  删除配置参数

topic配置参数文档地址: https://kafka.apache.org/documentation/#topicconfigs

3.3生产者:kafka-console-producer

Shell
[root@linux01 logs]# kafka-console-producer.sh --broker-list linux01:9092 --topic test01                  
>a
>b    
>c
>hello
>hi
>hadoop
>hive

顺序轮询(老版本)

顺序分配,消息是均匀的分配给每个 partition,即每个分区存储一次消息,轮询策略是 Kafka Producer 提供的默认策略,如果你不使用指定的轮询策略的话,Kafka 默认会使用顺序轮训策略的方式。

随机分配

实现随机分配的代码只需要两行,如下

Java
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size());

3.4消费者:kafka-console-consumer

消费者在消费的时候,需要指定要订阅的主题,还可以指定消费的起始偏移量

起始偏移量的指定策略有3中:

  • earliest 起始点 
  • latest   最新
  • 指定的offset( 分区号:偏移量)  ==》 必须的告诉他是哪个topic 的哪个分区的哪个offset
  • 从之前所记录的偏移量开始消费

在命令行中,可以指定从什么地方开始消费

  1. 加上参数 --from-beginning 指定从最前面开始消费
  1. 如果不加--from-beginning  就需要分情况讨论了,如果之前记录过消费的位置,那么就从之前消费的位置开始消费,如果说之前没有记录过之前消费的偏移量,那么就从最新的位置开始消费

kafka的topic中的消息,是有序号的(序号叫消息偏移量),而且消息的偏移量是在各个partition中独立维护的,在各个分区内,都是从0开始递增编号!

(1)消费消息

Shell
[root@linux01 logs]# kafka-console-consumer.sh --bootstrap-server linux01:9092 --topic test01 --from-beginning
hive
hello
hadoop

Plaintext
-- 指定从最前面开始消费
[root@linux01 bin]# kafka-console-consumer.sh --bootstrap-server linux01:9092 --topic doitedu01
--from-beginning
hadoop
list
hello
kafka
--
不指定他消费的位置的时候,就是从最新的地方开始消费
[root@linux01 bin]# kafka-console-consumer.sh --bootstrap-server linux01:9092 --topic doitedu01

(2)指定要消费的分区,和要消费的起始offset

Shell
-- 从指定的offset(需要指定偏移量和分区号)
[root@linux01 bin]# kafka-console-consumer.sh --bootstrap-server linux01:9092 --topic doitedu01 --offset 2 --partition 0
yy
abc
3333
2222

(3)消费组

  • 消费组是kafka为了提高消费并行度的一种机制!
  • 在kafka的底层逻辑中,任何一个消费者都有自己所属的组(如果没有指定,系统会自己给你分配一个组id)
  • 组和组之间,没有任何关系,大家都可以消费到目标topic的所有数据
  • 但是组内的各个消费者,就只能读到自己所分配到的partitions
  • KAFKA中的消费组,可以动态增减消费者,而且消费组中的消费者数量发生任意变动,都会重新分配分区消费任务(消费者组在均衡策略)

如何让多个消费者组成一个组: 就是让这些消费者的groupId相同即可!

3.5消费位移的记录

kafka的消费者,可以记录自己所消费到的消息偏移量,记录的这个偏移量就叫(消费位移);

记录这个消费到的位置,作用就在于消费者重启后可以接续上一次消费到位置来继续往后面消费;

消费位移,是组内共享的!!!消费位置记录在一个内置的topic中 ,默认是5s提交一次位移更新。

参数:auto.commit.interval.ms 默认是5s记录一次

Shell
--  可以使用特定的工具类 解析内置记录偏移量的topic
kafka-console-consumer.sh
--bootstrap-server      linux01:9092 --from-beginning --topic __consumer_offsets --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter"

通过指定formatter工具类,来对__consumer_offsets主题中的数据进行解析;

Shell
[g01,doitedu01,0]::OffsetAndMetadata(offset=14, leaderEpoch=Optional[0], metadata=, commitTimestamp=1659889851318, expireTimestamp=None)
[g01,doitedu01,2]::OffsetAndMetadata(offset=17, leaderEpoch=Optional[0], metadata=, commitTimestamp=1659889856319, expireTimestamp=None)
[g01,doitedu01,1]::OffsetAndMetadata(offset=13, leaderEpoch=Optional[0], metadata=, commitTimestamp=1659889856319, expireTimestamp=None)
[g01,doitedu01,0]::OffsetAndMetadata(offset=14, leaderEpoch=Optional[0], metadata=, commitTimestamp=1659889856319, expireTimestamp=None)

如果需要获取某个特定 consumer-group的消费偏移量信息,则需要计算该消费组的偏移量记录所在分区: Math.abs(groupID.hashCode()) % numPartitions(50)  根据组id的hash取值%50 确定具体是将这个组具体每个分区消费到了哪里

__consumer_offsets的分区数为:50

3.6配置管理 kafka-config

kafka-configs.sh 脚本是专门用来进行动态参数配置操作的,这里的操作是运行状态修改原有的配置,如此可以达到动态变更的目的;一般情况下不会进行动态修改 。

动态配置的参数,会被存储在zookeeper上,因而是持久生效的

可用参数的查阅地址: https://kafka.apache.org/documentation/#configuration

kafka-configs.sh 脚本包含:变更alter、查看describe 这两种指令类型;

kafka-configs. sh 支持主题、 broker 、用户和客户端这4个类型的配置。

kafka-configs.sh 脚本使用 entity-type 参数来指定操作配置的类型,并且使 entity-name参数来指定操作配置的名称。

比如查看topic的配置可以按如下方式执行:

Shell
kafka-configs.sh --zookeeper linux01:2181  --describe  --entity-type topics  --entity-name doitedu01

比如查看broker的动态配置可以按如下方式执行:

Shell
kafka-configs.sh  --describe --entity-type brokers --entity-name 0 --zookeeper linux01:2181

entity-typeentity-name的对应关系

点击图片可查看完整电子表格

  示例:添加topic级别参数

Shell
kafka-configs.sh --zookeeper linux01:2181 --alter --entity-type topics --entity-name doitedu01  --add-config cleanup.policy=compact,max.message.bytes=10000

示例:添加broker参数

Shell
kafka-configs.sh  --entity-type brokers --entity-name 0 --alter --add-config log.flush.interval.ms=1000 --bootstrap-server linux01:9092,linux02:9092,linux03:9092

动态配置topic参数

通过管理命令,可以为已创建的topic增加、修改、删除topic level参数

添加/修改  指定topic的配置参数:

Shell
kafka-topics.sh  --topic doitedu01 --alter  --config compression.type=gzip --zookeeper linux01:2181 

如果利用 kafka-configs.sh 脚本来对topic、producer、consumer、broker等进行参数动态

添加、修改配置参数

Shell
kafka-configs.sh --zookeeper linux01:2181 --entity-type topics --entity-name doitedu01 --alter --add-config compression.type=gzip 

删除配置参数

Shell
kafka-configs.sh --zookeeper linux01:2181 --entity-type topics --entity-name doitedu01 --alter --delete-config compression.type 

 

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

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

相关文章

教你如何用fiddler抓取https(详细教程)

对于想抓取HTTPS的测试初学者来说&#xff0c;常用的工具就是fiddler&#xff0c;可是在初学时&#xff0c;大家对于fiddler如何抓取HTTPS真是伤了脑筋&#xff0c;可能你一步步按着网上的帖子成功了&#xff0c;那当然是极好的&#xff0c;有可能没有成功&#xff0c;这时候你…

前端基础(JavaScript)——基础语法(变量,分支...) Json对象【重要】 函数定义 事件(未完待续)

目录 引出JS是啥&#xff0c;能干啥基础语法1.变量----let2.怎么打印---console3.if条件分支--啥都可以是条件例子&#xff1a;输入框&#xff0c;打印输入和未输入4.数组push 和 splice&#xff08;2&#xff09;splice&#xff0c;3个参数&#xff0c;索引开始、删除几个&…

广域网技术

广域网互连一般采用在网络层进行协议转换的方法实现。时延网关&#xff0c;更确切的说是路由器。 无连接的网际互连&#xff1a; 在网际层提供路由信息的是路由表&#xff0c;每个站或者路由器中都有一个网际路由表&#xff0c;表的每一行说明一个目标站对应的路由器地址。 路…

如何在Ubuntu20.04中配置 libarchive 库

libarchive 是什么&#xff1f; libarchive是一个开源的压缩和归档库。 它支持实时访问多种压缩文件格式&#xff0c;比如7z、zip、cpio、pax、rar、cab、uuencode等&#xff0c;因此应用十分广泛。 举个例子&#xff0c;我写了一段代码&#xff0c;想要解压一个压缩包&#…

HARVEST基音检测算法

Harvest: A high-performance fundamental frequency estimator from speech signals一种基于语音信号的高性能基频估计算法 Harvest的独特之处在于可以获得可靠的F0轮廓&#xff0c;减少了将浊音部分错误地识别为清音部分的错误。 它包括两个步骤:估计F0候选点和在这些候选点…

17JS08——函数

函数 一、函数的概念二、函数的使用2.1 声明函数2.2 调用函数2.3 函数的封装 三、函数的参数3.1 形参和实参3.2 形参和实参个数不匹配问题3.3 小结 四、函数的返回值4.1 return语句4.2 return终止函数4.3 break、continue、return的区别4.4 案例 五、arguments的使用案例1&…

案例30:基于Springboot酒店管理系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Java-多线程解析1

一、线程的描述&#xff1a; 1、线程是一个应用程序进程中不同的执行路径比例如&#xff1a;一个WEB服务器&#xff0c;能够为多个用户同时提供请求服务&#xff1b;而 -> 进程是操作系统中正在执行的不同的应用程序,比如&#xff1a;我们可以同时打开系统的word和游戏 2、多…

Tomcat优化及Nginx、tomcat动静分离配置

Tomcat优化及Nginx、tomcat动静分离配置 一、Tomcat优化1、操作系统优化&#xff08;内核参数优化&#xff09;2、Tomacat配置文件优化3、Java虚拟机&#xff08;JVM&#xff09;调优 二、Nginx、tomcat动静分离配置(七层代理)三、四层代理 一、Tomcat优化 Tomcat默认安装下的…

八、进程等待

文章目录 一、进程创建&#xff08;一&#xff09;fork函数概念1.概念2.父子进程共享fork之前和fork之后的所有代码&#xff0c;只不过子进程只能执行fork之后的&#xff01; &#xff08;二&#xff09;fork之后&#xff0c;操作系统做了什么?1.进程具有独立性&#xff0c;代…

(二)CSharp-字段-属性-常量

一、字段 什么是字段 字段&#xff08;filed&#xff09;是一种表示与对象或类型&#xff08;类或结构体&#xff09;关联的变量字段是类型的成员&#xff0c;旧称“成员变量”与对象关联的字段亦称“实例字段”与类型关联的字段称为“静态字段”&#xff0c;由 static 修饰 …

java SSM 学生家长联系系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM学生家长联系系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

docker 安装 oracle19c

docker 安装 oracle19c 拉取镜像 sudo docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c创建挂载目录 sudo mkdir -p /mydata/oracle/oradata授权 sudo chmod 777 /mydata/oracle/oradata安装 sudo docker run -d \ -p 1521:1521 -p 5500:5500 \ -e ORACLE…

《C++高级编程》读书笔记(三:编码风格)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 为代码编写文档 在编程环境下&#xff0c;文档通常指源文件中…

Android系统的Ashmem匿名共享内存子系统分析(5)- 实现共享的原理

声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法&#xff0c;记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的&#xff0c;但因为我个人问题没能实施这个计划&#xff0c;留下些许遗憾…文中参考了很多书籍及博客内容&#xff0c;可能涉及的比较…

springboot源码分析-jar启动

概述 Spring Boot 提供了 Maven 插件 spring-boot-maven-plugin&#xff0c;可以方便的将 Spring Boot 项目打成 jar 包或者 war 包。 SpringBoot 是如何通过jar包启动的 java -jar做了什么&#xff1f;看看官网怎么说 If the -jar option is specified, its argument is the …

基础算法(一)——补

快排 归并排序和快速排序的时间复杂度都是 O(nlogn) 左右两边设置哨兵&#xff0c;分成左边小于x, 右边大于x。 &#xff08;先分交换&#xff0c; 再递归&#xff09; #include<iostream> using namespace std; const int N1e610; int n; int q[N]; void quick_sort(i…

【计算机视觉】手把手教你配置stable-diffusion-webui进行AI绘图(保姆级教程)

文章目录 一、前言二、本地化部署的要求三、使用的项目Stable diffusion WebUI项目四、电脑环境配置4.1 安装Anaconda4.2 看版本4.3 配置库包下载环境&#xff0c;加快网络速度4.4 创建环境4.5 激活环境4.6 安装git4.7 安装cuda 五、Stable diffusion环境配置5.1 下载Stable di…

【博学谷学习记录】超强总结,用心分享丨人工智能 LLM langchain初步了解简记

目录 LangChain及必知概念LoadersDocumentText Spltters 文本分割Vectorstores 向量数据库Chain 链Agent 代理Embedding LangChain及必知概念 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。他主要拥有 2 个能力&#xff1a; 可以将 LLM 模型与外部数据源进行连接…

009-从零搭建微服务-系统服务(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…