首页 > 其他分享 >微服务02 Kafka消息队列, Dubbo, Springcloud微服务框架, Nacos

微服务02 Kafka消息队列, Dubbo, Springcloud微服务框架, Nacos

时间:2024-10-14 19:24:04浏览次数:1  
标签:02 Dubbo 10.0 -- Springcloud local nacos kafka root

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修改了配置,微服务要关了重开才会修改

 

标签:02,Dubbo,10.0,--,Springcloud,local,nacos,kafka,root
From: https://www.cnblogs.com/ludingchao/p/18464820

相关文章

  • 微服务03 微服务sentinel, springcloudgateway
    6Sentinel6.1Sentinel介绍和工作机制6.1.1微服务流量治理组件介绍随着微服务的流行,服务和服务之间的调用导致服务的稳定性问题变得越来越重要。雪崩问题:微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,即雪崩。解决雪崩问题的常见方式有四种:1......
  • 2024.10.14 test
    B平面上有\(n\)个点以及\(k\)条未知的平行线,每个点都分属一条线,每条线都有至少\(2\)点。给出一种方案。\(n\le4e4,k\le50\)。每个点分属一条线的条件非常重要。考虑利用鸽巢原理。考虑取出\(k+1\)个没有两对点同斜率的点,那么,至少有两个点在一条线上,那么就可以确定斜......
  • 【2024潇湘夜雨】WIN10_Ent-G_22H2.19045.5011软件选装纯净特别版10.14
    【系统简介】=============================================================1.本次更新母盘来自WIN10_Ent-G_22H2.19045.5011.进桌面后稍等片刻,等待后续部分优化完成。2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能......
  • 题解:P9137 [THUPC 2023 初赛] 速战速决
    ProblemLink[THUPC2023初赛]速战速决题目描述题意清晰,不再过多赘述。Solution每张不同的卡是等效的。小\(J\)手上的卡牌只有\(2\)种情况:手上没有相同的牌和有相同的牌。情况\(1\):小\(J\)手上的牌等价于\(1\simn\)(但其实没用),令其手上的牌为\(b_1,b_2,\ldo......
  • [PA2021] Od deski do deski 题解
    好题好题,难者不会会者不难,我是前者。实际上加入就可以合法的数是很好计算的。考虑现在所有前缀合法串后的字符实际上都可以满足条件。容易想到根据是否合法设置状态。设\(f_{i,j}/g_{i,j}\)表示现在填第\(i\)个数,有\(j\)个填了就合法的数,现在的串合法/不合法。那么有转......
  • 题解:AT_joi2021ho_b 雪玉 (Snowball)
    ProblemLink[JOI2021Final]雪玉题目描述翻译很简洁,不作赘述。Solution对于相邻的两个雪球\(a_i\)和\(a_{i+1}\),两者夹着的区间中的雪要么是被\(a_i\)或\(a_{i+1}\)卷起,要么不可能被清理掉。那么思路非常简单了,对于每个区间,只有\(2\)种情况:区间左侧雪球的最......
  • 2024最详细的Java八股文合集!
    1、HashMap底层,插入,扩容  前置知识:  二叉树:每个节点至多只有两个子节点的树  搜索二叉树:满足当前节点的左子树上的节点不能大于当前节点,右子树上的节点不能小于当前节点的二叉树  红黑树:一种自平衡的搜索二叉树,能保证遍历,插入,删除的时间复杂度永远是O(logn)  红......
  • 2025秋招LLM大模型多模态面试题(十一)-- 大模型评测方法与工具
    目录引言大模型评测方法综述1.自动评测与人工评测2.大模型的Honest原则如何衡量大模型的水平1.任务分类......
  • 2025秋招NLP算法面试真题(二十二)-大模型参数高效微调技术总结与对比
    目录当前高效微调技术的简述BitFitPrefixTuningPromptTuningP-TuningP-Tuningv2AdapterTuningAdapterFusionAdapterDropLoRAAdaLoRA<......
  • 题解:AT_agc027_b [AGC027B] Garbage Collector
    ProblemLink[AGC027B]GarbageCollector题意原题翻译已经很不错了,这里不再赘述。思路推论:每次取的垃圾数量应尽可能均分。证明如图,假设有\(4\)个垃圾需要被捡起,有两种取法:取一号垃圾+取二三四号垃圾。取一二号垃圾+取二三号垃圾。前者所需能量为:\(\display......