主頁 > 後端開發 > 【詳細教程】Kafka應用場景、基礎組件、架構探索

【詳細教程】Kafka應用場景、基礎組件、架構探索

2022-08-12 07:20:31 後端開發

file

1、應用場景

1.1 kafka場景

? Kafka最初是由LinkedIn公司采用Scala語言開發,基于ZooKeeper,現在已經捐獻給了Apache基金會,目前Kafka已經定位為一個分布式流式處理平臺,它以 高吞吐、可持久化、可水平擴展、支持流處理等多種特性而被廣泛應用,

? Apache Kafka能夠支撐海量資料的資料傳遞,在離線和實時的訊息處理業務系統中,Kafka都有廣泛的應用,

(1)日志收集:收集各種服務的log,通過kafka以統一介面服務的方式開放 給各種consumer,例如Hadoop、Hbase、Solr等;

(2)訊息系統:解耦和生產者和消費者、快取訊息等;

(3)用戶活動跟蹤:Kafka經常被用來記錄web用戶或者app用戶的各種活動,如瀏覽網頁、搜索、點 擊等活動,這些活動資訊被各個服務器發布到kafka的topic中,然后訂閱者通過訂閱這些topic來做實時 的監控分析,或者裝載到Hadoop、資料倉庫中做離線分析和挖掘;

(4)運營指標:Kafka也經常用來記錄運營監控資料,包括收集各種分布式應用的資料,生產各種操作 的集中反饋,比如報警和報告;

(5)流式處理:比如spark streaming和storm;

1.2 kafka特性

kafka以高吞吐量著稱,主要有以下特性:

(1)高吞吐量、低延遲:kafka每秒可以處理幾十萬條訊息,它的延遲最低只有幾毫秒;

(2)可擴展性:kafka集群支持熱擴展;

(3)持久性、可靠性:訊息被持久化到本地磁盤,并且支持資料備份防止資料丟失;

(4)容錯性:允許集群中節點失敗(若副本數量為n,則允許n-1個節點失敗);

(5)高并發:支持數千個客戶端同時讀寫;

1.3 訊息對比

  • 如果普通的業務訊息解耦,訊息傳輸,rabbitMq是首選,它足夠簡單,管理方便,性能夠用,
  • 如果在上述,日志、訊息收集、訪問記錄等高吞吐,實時性場景下,推薦kafka,它基于分布式,擴容便捷
  • 如果很重的業務,要做到極高的可靠性,考慮rocketMq,但是它太重,需要你有足夠的了解

1.4 大廠應用

  • 京東通過kafka搭建資料平臺,用于用戶購買、瀏覽等行為的分析,成功抗住6.18的流量洪峰
  • 阿里借鑒kafka的理念,推出自己的rocketmq,在設計上參考了kafka的架構體系

2、基礎組件

2.1 角色

file

  • broker:節點,就是你看到的機器

  • provider:生產者,發訊息的

  • consumer:消費者,讀訊息的

  • zookeeper:資訊中心,記錄kafka的各種資訊的地方

  • controller:其中的一個broker,作為leader身份來負責管理整個集群,如果掛掉,借助zk重新選主

2.2 邏輯組件

file

  • topic:主題,一個訊息的通道,收發總得知道訊息往哪投

  • partition:磁區,每個主題可以有多個磁區分擔資料的傳遞,多條路并行,吞吐量大

  • Replicas:副本,每個磁區可以設定多個副本,副本之間資料一致,相當于備份,有備胎更可靠

  • leader & follower:主從,上面的這些副本里有1個身份為leader,其他的為follower,leader處理partition的所有讀寫請求

2.3 副本集合

  • AR:所有副本的統稱,AR=ISR+OSR

  • ISR:同步中的副本,可以參與leader選主,一旦落后太多(數量滯后和時間滯后兩個維度)會被踢到OSR,

  • OSR:踢出同步的副本,一直追趕leader,追上后會進入ISR

2.4 訊息標記

file

  • offset:偏移量,訊息消費到哪一條了?每個消費者都有自己的偏移量
  • HW:(high watermark):副本的高水印值,客戶端最多能消費到的位置,HW值為8,代表offset為[0,8]的9條訊息都可以被消費到,它們是對消費者可見的,而[9,12]這4條訊息由于未提交,對消費者是不可見的,
  • LEO:(log end offset):日志末端位移,代表日志檔案中下一條待寫入訊息的offset,這個offset上實際是沒有訊息的,不管是leader副本還是follower副本,都有這個值,

那么這三者有什么關系呢?

比如在副本數等于3的情況下,訊息發送到Leader A之后會更新LEO的值,Follower B和Follower C也會實時拉取Leader A中的訊息來更新自己,HW就表示A、B、C三者同時達到的日志位移,也就是A、B、C三者中LEO最小的那個值,由于B、C拉取A訊息之間延時問題,所以HW一般會小于LEO,即LEO>=HW,

具體的同步原理,下面章節會詳細講到

3.1 發展歷程

http://kafka.apache.org/downloads

file

3.1.1 版本命名

Kafka在1.0.0版本前的命名規則是4位,比如0.8.2.1,0.8是大版本號,2是小版本號,1表示打過1個補丁

現在的版本號命名規則是3位,格式是“大版本號”+“小版本號”+“修訂補丁數”,比如2.5.0,前面的2代表的是大版本號,中間的5代表的是小版本號,0表示沒有打過補丁

我們所看到的下載包,前面是scala編譯器的版本,后面才是真正的kafka版本,

3.1.2 演進歷史

0.7版本
只提供了最基礎的訊息佇列功能,

0.8版本
引入了副本機制,至此Kafka成為了一個真正意義上完備的分布式高可靠訊息佇列解決方案,

0.9版本
增加權限和認證,使用Java重寫了新的consumer API,Kafka Connect功能;不建議使用consumer API;

0.10版本
引入Kafka Streams功能,正式升級成分布式流處理平臺;建議版本0.10.2.2;建議使用新版consumer API

0.11版本
producer API冪等,事務API,訊息格式重構;建議版本0.11.0.3;謹慎對待訊息格式變化

1.0和2.0版本
Kafka Streams改進;建議版本2.0;

3.2 集群搭建(助學)

1)原生啟動

kafka啟動需要zookeeper,第一步啟動zk:

docker run --name zookeeper-1 -d -p 2181 zookeeper:3.4.13

原生安裝:下載后解壓啟動即可 http://kafka.apache.org/downloads

bin/kafka-server-start.sh config/server.properties
#server.properties配置說明
#表示broker的編號,如果集群中有多個broker,則每個broker的編號需要設定的不同
broker.id=0 
#brokder對外提供的服務入口地址,默認9092
listeners=PLAINTEXT://:9092 
#設定存放訊息日志檔案的地址
log.dirs=/tmp/kafka/log 
#Kafka所需Zookeeper集群地址,這里是關鍵!加入同一個zk的kafka為同一集群
zookeeper.connect=zookeeper:2181 

2)推薦docker-compose 一鍵啟動

#參考資料中的kafka.yml
#注意hostname問題,ip地址:52.82.98.209,換成你自己服務器的
#docker-compose -f kafka.yml up -d 啟動
version: '3'
services:
    zookeeper:
        image: zookeeper:3.4.13

    kafka-1:
        container_name: kafka-1
        image: wurstmeister/kafka:2.12-2.2.2
        ports:
            - 10903:9092
        environment:
            KAFKA_BROKER_ID: 1 
            HOST_IP: 52.82.98.209
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
            #docker部署必須設定外部可訪問ip和埠,否則注冊進zk的地址將不可達造成外部無法連接
            KAFKA_ADVERTISED_HOST_NAME: 52.82.98.209
            KAFKA_ADVERTISED_PORT: 10903 
        volumes:
            - /etc/localtime:/etc/localtime
        depends_on:
            - zookeeper           
    kafka-2:
        container_name: kafka-2
        image: wurstmeister/kafka:2.12-2.2.2
        ports:
            - 10904:9092
        environment:
            KAFKA_BROKER_ID: 2 
            HOST_IP: 52.82.98.209
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
            KAFKA_ADVERTISED_HOST_NAME: 52.82.98.209
            KAFKA_ADVERTISED_PORT: 10904 
        volumes:
            - /etc/localtime:/etc/localtime
        depends_on:
            - zookeeper 

3.3 組件探秘

命令列工具是管理kafka集群最直接的工具,官方自帶,不需要額外安裝,

3.2.1 主題創建

#進入容器
docker exec -it kafka-1 sh
#進入bin目錄
cd /opt/kafka/bin
#創建
kafka-topics.sh --zookeeper zookeeper:2181 --create --topic test --partitions 2 --replication-factor 1

3.2.2 查看主題

kafka-topics.sh --zookeeper zookeeper:2181 --list

3.2.3 主題詳情

kafka-topics.sh --zookeeper zookeeper:2181 --describe --topic test

#分析輸出:
Topic:test	PartitionCount:2	ReplicationFactor:1	Configs:
	Topic: test	Partition: 0	Leader: 2	Replicas: 2	Isr: 2
	Topic: test	Partition: 1	Leader: 1	Replicas: 1	Isr: 1

3.2.4 訊息收發

#使用docker連接任意集群中的一個容器
docker exec -it kafka-1 sh

#進入kafka的容器內目錄
cd /opt/kafka/bin

#客戶端監聽
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test

#另起一個終端,驗證發送
./kafka-console-producer.sh --broker-list localhost:9092 --topic test

3.2.5 分組消費

#啟動兩個consumer時,如果不指定group資訊,訊息被廣播
#指定相同的group,讓多個消費者分工消費(畫圖:group原理)

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --group aaa

#結果:在發送方,連續發送 1-4 ,4條訊息,同一group下的兩臺consumer交替消費,并發執行

注意!!!

這是在消費者和磁區數相等(都是2)的情況下,
如果同一group下的 ( 消費者數量 > 磁區數量 ) 那么就會有消費者閑置,

驗證方式:

可以再多啟動幾個消費者試一試,會發現,超出2個的時候,有的始終不會消費到訊息,
停掉可以消費到的,那么閑置的會被激活,進入作業狀態

3.2.6 指定磁區

#指定磁區通過引數 --partition,注意!需要去掉上面的group
#指定磁區的意義在于,保障訊息傳輸的順序性(畫圖:kafka順序性原理)
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --partition 0
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --partition 1

#結果:發送1-4條訊息,交替出現,說明訊息被均分到各個磁區中投遞


#默認的發送是沒有指定key的
#要指定磁區發送,就需要定義key,那么相同的key被路由到同一個磁區
./kafka-console-producer.sh --broker-list kafka-1:9092 --topic test --property parse.key=true

#攜帶key再發送,注意key和value之間用tab分割
>1	1111
>1	2222
>2	3333
>2	4444

#查看consumer的接收情況
#結果:相同的key被同一個consumer消費掉

3.2.7 偏移量

#偏移量決定了訊息從哪開始消費,支持:開頭,還是末尾

# earliest:當各磁區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,從頭開始消費
# latest:當各磁區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,消費新產生的該磁區下的資料
# none:topic各磁區都存在已提交的offset時,從offset后開始消費;只要有一個磁區不存在已提交的offset,則拋出例外

# 注意點!!!有提交偏移量的話,仍然以提交的為主,即便使用earliest,比提交點更早的也不會被提取

#--offset [earliest|latest(默認)] , 或者 --from-beginning
#新起一個終端,指定offset位置
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --partition 0 --offset earliest

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --partition 0 --from-beginning

#結果:之前發送的訊息,從頭又消費了一遍!

3.4 zk探秘

前面說過,zk存盤了kafka集群的相關資訊,本節來探索內部的秘密,

kafka的資訊記錄在zk中,進入zk容器,查看相關節點和資訊

docker exec -it kafka_zookeeper_1 sh

>./bin/zkCli.sh

>ls /

#結果:得到以下配置資訊

file

3.4.1 broker資訊

[zk: localhost:2181(CONNECTED) 0] ls /brokers
[ids, topics, seqid]
[zk: localhost:2181(CONNECTED) 1] ls /brokers/ids
[1, 2]

#機器broker資訊
[zk: localhost:2181(CONNECTED) 4] get /brokers/ids/1
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://52.82.98.209:10903"],"jmx_port":-1,"host":"52.82.98.209","timestamp":"1609825245500","port":10903,"version":4}
cZxid = 0x27
ctime = Tue Jan 05 05:40:45 GMT 2021
mZxid = 0x27
mtime = Tue Jan 05 05:40:45 GMT 2021
pZxid = 0x27
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x105a2db626b0000
dataLength = 196
numChildren = 0

3.4.2 主題與磁區

#磁區節點路徑
[zk: localhost:2181(CONNECTED) 5] ls /brokers/topics
[test, __consumer_offsets]
[zk: localhost:2181(CONNECTED) 6] ls /brokers/topics/test
[partitions]
[zk: localhost:2181(CONNECTED) 7] ls /brokers/topics/test/partitions
[0, 1]
[zk: localhost:2181(CONNECTED) 8] ls /brokers/topics/test/partitions/0
[state]

#磁區資訊,leader所在的機器id,isr串列等
[zk: localhost:2181(CONNECTED) 18] get /brokers/topics/test/partitions/0/state
{"controller_epoch":1,"leader":1,"version":1,"leader_epoch":0,"isr":[1]}
cZxid = 0xb0
ctime = Tue Jan 05 05:56:06 GMT 2021
mZxid = 0xb0
mtime = Tue Jan 05 05:56:06 GMT 2021
pZxid = 0xb0
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 72
numChildren = 0

3.4.3 消費者與偏移量

[zk: localhost:2181(CONNECTED) 15] ls /consumers
[]
#空的???
#那么,消費者以及它的偏移記在哪里呢???

kafka 消費者記錄 group 的消費 偏移量 有兩種方式 :

1)kafka 自維護 (新)

2)zookpeer 維護 (舊) ,已經逐漸被廢棄

查看方式:

上面的消費用的是控制臺工具,這個工具使用--bootstrap-server,不經過zk,也就不會記錄到/consumers下,

其消費者的offset會更新到一個kafka自帶的topic【__consumer_offsets】下面

#先起一個消費端,指定group
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --group aaa

#使用控制臺工具查看消費者及偏移量情況
./kafka-consumer-groups.sh --bootstrap-server kafka-1:9092 --list
KMOffsetCache-44acff134cad
aaa

#查看偏移量詳情
./kafka-consumer-groups.sh --bootstrap-server kafka-1:9092 --describe --group aaa

當前與LEO保持一致,說明訊息都完整的被消費過

file

停掉consumer后,往provider中再發幾條記錄,offset開始滯后:

file

重新啟動consumer,消費到最新的訊息,同時再回傳看偏移量,訊息得到同步:

file

3.4.4 controller

#當前集群中的主控節點是誰
[zk: localhost:2181(CONNECTED) 17] get /controller
{"version":1,"brokerid":1,"timestamp":"1609825245694"}
cZxid = 0x2a
ctime = Tue Jan 05 05:40:45 GMT 2021
mZxid = 0x2a
mtime = Tue Jan 05 05:40:45 GMT 2021
pZxid = 0x2a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x105a2db626b0000
dataLength = 54
numChildren = 0

3.5 km

3.5.1 啟動

kafka-manager是目前最受歡迎的kafka集群管理工具,最早由雅虎開源,提供可視化kafka集群操作

官網:https://github.com/yahoo/kafka-manager/releases

注意它的版本,docker社區的景象版本滯后于kafka,我們自己來打鏡像,

#Dockerfile
FROM daocloud.io/library/java:openjdk-8u40-jdk
ADD kafka-manager-2.0.0.2/ /opt/km2002/
CMD ["/opt/km2002/bin/kafka-manager","-Dconfig.file=/opt/km2002/conf/application.conf"]

#打包,注意將kafka-manager-2.0.0.2放到同一目錄
docker build -t km:2002 .
#啟動:在上面的yml里,services節點下加一段
#參考資料:km.yml
#執行: docker-compose -f km.yml up -d
		km:
        image: km:2002
        ports:
            - 10906:9000
        depends_on:
            - zookeeper
         

3.5.2 使用

使用km可以方便的查看以下資訊:

  • cluster:創建集群,填寫zk地址,選中jmx,consumer資訊等選項
  • brokers:串列,機器資訊
  • topic:主題資訊,主題內的磁區資訊,創建新的主題,增加磁區
  • cosumers: 消費者資訊,偏移量等

本文由傳智教育博學谷 - 狂野架構師教研團隊發布
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力
轉載請注明出處!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501597.html

標籤:其他

上一篇:redis-SpringBoot(21)

下一篇:Python帶我起飛——入門、進階、商業實戰_ 入門版電子書籍分享,

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more