kafka下載連結
http://kafka.apache.org/downloads #清華源 https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/
kafka版本格式
kafka_<scala 版本>_<kafka 版本> #示例:kafka_2.13-2.7.0.tgz
官方文件:
http://kafka.apache.org/quickstart #二進位制安裝,內嵌了zookeeper(新版可以不用zookeeper,這裡還是用老版本)
3.6.2.1 單機部署 Kafka
注意:Kafka提供的指令碼不支援建立軟連結到/usr/local/bin/路徑,只支援絕對路徑或相對徑執行
[root@ubuntu ~]#apt update && apt -y install openjdk-8-jdk #下載包 [root@ubuntu ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/3.6.2/kafka_2.13-3.6.2.tgz [root@ubuntu ~]#tar -xzf kafka_2.13-3.6.2.tgz [root@ubuntu ~]#cd kafka_2.13-3.6.2/ #啟動單機kafka [root@ubuntu kafka_2.13-3.6.2]#bin/kafka-server-start.sh config/server.properties
範例:一鍵安裝 Kafka 單機版指令碼
[root@ubuntu ~]#vim install_kafka_single_node.sh #!/bin/bash # #******************************************************************** #Author: wangxiaochun #QQ: 29308620 #Date: 2020-06-03 #FileName: install_kafka_single_node.sh #URL: http://www.wangxiaochun.com #Description: The test script #Copyright (C): 2020 All rights reserved #******************************************************************** #支援線上和離線安裝安裝 KAFKA_VERSION=3.6.0 #KAFKA_VERSION=3.5.1 #KAFKA_VERSION=3.5.0 #KAFKA_VERSION=3.4.0 #KAFKA_VERSION=3.3.2 #KAFKA_VERSION=3.2.0 #KAFKA_VERSION=-3.0.0 SCALA_VERSION=2.13 KAFKA_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/${KAFKA_VERSION}/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz" #KAFKA_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.8.1/kafka_2.13-2.8.1.tgz" #KAFKA_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.7.1/kafka_2.13-2.7.1.tgz" KAFKA_INSTALL_DIR=/usr/local/kafka HOST=`hostname -I|awk '{print $1}'` . /etc/os-release color () { RES_COL=60 MOVE_TO_COL="echo -en \\033[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \\033[1;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" SETCOLOR_WARNING="echo -en \\033[1;33m" SETCOLOR_NORMAL="echo -en \E[0m" echo -n "$1" && $MOVE_TO_COL echo -n "[" if [ $2 = "success" -o $2 = "0" ] ;then ${SETCOLOR_SUCCESS} echo -n $" OK " elif [ $2 = "failure" -o $2 = "1" ] ;then ${SETCOLOR_FAILURE} echo -n $"FAILED" else ${SETCOLOR_WARNING} echo -n $"WARNING" fi ${SETCOLOR_NORMAL} echo -n "]" echo } env () { echo $HOST `hostname` >> /etc/hosts } install_jdk() { java -version &>/dev/null && { color "JDK 已安裝!" 1 ; return; } if command -v yum &>/dev/null ; then yum -y install java-1.8.0-openjdk-devel || { color "安裝JDK失敗!" 1; exit 1; } elif command -v apt &>/dev/null ; then apt update #apt install openjdk-11-jdk -y || { color "安裝JDK失敗!" 1; exit 1; } apt install openjdk-8-jdk -y || { color "安裝JDK失敗!" 1; exit 1; } else color "不支援當前作業系統!" 1 exit 1 fi java -version && { color "安裝 JDK 完成!" 0 ; } || { color "安裝JDK失敗!" 1; exit 1; } } install_zookeeper() { cat > ${KAFKA_INSTALL_DIR}/bin/zookeeper-startup.sh <<EOF #!/bin/bash nohup ${KAFKA_INSTALL_DIR}/bin/zookeeper-server-start.sh ${KAFKA_INSTALL_DIR}/config/zookeeper.properties & EOF chmod +x ${KAFKA_INSTALL_DIR}/bin/zookeeper-startup.sh cat > /lib/systemd/system/zookeeper.service <<EOF [Unit] Description=zookeeper.service After=network.target [Service] Type=forking ExecStart=${KAFKA_INSTALL_DIR}/bin/zookeeper-startup.sh ExecStop=${KAFKA_INSTALL_DIR}/bin/zookeeper-server-stop.sh [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now zookeeper.service systemctl is-active zookeeper.service if [ $? -eq 0 ] ;then color "zookeeper 安裝成功!" 0 else color "zookeeper 安裝失敗!" 1 exit 1 fi } install_kafka(){ if [ ! -f kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz ];then wget -P /usr/local/src/ --no-check-certificate $KAFKA_URL || { color "下載失敗!" 1 ;exit ; } fi tar xf /usr/local/src/${KAFKA_URL##*/} -C /usr/local/ ln -s /usr/local/kafka_${SCALA_VERSION}-${KAFKA_VERSION} ${KAFKA_INSTALL_DIR} install_zookeeper echo PATH=${KAFKA_INSTALL_DIR}/bin:'$PATH' >> /etc/profile cat > ${KAFKA_INSTALL_DIR}/bin/kafka-startup.sh <<EOF #!/bin/bash nohup ${KAFKA_INSTALL_DIR}/bin/kafka-server-start.sh ${KAFKA_INSTALL_DIR}/config/server.properties & EOF chmod +x ${KAFKA_INSTALL_DIR}/bin/kafka-startup.sh cat > /lib/systemd/system/kafka.service <<EOF [Unit] Description=Apache kafka After=network.target [Service] Type=forking ExecStart=${KAFKA_INSTALL_DIR}/bin/kafka-startup.sh ExecStop=/bin/kill -TERM \${MAINPID} Restart=always RestartSec=20 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now kafka.service #kafka-server-start.sh -daemon ${KAFKA_INSTALL_DIR}/config/server.properties systemctl is-active kafka.service if [ $? -eq 0 ] ;then color "kafka 安裝成功!" 0 else color "kafka 安裝失敗!" 1 exit 1 fi } env install_jdk install_kafka
3.6.3 叢集部署
3.6.3.1 環境準備
3.6.3.1.1 主機名解析
#修改每個kafka節點的主機名 [root@ubuntu2204 ~]#hostnamectl hostname node1 [root@ubuntu2204 ~]#hostnamectl hostname node2 [root@ubuntu2204 ~]#hostnamectl hostname node3 #在所有kafka節點上實現主機名稱解析 [root@ubuntu2204 ~]#cat /etc/hosts 10.0.0.201 node1 10.0.0.202 node2 10.0.0.203 node3
注意:如果使用kafka自帶的zookeeper,需要修改配置檔案,如下示例
#注意如果使用kafka自帶的zookeeper,需要修改配置檔案 [root@node1 ~]#vim /usr/local/kafka/config/zookeeper.properties #新增三行時間相關配置 tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 #新增下面叢集配置 server.1=10.0.0.201:2888:3888 server.2=10.0.0.202:2888:3888 server.3=10.0.0.203:2888:3888 [root@node1 ~]#echo 1 > /usr/local/kafka/data/myid
3.6.3.2 各節點部署 Kafka
[root@node1 ~]#vim /usr/local/kafka/config/server.properties broker.id=1 #每個broker在叢集中每個節點的正整數唯一標識,此值儲存在log.dirs下的meta.properties檔案,修改此行 listeners=PLAINTEXT://10.0.0.101:9092 #指定當前主機的IP做為監聽地址,注意:不支援0.0.0.0 log.dirs=/usr/local/kafka/data #kakfa用於儲存資料的目錄,所有的訊息都會儲存在該目錄當中,修改此行 num.partitions=1 #設定建立新的topic時預設分割槽數量,建議和kafka的節點數量一致 default.replication.factor=3 #指定預設的副本數為3(最少為2,表示1個主,1個備用),可以實現故障的自動轉移 log.retention.hours=168 #設定kafka中訊息保留時間,預設為168小時即7天 zookeeper.connect=10.0.0.101:2181,10.0.0.102:2181,10.0.0.103:2181 #指定連線的zk的地址,zk中儲存了broker的後設資料資訊,修改此行 zookeeper.connection.timeout.ms=6000 #設定連線zookeeper的超時時間,單位為ms,預設6秒鐘
常見命令
kafka-topics.sh #訊息的管理命令 kafka-console-producer.sh #生產者的模擬命令 kafka-console-consumer.sh #消費者的模擬命令
#建立topic名為 wang #新版命令,透過--bootstrap-server指定kafka的地址 [root@ubuntu ~]#/usr/local/kafka/bin/kafka-topics.sh --create --topic wang --bootstrap-server 10.0.0.151:9092 #對應資料在配置檔案中的log.dirs,不是叢集,所以算第一個節點為0 #叢集模式下(partitions(分割槽)為3(因為3個節點),replication(每個分割槽的副本數)為2 ) [root@node1 ~]#/usr/local/kafka/bin/kafka-topics.sh --create --topic wang --bootstrap-server 10.0.0.151:9092,10.0.0.152:9092,10.0.0.153:9092 --partitions 3 --replication-factor 2 #配置檔案中的log.dirs路徑下可以看到2個檔案,可能是wang-0,wang-1 #舊版命令,透過--zookeeper指定zookeeper的地址 [root@node1 ~]#/usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 10.0.0.151:2181 --topic wang
3.7.2 獲取所有 Topic
#新版命令(如果是叢集,連哪一個都行) [root@ubuntu ~]#/usr/local/kafka/bin/kafka-topics.sh --list --bootstrap-server 10.0.0.151:9092 #舊版命令 [root@node1 ~]#/usr/local/kafka/bin/kafka-topics.sh --list --zookeeper 10.0.0.151:2181
#新版命令(單機) [root@ubuntu ~]#/usr/local/kafka/bin/kafka-topics.sh --describe --bootstrap-server 10.0.0.151:9092 --topic wang Topic: wang TopicId: dOjjlkWfR5upj3B4joPCmQ PartitionCount: 1 ReplicationFactor: 1 Configs: Topic: wang Partition: 0 Leader: 0 Replicas: 0 Isr: 0 #如果是叢集,連哪一個都行 [root@ubuntu ~]#/usr/local/kafka/bin/kafka-topics.sh --describe --bootstrap-server 10.0.0.151:9092 --topic wang Topic: wang TopicId: kTlJkdM_RQW_6vBL4dVsaQ PartitionCount: 3 ReplicationFactor: 2 Configs: 資料分割槽編號 第幾臺機器 副本(包括主) Topic: wang Partition: 0 Leader: 3 Replicas: 3,1 Isr: 3,1 Topic: wang Partition: 1 Leader: 1 Replicas: 1,2 Isr: 1,2 Topic: wang Partition: 2 Leader: 2 Replicas: 2,3 Isr: 2,3
#傳送訊息命令格式: (叢集寫入 --broker-list後面寫入哪一個,效果都是一樣的) kafka-console-producer.sh --broker-list <kafkaIP1>:<埠>,<kafkaIP2>:<埠> --topic <topic名稱> --producer-property group.id=<組名> 範例: #互動式輸入訊息,按Ctrl+C退出 [root@node1 ~]#/usr/local/kafka/bin/kafka-console-producer.sh --broker-list 10.0.0.151:9092 --topic wang >hello >world
#接收訊息命令格式: kafka-console-consumer.sh --bootstrap-server <host>:<post> --topic <topic名稱> --from-beginning --consumer-property group.id=<組名稱> 注意: 1.訊息者先生產訊息,消費者後續啟動,也能收到之前生產的訊息 2.同一個訊息在同一個group內的消費者只有被一個消費者消費,比如:共100條訊息,在一個group內有A,B兩個消費者,其中A消費50條,B消費另外的50條訊息。從而實現負載均衡,不同group內的消費者則可以同時消費同一個訊息 3.--from-beginning 表示消費前釋出的訊息也能收到,預設只能收到消費後釋出的新訊息 範例: #互動式持續接收訊息,按Ctrl+C退出 [root@ubuntu ~]#/usr/local/kafka/bin/kafka-console-consumer.sh --topic wang --bootstrap-server 10.0.0.151:9092 --from-beginning hello world #一個訊息同時只能被同一個組內一個消費者消費(單播機制),實現負載均衡,而不能組可以同時消費同一個訊息(多播機制) [root@ubuntu ~]#/usr/local/kafka/bin/kafka-console-consumer.sh --topic wang --bootstrap-server 10.0.0.151:9092 --from-beginning --consumer-property group.id=group1 [root@ubuntu ~]#/usr/local/kafka/bin/kafka-console-consumer.sh --topic wang --bootstrap-server 10.0.0.151:9092 --from-beginning --consumer-property group.id=group1 #其他不同組,或沒有組的也可以收到訊息
#注意:需要修改配置檔案server.properties中的delete.topic.enable=true並重啟(否則不會真正刪除) #新版本 [root@ubuntu ~]#/usr/local/kafka/bin/kafka-topics.sh --delete --bootstrap-server 10.0.0.151:9092 --topic wang #舊版本 [root@node3 ~]#/usr/local/kafka/bin/kafka-topics.sh --delete --zookeeper 10.0.0.151:2181 --topic wang
範例:刪除zk下面 topic test
#無需修改配置檔案server.properties,此方法很危險 [root@zookeeper-node1 ~]#zkCli.sh -server 10.0.0.151:2181 [zk: 10.0.0.103:2181(CONNECTED) 0] ls /brokers/topics [zk: 10.0.0.103:2181(CONNECTED) 0] deleteall /brokers/topics/test [zk: 10.0.0.103:2181(CONNECTED) 0] ls /brokers/topics
訊息積壓是指在訊息傳遞系統中,積累了大量未被處理或未被消費的訊息
透過Kafka提供的工具檢視格式:
#發現當前消費的offset和最後一條的offset差距很大,說明有大量的資料積壓 kafka-consumer-groups.sh --bootstrap-server {kafka連線地址} --describe --group {消費組} | --all-groups #範例: #下面命令檢視消費組中每個Topic的堆積訊息數。“LAG”表示每個Topic的總堆積數 [root@ubuntu2204 ~]#kafka-consumer-groups.sh --bootstrap-server 10.0.0.151:9092 --describe --all-groups GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID group1 wang 0 7 9 2 - #把消費組group1的視窗關閉,就沒法消費,就能看到消費擠壓LAG
kafka把資料的後設資料存在zookeeper中
3.9 圖形工具 Offset Explorer (Kafka Tool)
#官網: https://www.kafkatool.com/ #下載連結: https://www.kafkatool.com/download.html 建立連線,配置kafka資訊,zookeeper可以不配,顯示預設是位元組碼,需要properities下content types改為string,update
3.10.1 介紹
官網
http://www.kafka-eagle.org/
https://docs.kafka-eagle.org/2.installation
注意:當前最新版kafka-eagle-bin-3.0.2有bug,無法正常顯示資料,可以選用kafka-eagle-bin-3.0.1版本
注意: 不支援JDK-11
#安裝 JAVA [root@ubuntu ~]#apt update && apt -y install openjdk-8-jdk #下載安裝 [root@ubuntu ~]#wget https://github.com/smartloli/kafka-eagle-bin/archive/refs/tags/v3.0.1.tar.gz #解壓安裝包 [root@ubuntu ~]#tar xf kafka-eagle-bin-3.0.1.tar.gz -C /usr/local [root@ubuntu ~]#cd /usr/local/ [root@ubuntu local]#cd kafka-eagle-bin-3.0.1/ [root@ubuntu kafka-eagle-bin-3.0.1]#tar xf efak-web-3.0.1-bin.tar.gz -C /usr/local [root@ubuntu local]#ln -s efak-web-3.0.1/ kafka-eagle-web #設定全域性變數 [root@ubuntu local]#vi /etc/profile export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export KE_HOME=/usr/local/kafka-eagle-web export PATH=$PATH:$KE_HOME/bin #也可以退出重新登入 [root@ubuntu local]#. /etc/profile #修改配置檔案 [root@ubuntu ~]#vim /usr/local/kafka-eagle-web/conf/system-config.properties ###################################### # 填寫 zookeeper叢集列表 #kafkazookeeper節點配置屬性多個可以新增一個cluster1,如果有多套kafka叢集加多個名稱 efak.zk.cluster.alias=cluster1 ###################################### #zookeeper地址 ######################################修改此處 cluster1.zk.list=10.0.0.151:2181,10.0.0.152:2181,10.0.0.153:2181 #cluster2.zk.list=10.0.0.201:2181,10.0.0.202:2181,10.0.0.203:2181 此行必須註釋掉,否則無法啟動 ###################################### # broker 最大規模數量 ###################################### cluster1.efak.broker.size=20 ###################################### # zk 客戶端執行緒數##################### ################# kafka.zk.limit.size=32 ###################################### # EFAK webui 埠 ###################################### efak.webui.port=8048 ###################################### # kafka offset storage ###################################### cluster1.efak.offset.storage=kafka cluster2.efak.offset.storage=zk ###################################### # kafka jmx uri ###################################### cluster1.efak.jmx.uri=service:jmx:rmi:///jn di/rmi://%s/jmxrmi ###################################### # kafka metrics 指標,預設儲存15天 ###################################### efak.metrics.charts=true efak.metrics.retain=15 ###################################### # kafka sql topic records max ###################################### efak.sql.topic.records.max=5000 efak.sql.topic.preview.records.max=10 ###################################### # delete kafka topic token ###################################### efak.topic.token=keadmin ###################################### # kafka sqlite 資料庫地址(需要修改儲存路徑) #內嵌資料庫 ######################################修改此處,取消下面四行註釋 efak.driver=org.sqlite.JDBC efak.url=jdbc:sqlite:/usr/local/kafka-eagle-web/db/ke.db #此檔案會自動生成(路徑提前建立) efak.username=root efak.password=www.kafka-eagle.org ###################################### # kafka mysql 資料庫地址(需要提前建立ke庫) ######################################修改此處新增註釋下面四行 #efak.driver=com.mysql.cj.jdbc.Driver #efak.url=jdbc:mysql://127.0.0.1:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull #efak.username=ke #efak.password=123456 #啟動 #記憶體最佳化 [root@ubuntu ~]#vim /usr/local/kafka-eagle-web/bin/ke.sh ...... #記憶體小,這裡修改堆記憶體為512m export KE_JAVA_OPTS="-server -Xmx512m -Xms512m -XX:MaxGCPauseMillis=20 -XX:+UseG1GC -XX:MetaspaceSize=128m - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:Min MetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80" ...... #啟動 [root@ubuntu ~]#/usr/local/kafka-eagle-web/bin/ke.sh start #觀察日誌 [root@ubuntu2204 ~]#tail -f /usr/local/kafka-eagle-web/logs/* #登入 http://10.0.0.154:8048 Account:admin ,Password:123456
3.10.2.8 修改和監控 Kafka
#所有kafka節點修改配置 [root@node1 ~]#vim /usr/local/kafka/bin/kafka-server-start.sh ...... if[ " x$KAFKA_HEAP_OPTS"="x"] ; then export KAFKA_HEAP_OPTS=" -Xmx1G-Xms1G" export JMX_PORT="9999" #新增此行 fi ...... [root@node1 ~]#systemctl restart kafka #多9999埠
Kafka 常用監控指標
4 Dubbo
基於java的開發框架
監控monitor是dubbo開發的, dubbo admin做的管理控制檯
4.2 實戰案例:實現 Dubbo 微服務架構(新專案)
4.2.1 環境準備
準備三臺主機,分別主機名為zookeeper,provider,consumer
#zookeeper機器上安裝zookeeper #provider機器 #修改主機名 [root@ubuntu ~]#hostnamectl set-hostname provider #做下名稱解析 [root@ubuntu ~]#vim /etc/hosts 10.0.0.152 provider 10.0.0.153 consumer #zookeeper的地址,正常是3個地址,這裡做單機了,為了方便 10.0.0.151 zk1.wang.org zk2.wang.org zk3.wang.org #consumer機器 [root@ubuntu ~]#hostnamectl set-hostname consumer [root@ubuntu ~]#vim /etc/hosts 10.0.0.152 provider 10.0.0.153 consumer 10.0.0.151 zk1.wang.org zk2.wang.org zk3.wang.org
4.2.4 編譯 Dubbo Provider和 Consumer
[root@provider ~]#tar xf dubbo-demo-provider.tar.gz [root@consumer ~]#tar xf dubbo-demo-consumer.tar.gz #provider和consumer操作 #兩個專案要在java8上執行 [root@provider ~]#apt update && apt install openjdk-8-jdk [root@provider ~]#apt install maven -y #映象加速 [root@provider ~]#vim /etc/maven/settings.xml <mirrors> <!--阿里雲映象--> <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors> #進行編譯 [root@provider ~]#cd dubbo-demo-provider/ [root@provider dubbo-demo-provider]#mvn package -Dmaven.test.skip=true [root@provider ~]#cd dubbo-demo-provider/dubbo-server/target/ [root@provider target]#java -jar dubbo-server.jar [root@consumer ~]#cd dubbo-demo-consumer/ [root@consumer dubbo-demo-consumer]#mvn package -Dmaven.test.skip=true [root@consumer ~]#cd dubbo-demo-consumer/dubbo-client/target/ [root@consumer target]#java -jar dubbo-client.jar #可以從zookeeper中看到,消費端和生產端資訊。消費端透過zookeeper找到生產端地址,然後消費端和生產端實現連線 #瀏覽器訪問 Dubbo Consumer http://10.0.0.153:8080/hello?name=wang #看生產端,消費端輸出
#直接把編譯好的包複製過去 [root@provider ~]#cd dubbo-demo-provider/dubbo-server/target/ [root@provider target]#scp dubbo-server.jar 10.0.0.154: [root@consumer ~]#cd dubbo-demo-consumer/dubbo-client/target/ [root@consumer target]#scp dubbo-client.jar 10.0.0.155: #新機器 [root@ubuntu ~]#hostnamectl set-hostname provider2 [root@ubuntu ~]#hostnamectl set-hostname consumer2 #新兩臺機器執行操作 [root@provider ~]#apt update && apt install openjdk-8-jdk [root@provider ~]#apt install maven -y [root@ubuntu ~]#vim /etc/hosts 10.0.0.152 provider 10.0.0.153 consumer 10.0.0.154 provider2 10.0.0.155 consumer2 10.0.0.151 zk1.wang.org zk2.wang.org zk3.wang.org #執行 [root@provider2 ~]#java -jar dubbo-server.jar [root@consumer2 ~]#java -jar dubbo-client.jar #瀏覽器訪問 Dubbo Consumer http://10.0.0.155:8080/hello?name=wang #看生產端,消費端輸出(可以看到隨機一個生產端收到訊息)
#單獨安裝 官網說明 https://github.com/apache/dubbo-admin https://cn.dubbo.apache.org/zh-cn/download/
注意: 記憶體建議4G以上,且編譯時間可能會花10分鐘以上的時間
注意: 本專案支援Ubuntu22.04和JDK8和JDK11以下版本
當前專案已經用golang重構,需要下載指定branch為develop,再用downlaod zip 形式下載JAVA的原始碼
新版還原為預設JAVA
範例:dubbo-admin-0.7.0
[root@provider ~]#git clone https://github.com/apache/dubbo-admin.git #修改zookeeper 地址為實際IP [root@provider】#cd dubbo-admin [root@provider dubbo-admin]#vim dubbo-admin-server/src/main/resources/application-dev.properties admin.registry.address=zookeeper://10.0.0.151:2181 admin.config-center=zookeeper://10.0.0.151:2181 admin.metadata.address=zookeeper://10.0.0.151:2181 #dubbo-admin-server/src/main/resources/application.properties 也改下 #安裝java和maven #因為此專案中使用了nodejs,建議用下面方式加速 [root@ubuntu2204 dubbo-admin]#apt -y install npm #檢視預設下載地址 [root@ubuntu2204 dubbo-admin]#npm config get registry https://registry.npmjs.org/ #證書過期,不能使用https #[root@ubuntu2204 dubbo-admin]#npm config set registry https://registry.npm.taobao.org #修改國內加速地址 [root@ubuntu2204 dubbo-admin]#npm config set registry http://registry.npm.taobao.org #編譯需要5分鐘以上時間 [root@provider dubbo-admin]#mvn clean package -Dmaven.test.skip=true #執行 [root@provider dubbo-admin]#java -jar dubbo-admin-distribution/target/dubbo-admin-0.7.0-SNAPSHOT.jar #瀏覽器 10.0.0.152:38080 使用者名稱root 密碼root
5.1 Nacos 介紹和架構
5.1.1 Spring Cloud Alibaba
https://github.com/alibaba/spring-cloud-alibaba/blob/2022.x/README-zh.md
5.1.1.1 Spring Cloud Alibaba 介紹
https://developer.aliyun.com/article/983677
5.1.1.2 主要功能
1.服務限流降級:預設支援 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Dubbo 和 RocketMQ 限流降級功能的接入,
可以在執行時透過控制檯實時修改限流降級規則,還支援檢視限流降級 Metrics 監控。 2.服務註冊與發現:適配 Spring Cloud 服務註冊與發現標準,預設整合對應 Spring Cloud 版本所支援的負載均衡元件的適配。 3.分散式配置管理:支援分散式系統中的外部化配置,配置更改時自動重新整理。 4.訊息驅動能力:基於 Spring Cloud Stream 為微服務應用構建訊息驅動能力。 5.分散式事務:使用 @GlobalTransactional 註解, 高效並且對業務零侵入地解決分散式事務問題。 6.阿里雲物件儲存:阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。支援在任何應用、任何時間、任何地點儲存和訪問任意型別的資料。 7.分散式任務排程:提供秒級、精準、高可靠、高可用的定時(基於 Cron 表示式)任務排程服務。同時提供分散式的任務執行模型,如網格任務。
網格任務支援海量子任務均勻分配到所有 Worker(schedulerx-client)上執行。 8.阿里雲簡訊服務:覆蓋全球的簡訊服務,友好、高效、智慧的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
5.1.1.3 元件
1.Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。 2.Nacos:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。 3.RocketMQ:一款開源的分散式訊息系統,基於高可用分散式叢集技術,提供低延時的、高可靠的訊息釋出與訂閱服務。 4.Seata:阿里巴巴開源產品,一個易於使用的高效能微服務分散式事務解決方案。 5.Alibaba Cloud OSS: 阿里雲物件儲存服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。
您可以在任何應用、任何時間、任何地點儲存和訪問任意型別的資料。 6.Alibaba Cloud SchedulerX: 阿里中介軟體團隊開發的一款分散式任務排程產品,提供秒級、精準、高可靠、高可用的定時(基於 Cron 表示式)任務排程服務。 7.Alibaba Cloud SMS: 覆蓋全球的簡訊服務,友好、高效、智慧的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
5.1.1.8 Spring Cloud Alibaba 的微服務架構
5.1.2 Nacos 是什麼
Nacos 的核心功能 (核心功能就服務註冊發現 和 配置中心)
服務發現和服務健康監測
動態配置服務
動態 DNS 服務
服務及其後設資料管理
Nacos 架構
服務提供者分類 1.臨時例項: 服務提供者主動向nacos 傳送心跳監測,如果一段時間後,nacos無法收到心跳,則刪除此例項 2.非臨時例項: nacos 主動定時監測此類例項,如果提供者例項異常,則並不會刪除只是標記此例項異常,等待此例項恢復 服務消費者 1.消費者定時向nacos 註冊中心PULL拉取提供者資訊,並加以快取 2.如果提供者有變化,nacos會主動向消費者PUSH推送訊息通知,Eureka不支援主動PUSH 叢集模式 1.Nacos 預設使用 AP ( Availability和Partiton tolerance)模式,存在非臨時例項時,會採用CP(Consistency和Partiton tolerance)模式 2.Eureka 採用 AP( Availability和Partiton tolerance)模式 叢集資料一致性實現 1.CP模式基於 Raft 2.AP模式基於 阿里的Distro(基於Gossip和Eureka協議最佳化而來)最終一致性的AP 分散式協議
5.2 Nacos 部署
https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html #版本選擇 #當前推薦的穩定版本為2.X https://github.com/alibaba/nacos/releases #Nacos支援三種部署模式 1.單機模式 - 用於測試和單機試用 2.叢集模式 - 用於生產環境,確保高可用 3.多叢集模式 - 用於多資料中心場景(跨機房) #環境準備 1.安裝好 JDK,需要 1.8 及其以上版本 2.建議: 2核 CPU / 4G 記憶體 及其以上(2G也可以) 建議: 生產環境 3 個節點 及其以上
https://nacos.io/zh-cn/docs/quick-start.html
範例: 二進位制安裝
[root@ubuntu2204 ~]#apt update && apt -y install openjdk-11-jdk #或者 [root@ubuntu2204 ~]#apt update && apt -y install openjdk-8-jdk [root@ubuntu2204 ~]#wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz [root@ubuntu2204 ~]#tar xf nacos-server-2.2.3.tar.gz -C /usr/local/ [root@ubuntu2204 ~]#ls /usr/local/nacos/ bin conf data LICENSE logs NOTICE target #啟動,關閉指令碼 [root@ubuntu2204 ~]#ls /usr/local/nacos/bin/ shutdown.cmd shutdown.sh startup.cmd startup.sh [root@ubuntu2204 ~]#ls /usr/local/nacos/target/ nacos-server.jar [root@ubuntu2204 ~]#ls /usr/local/nacos/conf/ 1.4.0-ipv6_support-update.sql application.properties cluster.conf.example mysql-schema.sql announcement.conf application.properties.example derby-schema.sql nacos-logback.xml #修改配置,可選 [root@ubuntu2204 ~]#vi /usr/local/nacos/conf/application.properties #修改預設的訪問URL路徑 #server.servlet.contextPath=/nacos server.servlet.contextPath=/ #新增PATH變數中,可選 [root@ubuntu2204 ~]#echo 'PATH=/usr/local/nacos/bin:$PATH' >> /etc/profile [root@ubuntu2204 ~]#. /etc/profile
注:Nacos的執行建議至少在2C4G 60G的機器配置下執行。
5.2.2.3.1 啟動服務
#Linux/Unix/Mac #啟動命令(standalone代表著單機模式執行,非叢集模式): sh startup.sh -m standalone #如果您使用的是ubuntu系統,或者執行指令碼報錯提示[[符號找不到,可嘗試如下執行: bash startup.sh -m standalone #Windows #啟動命令(standalone代表著單機模式執行,非叢集模式): startup.cmd -m standalone 範例: #啟動 [root@ubuntu2204 ~]#/usr/local/nacos/bin/startup.sh -m standalone #檢視日誌 [root@ubuntu2204 ~]#tail -f /usr/local/nacos/logs/start.out #檢視埠 [root@ubuntu2204 ~]#ss -ntlp|grep java LISTEN 0 4096 *:7848 *:* users:(("java",pid=4336,fd=188)) LISTEN 0 100 *:8848 *:* users:(("java",pid=4336,fd=230)) LISTEN 0 4096 *:9848 *:* users:(("java",pid=4336,fd=185)) LISTEN 0 4096 *:9849 *:* users:(("java",pid=4336,fd=186)) #生成地址 http://10.0.0.151:8848/nacos/
5.2.2.3.2 關閉服務
#Linux/Unix/Mac sh shutdown.sh #Windows shutdown.cmd
5.2.2.4 服務註冊&發現和配置管理
#在nacos網頁檢視 http://10.0.0.151:8848/nacos/ #注意:啟用驗證後,將無法直接用下面的curl命令訪問 #服務註冊(實際生產用java程式碼實現,這裡用curl模擬) #模擬建立(建立出的是臨時例項,如果一段時間不發就會消失) curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.wang.serviceName&ip=1.2.3.4&port=8080' #可以發多個統一服務名不同ip地址,表示同一個服務有多個例項提供服務 #服務發現 curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.wang.serviceName' #配置是永久存在的(配置放在資料庫中) #釋出配置(也可以網頁點選建立配置) 不設定為預設配置,在public中 curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" #獲取配置 curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test" #網頁上的名稱空間 #可以測試環境建立一個,開發環境建立一個 設定完,配置管理裡,會出現對應的名稱空間,可以分別配置
5.2.2.6 單機模式支援 MySQL
[root@ubuntu ~]#apt update && apt -y install mysql-server [root@ubuntu2204 ~]#mysql mysql> create database nacos; mysql> create user nacos@'127.0.0.1' identified with mysql_native_password by '123456'; mysql> grant all on nacos.* to nacos@'127.0.0.1'; #把nacos的sql指令碼匯入到mysql中 [root@ubuntu ~]#mysql -unacos -p123456 -h127.0.0.1 nacos < /usr/local/nacos/conf/mysql-schema.sql [root@ubuntu ~]#vim /usr/local/nacos/conf/application.properties #*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: ### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced. # spring.datasource.platform=mysql # spring.sql.init.platform=mysql spring.sql.init.platform=mysql #加此行 ### Count of DB: # db.num=1 db.num=1 #加此行 ### Connect URL of DB: # db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC # db.user.0=nacos # db.password.0=nacos #加下面三行 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=nacos db.password.0=123456 #重啟nacos #透過bash startup.sh -m standalone裡顯示的日誌能看到use external storage
#10.0.0.151 安裝bind #另一臺機器修改dns地址,然後測試 10.0.0.155 [root@ubuntu ~]#ping nacos.wang.org #10.0.0.151機器 #安裝haproxy [root@ubuntu ~]#apt install haproxy -y #haproxy配置狀態頁,加入nacos訪問轉發 [root@ubuntu2204 ~]#vim /etc/haproxy/haproxy.cfg #新增下面行 listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth admin:123456 listen nacos bind 10.0.0.151:8848 server nacos1 10.0.0.152:8848 check server nacos2 10.0.0.153:8848 check server nacos3 10.0.0.154:8848 check [root@ubuntu ~]#systemctl reload haproxy.service
5.2.3.2.3 確定資料來源
#10.0.0.151 mysql修改配置,允許遠端nacos訪問 [root@ubuntu ~]#sed -i '/127.0.0.1/s/^/#/' /etc/mysql/mysql.conf.d/mysqld.cnf [root@ubuntu ~]#systemctl restart mysql [root@ubuntu ~]#mysql mysql> create user nacos@'10.0.0.%' identified with mysql_native_password by '123456'; mysql> grant all on nacos.* to nacos@'10.0.0.%'; #測試下,能不能連線 [root@ubuntu ~]#mysql -unacos -p123456 -h10.0.0.151 nacos
在nacos的解壓目錄nacos/的conf目錄下,有配置檔案cluster.conf,請每行配置成ip:port。
在所有叢集節點修改下面檔案
#3臺機器安裝nacos單機版 10.0.0.152 10.0.0.153 10.0.0.154 [root@ubuntu ~]#bash install_nacos_single_node.sh [root@ubuntu ~]#vim /usr/local/nacos/conf/cluster.conf # ip:port 10.0.0.152:8848 10.0.0.153:8848 10.0.0.154:8848 #如果不想使用mysql作為nacos資料庫,用內嵌資料庫,下面就不用配置 [root@ubuntu ~]#vi /usr/local/nacos/conf/application.properties #*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: ### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced. # spring.datasource.platform=mysql spring.sql.init.platform=mysql #取消註釋 ### Count of DB: db.num=1 #取消註釋 ### Connect URL of DB: #修改下面行 db.url.0=jdbc:mysql://10.0.0.151:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=nacos db.password.0=123456 #複製到兩外兩臺機器 [root@ubuntu ~]#scp /usr/local/nacos/conf/application.properties 10.0.0.153:/usr/local/nacos/conf/application.properties [root@ubuntu ~]#scp /usr/local/nacos/conf/application.properties 10.0.0.154:/usr/local/nacos/conf/application.properties [root@ubuntu ~]#scp /usr/local/nacos/conf/cluster.conf 10.0.0.153:/usr/local/nacos/conf/cluster.conf [root@ubuntu ~]#scp /usr/local/nacos/conf/cluster.conf 10.0.0.154:/usr/local/nacos/conf/cluster.conf #3個節點都啟動(不加單機版引數) [root@ubuntu ~]#/usr/local/nacos/bin/startup.sh #檢視日誌輸出 [root@ubuntu ~]#tail -f /usr/local/nacos/logs/start.out #進去nacos管理頁面(哪個節點都可以) http://10.0.0.152:8848/nacos #釋出配置(也可以網頁點選建立配置) 其他節點也能看到 curl -X POST "http://10.0.0.152:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" #模擬客戶端透過內部dns請求到haproxy curl -X POST "http://nacos.wang.org:8848/nacos/v1/cs/configs?dataId=wangdata&group=test&content=HelloWorld" #測試,關閉兩個節點,依然可以使用nacos #注意nacos並不是所有資料都寫到資料庫中,有些狀態寫入記憶體中,所以是需要搭叢集的
5.3.1 Nacos 專案服務註冊和發現
啟動java生產者,消費者,都會註冊在nacos,可以在nacos管理網頁服務列表上看到
消費者根據nacos提供的生產者地址去呼叫消費。
如果一個消費者,一個生產者。如果壞掉一個生產者,那麼消費者就無法呼叫
可以多個消費者,生產者,既能實現高可用,又能實現負載均衡,提升效能(服務列表,例項數變多個)
在nacos管理頁,名稱空間建立dev 配置管理裡,在dev中新建配置,選擇配置格式, 根據開發程式碼裡的專案名字寫Data ID(開發根據這個名字獲取配置),組名也要匹配 #如果nacos修改了配置,微服務要關了重開才會修改