美文网首页
6. 微服务和Dubbo

6. 微服务和Dubbo

作者: 随便写写咯 | 来源:发表于2021-06-30 00:43 被阅读0次

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
  1. 生产者部署
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
  1. 消费者部署
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
  1. 消息调用
消费者启动后, 生产者会立即产生调用日志. 消费者会从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
  1. 再部署一个消费者, 测试多个消费者可以同时调用同一个生产者
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
  1. 如果是多个生产者, 那么每个生产者会被消费者轮训调用

3. dubbo admin

基于 zookeeper 发现并管理 provider 和 consumer。

dubbo admin部署 10.0.0.159

  1. 部署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


  1. 部署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/

  1. 修改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
  1. 重启tomcat
root@dubbo-admin:/usr/local/tomcat/webapps/dubboadmin/WEB-INF# systemctl restart tomcat
  1. 访问 http://10.0.0.159:8080/dubboadmin/
图片.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

  1. 安装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)
  1. 部署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"
  1. 下载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
  1. 执行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
  1. 修改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
  1. 安装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/
  1. 执行源码编译
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
  1. 运行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                                        [::]:* 
  1. 用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
  1. 访问 http://10.0.0.149:8080
图片.png 图片.png

相关文章

网友评论

      本文标题:6. 微服务和Dubbo

      本文链接:https://www.haomeiwen.com/subject/thikultx.html