微服務02 Kafka訊息佇列, Dubbo, Springcloud微服務框架, Nacos

战斗小人發表於2024-10-14

3.6 Kafka 部署

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 單機部署

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

3.6.2.2 單機部署Kafka 指令碼

範例:一鍵安裝 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節點的主機名稱解析需要提前準備,否則會導致失敗

#修改每個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秒鐘

3.7 Kafka 讀寫資料

常見命令

kafka-topics.sh #訊息的管理命令
kafka-console-producer.sh   #生產者的模擬命令
kafka-console-consumer.sh   #消費者的模擬命令

3.7.1 建立 Topic

#建立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

注: kafka存放資料,其中後設資料放在zookeeper中。所以此時zookeeper有資料了

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

3.7.3 檢視 Topic 詳情

#新版命令(單機)
[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

3.7.4 生產 Topic

#傳送訊息命令格式: (叢集寫入 --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

3.7.5 消費 Topic

#接收訊息命令格式:
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
#其他不同組,或沒有組的也可以收到訊息

3.7.6 刪除 Topic

#注意:需要修改配置檔案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

3.7.7 訊息積壓

訊息積壓是指在訊息傳遞系統中,積累了大量未被處理或未被消費的訊息

透過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

3.8 Kafka 在 ZooKeeper 裡面的儲存結構 (瞭解)

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 基於Web的Kafka叢集監控系統 kafka-eagle

3.10.1 介紹

官網
http://www.kafka-eagle.org/

3.10.2 安裝

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埠

3.11 Kafka 監控

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
#看生產端,消費端輸出

4.2.7 新增額外的 Provider和consumer

#直接把編譯好的包複製過去
[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
#看生產端,消費端輸出(可以看到隨機一個生產端收到訊息)

4.3 實戰案例:編譯安裝 Dubbo的 Web 管理 Dubbo Admin (新版)

#單獨安裝
官網說明
https://github.com/apache/dubbo-admin
https://cn.dubbo.apache.org/zh-cn/download/

4.3.1 編譯 dubbo admin

注意: 記憶體建議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 Nacos

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 服務
服務及其後設資料管理

5.1.3 Nacos 基本架構及概念

Nacos 架構

5.1.5 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 部署

5.2.1 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 個節點 及其以上

5.2.2 Nacos 單機部署

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

5.2.2.3 啟動和關閉伺服器

注: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

5.2.3 Nacos 叢集部署

#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

5.2.3.2.4 配置叢集配置檔案

在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 Nacos 實戰案例

5.3.1 Nacos 專案服務註冊和發現

啟動java生產者,消費者,都會註冊在nacos,可以在nacos管理網頁服務列表上看到
消費者根據nacos提供的生產者地址去呼叫消費。
如果一個消費者,一個生產者。如果壞掉一個生產者,那麼消費者就無法呼叫
可以多個消費者,生產者,既能實現高可用,又能實現負載均衡,提升效能(服務列表,例項數變多個)

5.3.2 Nacos 專案服務註冊和配置管理

在nacos管理頁,名稱空間建立dev
配置管理裡,在dev中新建配置,選擇配置格式,
根據開發程式碼裡的專案名字寫Data ID(開發根據這個名字獲取配置),組名也要匹配

#如果nacos修改了配置,微服務要關了重開才會修改

相關文章