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