1. 单体应用vs微服务
单体应用缺点:
1. 启动效率: 多个功能集成在一个包中, 服务启动慢, 很可能因为超时, 导致服务无法启动
2. 部署效率: 单体应用, 编译一个包, 耗时较长, 部署时间长
3. 协作开发: 开发效率低, 出现问题不好排错
微服务优点:
1. 每个小功能单独启动, 速度快
2. 每个小功能单独部署, 包的体积小, 编译部署效率高
3. 协作开发情况下, 方便进行问题排错
微服务要解决的问题:
微服务如何落地: 容器+k8s
服务器之间动态发现: 注册中心, 如Zookeeper
服务之间如何访问: 需要开发定义, 通常通过API
服务如何治理: 也就是快速扩容, k8s中可以快速横向扩容
监控: prometheus
服务部署: 镜像 --> 容器
CI/CD: Gitlab+Jenkins
容器日志收集和展示: ELK, EFK
微服务开发框架:
spring boot: 只能运行单个服务, 没有其他功能
spring cloud: 提供微服务整套功能, 包括服务注册和发现, 服务保护等
dubbo: 功能没有spring cloud多
2. Dubbo部署
架构:
图片.png部署环境:
Zookeeper
Zoo1 - 10.0.0.209
Zoo2 - 10.0.0.199
Zoo3 - 10.0.0.189
- 生产者部署
Dubbo生产者 10.0.0.169
apt -y install openjdk-8-jdk
root@producer:~# mkdir /apps
root@producer:~# tar xvf dubbo-demo-provider-2.1.5-assembly.tar.gz -C /apps
root@producer:~# cd /apps/dubbo-demo-provider-2.1.5/
root@producer:/apps/dubbo-demo-provider-2.1.5# vim conf/dubbo.properties
dubbo.registry.address=zookeeper://10.0.0.209:2181 | zookeeper://10.0.0.199:2181 | zookeeper://10.0.0.189:2181
root@producer:/apps/dubbo-demo-provider-2.1.5# ./bin/start.sh
Starting the demo-provider .....
如果启动后, 终端没有释放, 而是停在Starting the demo-provider...... 那么可以直接ctrl+c退出, 不会影响服务
root@producer:~# tail -f /apps/dubbo-demo-provider-2.1.5/logs/stdout.log
OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[2021-06-29 22:05:49] Dubbo service server started!
root@producer:/apps/dubbo-demo-provider-2.1.5# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 0.0.0.0:20880 0.0.0.0:*
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
图片.png
- 消费者部署
Dubbo消费者 10.0.0.179
apt -y install openjdk-8-jdk
root@consumer:~# cd /apps/dubbo-demo-consumer-2.1.5/
root@consumer:~# mkdir /apps
root@consumer:~# tar xvf dubbo-demo-consumer-2.1.5-assembly.tar.gz -C /apps
root@consumer:/apps/dubbo-demo-consumer-2.1.5# vim conf/dubbo.properties
dubbo.registry.address=zookeeper://10.0.0.209:2181 | zookeeper://10.0.0.199:2181 | zookeeper://10.0.0.189:2181
root@consumer:/apps/dubbo-demo-consumer-2.1.5# ./bin/start.sh
Starting the demo-consumer ....OK!
PID: 18236
STDOUT: logs/stdout.log
- 消息调用
消费者启动后, 生产者会立即产生调用日志. 消费者会从Zookeeper查询生产者信息
[22:15:12] Hello world0, request from consumer: /10.0.0.179:51214
[22:15:14] Hello world1, request from consumer: /10.0.0.179:51214
[22:15:16] Hello world2, request from consumer: /10.0.0.179:51214
[22:15:18] Hello world3, request from consumer: /10.0.0.179:51214
[22:15:20] Hello world4, request from consumer: /10.0.0.179:51214
[22:15:22] Hello world5, request from consumer: /10.0.0.179:51214
...
图片.png
- 再部署一个消费者, 测试多个消费者可以同时调用同一个生产者
Dubbo消费者部署 10.0.0.219
root@consumer-219:~# apt -y install openjdk-8-jdk
root@consumer-219:~# mkdir /apps
root@consumer-219:~# tar xvf dubbo-demo-consumer-2.1.5-assembly.tar.gz -C /apps
root@consumer-219:~# cd /apps/dubbo-demo-consumer-2.1.5/
root@consumer-219:/apps/dubbo-demo-consumer-2.1.5# vim conf/dubbo.properties
dubbo.registry.address=zookeeper://10.0.0.209:2181 | zookeeper://10.0.0.199:2181 | zookeeper://10.0.0.189:2181
root@consumer-219:/apps/dubbo-demo-consumer-2.1.5# ./bin/start.sh
Starting the demo-consumer ....OK!
PID: 7645
STDOUT: logs/stdout.log
此时看到来自两个consumer的调用
[22:27:54] Hello world380, request from consumer: /10.0.0.179:51214
[22:27:55] Hello world12, request from consumer: /10.0.0.219:38440
[22:27:56] Hello world381, request from consumer: /10.0.0.179:51214
[22:27:57] Hello world13, request from consumer: /10.0.0.219:38440
图片.png
- 如果是多个生产者, 那么每个生产者会被消费者轮训调用
3. dubbo admin
基于 zookeeper 发现并管理 provider 和 consumer。
dubbo admin部署 10.0.0.159
- 部署tomcat
#!/bin/bash
DIR=`pwd`
JDK_FILE="jdk-8u271-linux-x64.tar.gz"
TOMCAT_FILE="apache-tomcat-8.5.59.tar.gz"
JDK_DIR="/usr/local"
TOMCAT_DIR="/usr/local"
install_jdk(){
if ! [ -f "$DIR/$JDK_FILE" ]; then
echo "$JDK_FILE 文件不存在" false
exit;
elif [ -d $JDK_DIR/jdk ]; then
echo "JDK 已经安装" false
exit;
else
[ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE -C $JDK_DIR
cd $JDK_DIR && ln -s jdk1.8* jdk
cat > /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export JRE_HOME=\$JAVA_HOME/jre
export CLASSPATH=\$JAVA_HOME/lib/:\$JRE_HOME/lib
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
. /etc/profile.d/jdk.sh
java -version && echo "JDK 安装完成" || { echo "JDK 安装失败" false ; exit; }
}
install_tomcat(){
if ! [ -f "$DIR/$TOMCAT_FILE" ];then
echo "$TOMCAT_FILE 文件不存在" false
exit;
elif [ -d $TOMCAT_DIR/tomcat ];then
echo "TOMCAT 已经安装" false
exit;
else
[ -d "$TOMCAT_DIR" ] || mkdir -pv $TOMCAT_DIR
fi
tar xf $DIR/$TOMCAT_FILE -C $TOMCAT_DIR
cd $TOMCAT_DIR && ln -s apache-tomcat-* tomcat
echo "PATH=$TOMCAT_DIR/tomcat/bin:"'$PATH' > /etc/profile.d/tomcat.sh
id tomcat &> /dev/null || useradd -r -s /sbin/nologin tomcat
cat > $TOMCAT_DIR/tomcat/conf/tomcat.conf <<EOF
JAVA_HOME=$JDK_DIR/jdk
EOF
chown -R tomcat.tomcat ${TOMCAT_DIR}/tomcat/
cat > /lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=$TOMCAT_DIR/tomcat/conf/tomcat.conf
ExecStart=$TOMCAT_DIR/tomcat/bin/startup.sh
ExecStop=$TOMCAT_DIR/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now tomcat.service
systemctl is-active tomcat.service &> /dev/null && echo "TOMCAT 安装完成" || { echo "TOMCAT 安装失败" false; exit; }
}
install_jdk
install_tomcat
- 部署dubbo admin
root@dubbo-admin:/opt# ls
apache-tomcat-8.5.59.tar.gz dubboadmin.war install_tomcat_ubuntu.sh jdk-8u271-linux-x64.tar.gz
root@dubbo-admin:/opt# mv dubboadmin.war /usr/local/tomcat/webapps/
root@dubbo-admin:/opt# cd /usr/local/tomcat/webapps/
root@dubbo-admin:/usr/local/tomcat/webapps# ll
total 27160
drwxr-x--- 8 tomcat tomcat 4096 Jun 29 22:38 ./
drwxr-xr-x 9 tomcat tomcat 4096 Jun 29 22:36 ../
drwxr-x--- 15 tomcat tomcat 4096 Jun 29 22:36 docs/
drwxr-x--- 4 tomcat tomcat 4096 Jun 29 22:38 dubboadmin/
-rw-r--r-- 1 root root 27777984 Jun 29 21:57 dubboadmin.war
drwxr-x--- 6 tomcat tomcat 4096 Jun 29 22:36 examples/
drwxr-x--- 5 tomcat tomcat 4096 Jun 29 22:36 host-manager/
drwxr-x--- 6 tomcat tomcat 4096 Jun 29 22:36 manager/
drwxr-x--- 3 tomcat tomcat 4096 Jun 29 22:36 ROOT/
root@dubbo-admin:/usr/local/tomcat/webapps# rm -rf dubboadmin # 删除重复的目录
root@dubbo-admin:/usr/local/tomcat/webapps# unzip dubboadmin.war
root@dubbo-admin:/usr/local/tomcat/webapps# ll
total 27160
drwxr-x--- 8 tomcat tomcat 4096 Jun 29 22:57 ./
drwxr-xr-x 9 tomcat tomcat 4096 Jun 29 22:36 ../
drwxr-x--- 15 tomcat tomcat 4096 Jun 29 22:36 docs/
drwxr-x--- 9 tomcat tomcat 4096 Jun 29 22:57 dubboadmin/
-rw-r--r-- 1 root root 27777984 Jun 29 21:57 dubboadmin.war
drwxr-x--- 6 tomcat tomcat 4096 Jun 29 22:36 examples/
drwxr-x--- 5 tomcat tomcat 4096 Jun 29 22:36 host-manager/
drwxr-x--- 6 tomcat tomcat 4096 Jun 29 22:36 manager/
drwxr-x--- 3 tomcat tomcat 4096 Jun 29 22:36 ROOT/
root@dubbo-admin:/usr/local/tomcat/webapps# cd dubboadmin/
root@dubbo-admin:/usr/local/tomcat/webapps/dubboadmin# ll
total 44
drwxr-x--- 9 tomcat tomcat 4096 Jun 29 22:57 ./
drwxr-x--- 8 tomcat tomcat 4096 Jun 29 22:57 ../
-rw-r--r-- 1 root root 105 Jan 9 2020 crossdomain.xml
drwxr-xr-x 2 root root 4096 Jan 9 2020 css/
drwxr-x--- 8 tomcat tomcat 4096 Jun 29 22:57 dubboadmin/
-rw-r--r-- 1 root root 1406 Jan 9 2020 favicon.ico
drwxr-xr-x 2 root root 4096 Jan 9 2020 images/
drwxr-xr-x 2 root root 4096 Jan 9 2020 js/
drwxr-x--- 4 tomcat tomcat 4096 Jun 29 22:57 META-INF/
drwxr-xr-x 2 root root 4096 Jan 9 2020 SpryAssets/
drwxr-xr-x 8 root root 4096 Jan 9 2020 WEB-INF/
- 修改dubboadmin配置文件
root@dubbo-admin:/usr/local/tomcat/webapps/dubboadmin# cd WEB-INF/
root@dubbo-admin:/usr/local/tomcat/webapps/dubboadmin/WEB-INF# vim dubbo.properties
dubbo.registry.address=zookeeper://10.0.0.209:2181 # 写一个Zookeeper地址即可, 也可以加多个地址
dubbo.registry.address=zookeeper://10.0.0.209:2181 | zookeeper://10.0.0.199:2181 | zookeeper://10.0.0.189:2181
- 重启tomcat
root@dubbo-admin:/usr/local/tomcat/webapps/dubboadmin/WEB-INF# systemctl restart tomcat
图片.png
dubbo admin一般用于服务查看, 不会去修改, 一般都是开发人员去管理
4. 微服务编译示例
编译dubbo admin
4.1 代码克隆与编译
以 github 上 java 开源项目 dubbo-admin 为例
https://github.com/apache/dubbo-admin/
4.2 Maven部署准备
http://maven.apache.org/install.html
Maven 翻译为"专家"、"内行",是 Apache 基金会旗下的一个纯 Java 开发的开源项目,Maven 是一个项目管理工具,可以对 Java 项目进行构建、解决打包依赖等。
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等,在执行任务或目标时,Maven 会在当前目录中查找 pom 文件,通过读取 pom 文件获取所需的配置信息,然后执行目标。
Pom 文件中可以指定以下配置:
项目依赖
插件
执行目标
项目构建 profile
项目版本
项目开发者列表
相关邮件列表信息
java 环境:
Maven 是一个基于 Java 的工具所以服务器要安装 jdk 环境,版本要求如下:
Maven 3.3 要求 JDK 1.7 或以上
Maven 3.2 要求 JDK 1.6 或以上
Maven 3.0/3.1 要求 JDK 1.5 或以上
环境: 10.0.0.149
- 安装oracle-jdk
#!/bin/bash
DIR=`pwd`
JDK_FILE="jdk-8u271-linux-x64.tar.gz"
JDK_DIR="/usr/local"
install_jdk(){
if ! [ -f "$DIR/$JDK_FILE" ]; then
echo "$JDK_FILE 文件不存在" false
exit;
elif [ -d $JDK_DIR/jdk ]; then
echo "JDK 已经安装" false
exit;
else
[ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE -C $JDK_DIR
cd $JDK_DIR && ln -s jdk1.8* jdk
cat > /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export JRE_HOME=\$JAVA_HOME/jre
export CLASSPATH=\$JAVA_HOME/lib/:\$JRE_HOME/lib
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
. /etc/profile.d/jdk.sh
java -version && echo "JDK 安装完成" || { echo "JDK 安装失败" false ; exit; }
}
install_jdk
root@ubuntu-1804-149:/opt# ll
total 139800
drwxr-xr-x 2 root root 4096 Jun 29 23:14 ./
drwxr-xr-x 24 root root 4096 Jun 13 12:31 ../
-rw-r--r-- 1 root root 703 Jun 29 23:14 install_jdk.sh
-rw-r--r-- 1 root root 143142634 Oct 24 2020 jdk-8u271-linux-x64.tar.gz
root@ubuntu-1804-149:/opt# bash install_jdk.sh
root@ubuntu-1804-149:/opt# java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-0ubuntu1~18.04-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
- 部署Maven
root@ubuntu-1804-149:/opt# ls
apache-maven-3.6.3-bin.tar.gz install_jdk.sh jdk-8u271-linux-x64.tar.gz
root@ubuntu-1804-149:/opt# mkdir /apps
root@ubuntu-1804-149:/opt# tar xvf apache-maven-3.6.3-bin.tar.gz -C /apps
root@ubuntu-1804-149:/opt# cd /apps
root@ubuntu-1804-149:/apps# ll
total 12
drwxr-xr-x 3 root root 4096 Jun 29 23:34 ./
drwxr-xr-x 25 root root 4096 Jun 29 23:34 ../
drwxr-xr-x 6 root root 4096 Jun 29 23:34 apache-maven-3.6.3/
root@ubuntu-1804-149:/apps# ln -sv /apps/apache-maven-3.6.3/ /apps/maven
'/apps/maven' -> '/apps/apache-maven-3.6.3/'
root@ubuntu-1804-149:/apps# vim /etc/profile.d/maven.sh
PATH=/apps/maven/bin:$PATH
root@ubuntu-1804-149:/apps# source /etc/profile.d/maven.sh
root@ubuntu-1804-149:/apps# mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /apps/maven
Java version: 1.8.0_292, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-76-generic", arch: "amd64", family: "unix"
- 下载dubbo admin源码
root@ubuntu-1804-149:/opt# apt -y install git
root@ubuntu-1804-149:/opt# git clone https://github.com/apache/dubbo-admin.git
root@ubuntu-1804-149:/opt# ll
total 149088
drwxr-xr-x 3 root root 4096 Jun 29 23:39 ./
drwxr-xr-x 25 root root 4096 Jun 29 23:34 ../
-rw-r--r-- 1 root root 9506321 Jun 29 23:33 apache-maven-3.6.3-bin.tar.gz
drwxr-xr-x 12 root root 4096 Jun 29 23:43 dubbo-admin/
-rw-r--r-- 1 root root 703 Jun 29 23:14 install_jdk.sh
-rw-r--r-- 1 root root 143142634 Oct 24 2020 jdk-8u271-linux-x64.tar.gz
- 执行java代码编译
- 1.进入到包含有“pom.xml”的路径,执行:
mvn clean install package - 2.有的时候受到测试的干扰,导致无法正在进行编译,这时候可以选择跳过测试:
mvn clean install package -Dmaven.test.skip=true
" -Dmaven.test.skip=true":跳过测试,并且不编译测试下的源代码;
"-DskipTests":不执行测试,但是会进行测试代码的编译; - 3.如果需要编译的代码异常庞大,需要考虑对编译环境做一些处理,提成编译效率:
启动多线程编译:mvn -T 4 clean install package -Dmaven.test.skip=true
分配编译的 CPU 个数:mvn -T 2C clean install package -Dmaven.test.skip=true
启用多线程编译:mvn clean install package -Dmaven.test.skip=true -
Dmaven.compile.fork=true - 4.所有的 Maven 都是建立在 JVM 上的,所以进行编译的时候还需要考虑 JVM 参数优化:
如果是 windows 找到“maven/bin/mvn.cmd”,如果 linux 找到
“maven/bin/mvn”,配置参数是:“MAVEN_OPTS”
打开属性配置文件:vim /etc/profile
追加一个配置项:export MAVEN_OPTS="-Xmx6g -Xms6g"
使配置立即生效:source /etc/profile
- 修改MAVEN_OPTS环境变量
root@ubuntu-1804-149:/opt# vim /etc/profile.d/maven.sh
PATH=/apps/maven/bin:$PATH
export MAVEN_OPTS="-Xmx6g -Xms6g" # 6g代表使用6g内存
root@ubuntu-1804-149:/opt# source /etc/profile.d/maven.sh
- 安装npm, 优化node.js源
root@ubuntu-1804-149:/opt/dubbo-admin# apt -y install npm
root@ubuntu-1804-149:/opt/dubbo-admin# npm config set registry http://registry.npm.taobao.org/
- 执行源码编译
root@ubuntu-1804-149:/opt# cd dubbo-admin/
root@ubuntu-1804-149:/opt/dubbo-admin# git branch
* develop
root@ubuntu-1804-149:/opt/dubbo-admin# mvn clean install package -Dmaven.test.skip=true
编译期间, 如果遇到无法resolve的问题, 就多执行几次编译命令, 一般配置没问题, 内存资源够用就会成功
图片.png- 运行jar包
root@ubuntu-1804-149:/opt/dubbo-admin# cd dubbo-admin-distribution/
root@ubuntu-1804-149:/opt/dubbo-admin/dubbo-admin-distribution# ls
pom.xml README.md src target
root@ubuntu-1804-149:/opt/dubbo-admin/dubbo-admin-distribution# cd target/
root@ubuntu-1804-149:/opt/dubbo-admin/dubbo-admin-distribution/target# ll
total 54284
drwxr-xr-x 6 root root 4096 Jun 30 00:14 ./
drwxr-xr-x 4 root root 4096 Jun 30 00:14 ../
drwxr-xr-x 2 root root 4096 Jun 30 00:14 antrun/
drwxr-xr-x 3 root root 4096 Jun 30 00:14 classes/
-rw-r--r-- 1 root root 55544687 Jun 30 00:14 dubbo-admin-0.3.0-SNAPSHOT.jar
-rw-r--r-- 1 root root 10781 Jun 30 00:14 dubbo-admin-distribution-0.3.0-SNAPSHOT.jar
drwxr-xr-x 2 root root 4096 Jun 30 00:14 maven-archiver/
drwxr-xr-x 3 root root 4096 Jun 30 00:14 maven-shared-archive-resources/
-rw-r--r-- 1 root root 30 Jun 30 00:14 .plxarc
确保8080没被占用
root@ubuntu-1804-149:/opt/dubbo-admin/dubbo-admin-distribution/target# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
- 用Winrar打开dubbo admin配置文件, 编辑Zookeeper地址
- 这一步一定要在编译前执行, 如果编译后发现配置文件没有修改, 就只能使用jar包编辑工具, 打开jar包, 编写文件
把jar包传到Windows
root@ubuntu-1804-149:/opt/dubbo-admin/dubbo-admin-distribution/target# sz dubbo-admin-0.3.0-SNAPSHOT.jar
用Winrar打开jar包, 并将application-properties解压到Windows
图片.png
admin.registry.address=zookeeper://10.0.0.209:2181
admin.config-center=zookeeper://10.0.0.209:2181
admin.metadata-report.address=zookeeper://10.0.0.209:2181
修改后, 把文件传到jar包, 替换掉源文件
删除旧的文件, 上传新的jar包
root@ubuntu-1804-149:/opt/dubbo-admin/dubbo-admin-distribution/target# rm -rf dubbo-admin-0.3.0-SNAPSHOT.jar
图片.png
再次启动jar包
图片.png- 访问 http://10.0.0.149:8080
网友评论