“微服务架构期末作业解决方案”
微服务
前言
| 本教程适用于centos7,centos7安装教程及网络配置参照[linux-虚拟机安装centos及网络配置 - Xavier的博客 | Xavier Blog (830sir.top)](https://blog.830sir.top/2023/12/09/虚拟机安装centos及网络配置/) |
本教程涉及到的安装包、docker镜像、系统镜像:https://www.123pan.com/s/gIBcVv-JzyN3.html提取码:WD3G
2024年6月6日 起 Docker国内镜像源失效
实验环境
| 操作系统 | ip | 主机名 | 作用 |
|---|---|---|---|
| centos7 | 192.168.171.21 | yms1 | 运行docker、docker-compose、jenkins |
| centos7 | 192.168.171.22 | yms2 | git服务器 |
软件版本
| 软件 | 版本 |
|---|---|
| JDK | 17 |
| mvn | 3.8.6 |
| Docker | 26.1.4 |
| Docker-compose | 2.27.1 |
一、准备虚拟机


二、安装JDK(yms1)
1、将安装包上传至/opt目录下
1
cd /opt

2、编辑运行JDK安装脚本
1
vi java.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#复制下面shell脚本到java.sh中
#!/bin/bash
# -------------------------------------------------
# Script Name: java.sh
# Author: Xavier
# Date: 2024-03-12
# -------------------------------------------------
# 检查用户是否为root
if [ "$(id -u)" != "0" ]; then
echo "脚本运行中需要root权限,请提权后重试" 1>&2
return 1
fi
clear
echo -e "\033[31m __ __ _ \033[0m"
echo -e "\033[31m \ \ / /_ _ _ __ __ _ ___(_)_ __ \033[0m"
echo -e "\033[31m \ V / _\` | '_ \ / _\` | / __| | '__|\033[0m"
echo -e "\033[31m | | (_| | | | | (_| | \__ \ | | \033[0m"
echo -e "\033[31m |_|\__,_|_| |_|\__, | |___/_|_| \033[0m"
echo -e "\033[31m |___/ \033[0m"
sleep 2
#检测/opt目录下是否有jdk的安装包
jdk_files=$(find /opt -maxdepth 1 -name "*jdk*.tar.gz")
# 检查变量是否为空
if [ -z "$jdk_files" ]; then
echo "未发现.tar.gz格式的jdk安装包,请将安装包放在/opt目录下再次运行脚本"
return 1
fi
echo "环境检查完毕"
echo "正在安装jdk..."
# 查找已安装的Java包
installed_java_pkgs=$(rpm -qa | grep -E '^java-|^jdk-')
# 如果没有找到Java包,则跳过删除步骤
if [ -z "$installed_java_pkgs" ]; then
echo "没有发现已安装的Java包"
else
# 逐个删除Java包
for pkg in $installed_java_pkgs; do
rpm -e --nodeps "$pkg"
done
fi
tar -zxvf /opt/jdk-17.0.10_linux-x64_bin.tar.gz -C /usr/local/ >&/dev/null
ln -s /usr/local/jdk-17.0.10 /usr/local/jdk
setenforce 0
iptables -F
systemctl stop firewalld
systemctl disable firewalld >&/dev/null
systemctl stop NetworkManager
systemctl disable NetworkManager >&/dev/null
touch /opt/temp.txt
echo 'JAVA_HOME=/usr/local/jdk' >>/opt/temp.txt
echo 'PATH=$JAVA_HOME/bin:$PATH' >>/opt/temp.txt
echo 'CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar' >>/opt/temp.txt
echo 'export PATH JAVA_HOME CLASSPATH' >>/opt/temp.txt
sed -i -e '$r /opt/temp.txt' /etc/profile
rm -f /opt/temp.txt
source /etc/profile #重载环境变量
echo "jdk安装完成"
1
source java.sh

三、安装MVN(yms1)
1、上传maven至/opt
2、解压
1
2
3
tar -zxvf apache-maven-3.8.6-bin.tar.gz
mv apache-maven-3.8.6 maven
3、编辑环境变量
1
2
3
echo 'MAVEN_HOME=/opt/maven' | sudo tee -a /etc/profile
echo 'export PATH=${MAVEN_HOME}/bin:${PATH}' | sudo tee -a /etc/profile
source /etc/profile
4、验证安装结果
1
2
3
4
5
6
[root@yms1 opt]# mvn -version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /opt/maven
Java version: 17.0.10, vendor: Oracle Corporation, runtime: /usr/local/jdk-17.0.10
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.108.1.el7.x86_64", arch: "amd64", family: "unix"

四、安装docker(两台都需要)
| Docker安装请参照(因为国内镜像源关闭,所以不用设置ustc的镜像,省略2.2):[linux软件-docker - Xavier的博客 | Xavier Blog (830sir.top)](https://blog.830sir.top/2024/02/17/linux软件-docker/) |

五、安装docker-compose(yms1)
1、将docker-compose包上传至/opt目录下
2、修改权限
1
2
3
mv docker-compose-linux-x86_64 docker-compose
chmod +x /opt/docker-compose
mv /opt/docker-compose /usr/bin/docker-compose
3、验证安装结果
1
2
[root@yms1 opt]# docker-compose -v
Docker Compose version v2.27.1

六、docker中搭建私有仓库并上传JAVA:8-jre镜像
1、上传registry.tar至/opt目录下
1
2
3
4
5
6
7
[root@yms1 opt]# ll
总用量 212080
-rw-r--r--. 1 root root 8676320 6月 21 22:15 apache-maven-3.8.6-bin.tar.gz
-rw-r--r--. 1 root root 2117 6月 21 22:00 java.sh
-rw-r--r--. 1 root root 182487685 6月 21 20:10 jdk-17.0.10_linux-x64_bin.tar.gz
drwxr-xr-x. 6 root root 99 6月 21 22:17 maven
-rw-r--r--. 1 root root 25994752 6月 21 22:45 registry.tar
2、开启docker服务
1
systemctl start docker
3、导入镜像
1
2
3
4
5
6
7
[root@yms1 opt]# docker load -i /opt/registry.tar
aedc3bda2944: Loading layer [==================================================>] 7.63MB/7.63MB
7908a7c94e63: Loading layer [==================================================>] 792.6kB/792.6kB
b2533b493853: Loading layer [==================================================>] 17.55MB/17.55MB
8135430299ba: Loading layer [==================================================>] 3.584kB/3.584kB
e8d8a60f42b5: Loading layer [==================================================>] 2.048kB/2.048kB
Loaded image: registry:latest
4、启动私有仓库容器
1
docker run -di --name=registry -p 5000:5000 registry
5、打开浏览器验证
输入地址http://192.168.171.21:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空

6、修改daemon.json
1
vi /etc/docker/daemon.json
添加以下内容,保存退出。(注意替换IP)
1
{"insecure-registries":["192.168.171.21:5000"]}
此步用于让 docker信任私有仓库地址
7、重启docker 服务
1
systemctl restart docker
8、上传java.tar至/opt目录下,导入镜像
1
docker load -i /opt/java.tar
1
2
3
4
5
6
7
8
9
[root@yms1 opt]# docker load -i /opt/java.tar
9c742cd6c7a5: Loading layer [==================================================>] 129.2MB/129.2MB
03127cdb479b: Loading layer [==================================================>] 11.3MB/11.3MB
293d5db30c9f: Loading layer [==================================================>] 19.31MB/19.31MB
9b55156abf26: Loading layer [==================================================>] 156.5MB/156.5MB
b626401ef603: Loading layer [==================================================>] 11.74MB/11.74MB
53a0b163e995: Loading layer [==================================================>] 3.584kB/3.584kB
6b5aaff44254: Loading layer [==================================================>] 209.8MB/209.8MB
Loaded image: 192.168.222.100:5000/java:8-jre
9、标记此镜像为私有仓库的镜像(替换第二个IP成自己的IP)
1
docker tag 192.168.222.100:5000/java:8-jre 192.168.171.21:5000/java:8-jre
1
2
3
4
5
[root@yms1 opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest d6b2c32a0f14 8 months ago 25.4MB
192.168.171.21:5000/java 8-jre b273004037cc 22 months ago 526MB
192.168.222.100:5000/java 8-jre b273004037cc 22 months ago 526MB
10、再次启动私服容器
1
docker start registry
11、上传标记的镜像(注意镜像名)
1
docker push 192.168.171.21:5000/java:8-jre
1
2
3
4
5
6
7
8
9
10
[root@yms1 opt]# docker push 192.168.171.21:5000/java:8-jre
The push refers to repository [192.168.171.21:5000/java]
6b5aaff44254: Pushed
53a0b163e995: Pushed
b626401ef603: Pushed
9b55156abf26: Pushed
293d5db30c9f: Pushed
03127cdb479b: Pushed
9c742cd6c7a5: Pushed
8-jre: digest: sha256:3af2ac94130765b73fc8f1b42ffc04f77996ed8210c297fcfa28ca880ff0a217 size: 1795
12、浏览器验证

七、准备代码和镜像
1、修改配置文件
四个配置文件中的ip全都替换成自己的IP,四个pom文件的私有仓库地址更改为自己的

2、添加Dockerfile文件(注意替换IP,注意文件位置)

1
2
3
4
5
6
7
FROM 192.168.171.21:5000/java:8-jre
MAINTAINER yms <yangmaos@qq.com>
ADD ./target/microservice-eureka-server-0.0.1-SNAPSHOT.jar /app/microservice-eureka-service.jar
CMD ["java", "-Xmx200m", "-jar", "/app/microservice-eureka-service.jar"]
EXPOSE 8761
1
2
3
4
5
6
7
FROM 192.168.171.21:5000/java:8-jre
MAINTAINER yms <123456@qq.com>
ADD ./target/microservice-gateway-zuul-0.0.1-SNAPSHOT.jar /app/microservice-gateway-zuul.jar
CMD ["java", "-Xmx200m", "-jar", "/app/microservice-gateway-zuul.jar"]
EXPOSE 8050
1
2
3
4
5
6
7
FROM 192.168.171.21:5000/java:8-jre
MAINTAINER yms <123456@qq.com>
ADD ./target/microservice-orderservice-0.0.1-SNAPSHOT.jar /app/microservice-orderservice.jar
CMD ["java", "-Xmx200m", "-jar", "/app/microservice-orderservice.jar"]
EXPOSE 7900
1
2
3
4
5
6
7
FROM 192.168.171.21:5000/java:8-jre
MAINTAINER yms <123456@qq.com>
ADD ./target/microservice-userservice-0.0.1-SNAPSHOT.jar \
/app/microservice-userservice.jar
CMD ["java", "-Xmx200m", "-jar", "/app/microservice-userservice.jar"]
EXPOSE 8030
3、添加docker-compose.xml(注意替换ip和数据库密码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
version: "3"
services:
mysql:
image: mysql:5.6
restart: on-failure
ports:
- 3306:3306
volumes:
- microservice-mysql:/var/lib/mysql
networks:
- microservice-net
environment:
MYSQL_ROOT_PASSWORD: 215830 #改成刚才配置文件里填的,不然连不上数据库
MYSQL_DATABASE: microservice_mallmanagement
eureka-server:
image: 192.168.171.21:5000/microservice-eureka-server:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8761:8761
networks:
- microservice-net
gateway-zuul:
image: 192.168.171.21:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8050:8050
networks:
- microservice-net
depends_on:
- eureka-server
order-service:
image: 192.168.171.21:5000/microservice-orderservice:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 7900:7900
networks:
- microservice-net
depends_on:
- mysql
- eureka-server
user-service:
image: 192.168.171.21:5000/microservice-userservice:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8030:8030
networks:
- microservice-net
depends_on:
- mysql
- eureka-server
networks:
microservice-net:
volumes:
microservice-mysql:
4、打压缩包上传至虚拟机
1
2
3
mkdir /wfw
cd /wfw
上传至/wfw
1
2
3
[root@yms1 wfw]# ll
总用量 123424
-rw-r--r--. 1 root root 126382165 6月 21 23:20 wfw.zip
解压
如果没有unzip,先下载
1
yum -y install unzip
1
unzip wfw.zip
5、使用mvn工具构建镜像
1
2
3
4
[root@yms1 wfw]# ll
总用量 123428
drwxr-xr-x. 11 root root 4096 6月 21 23:16 Mymallmanagement
-rw-r--r--. 1 root root 126382165 6月 21 23:20 wfw.zip
1
cd Mymallmanagement
构建
1
mvn install
静静等待。。。

构建完成
验证


八、使用docker-compose工具启动项目
1、上传mysql镜像至/opt目录下
导入mysql镜像
1
docker load -i /opt/mysql.tar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@yms1 ~]# cd /opt/
[root@yms1 opt]# docker load -i /opt/mysql.tar
2b83e5699838: Loading layer [==================================================>] 58.51MB/58.51MB
2e1029557391: Loading layer [==================================================>] 338.4kB/338.4kB
d414fdead0b9: Loading layer [==================================================>] 10.46MB/10.46MB
4085e588967d: Loading layer [==================================================>] 4.176MB/4.176MB
7ea96a4e341b: Loading layer [==================================================>] 2.048kB/2.048kB
e3dce1c82d4e: Loading layer [==================================================>] 41.4MB/41.4MB
2612088e90f6: Loading layer [==================================================>] 26.11kB/26.11kB
eba393347f89: Loading layer [==================================================>] 3.584kB/3.584kB
7c5a5c1986b1: Loading layer [==================================================>] 192.7MB/192.7MB
49a1ca1cd2b8: Loading layer [==================================================>] 17.92kB/17.92kB
7137327a7221: Loading layer [==================================================>] 1.536kB/1.536kB
Loaded image: mysql:5.6
2、使用docker-compose启动项目
回到项目目录
1
cd /wfw/Mymallmanagement
1
docker-compose up -d

3、查看容器
启动成功

4、浏览器访问
启动成功

接下来进行搭建gogs+jenkins实现自动化部署
一、删除mvn构建的镜像和docker-compose启动的容器
1、删除容器
1
docker stop $(docker ps -aq)
1
docker rm $(docker ps -aq)
2、删除镜像(别删多了)
1
2
3
4
5
6
7
8
9
10
[root@yms1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.171.21:5000/microservice-userservice 0.0.1-SNAPSHOT a6d1c347596d 14 hours ago 569MB
192.168.171.21:5000/microservice-orderservice 0.0.1-SNAPSHOT 79b0e305efec 14 hours ago 570MB
192.168.171.21:5000/microservice-gateway-zuul 0.0.1-SNAPSHOT ce161d59eb84 14 hours ago 565MB
192.168.171.21:5000/microservice-eureka-server 0.0.1-SNAPSHOT 0796ea3afa07 14 hours ago 566MB
registry latest d6b2c32a0f14 8 months ago 25.4MB
192.168.171.21:5000/java 8-jre b273004037cc 23 months ago 526MB
192.168.222.100:5000/java 8-jre b273004037cc 23 months ago 526MB
mysql 5.6 dd3b2a5dcb48 2 years ago 303MB
1
2
#删除命令
docker rmi [IMAGE ID]
1
2
3
4
5
6
7
#剩下以下镜像
[root@yms1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest d6b2c32a0f14 8 months ago 25.4MB
192.168.171.21:5000/java 8-jre b273004037cc 23 months ago 526MB
192.168.222.100:5000/java 8-jre b273004037cc 23 months ago 526MB
mysql 5.6 dd3b2a5dcb48 2 years ago 303MB
3、重新启动私有仓库容器并上传java:jre-8
1
docker run -di --name=registry -p 5000:5000 registry
1
docker push 192.168.171.21:5000/java:8-jre #注意替换IP
二、搭建git服务器(yms2)
以为大多数同学访问不到GitHub,这里使用Gogs私有化部署替代GitHub
1、在第二台机器上上传gogs
上传至/opt目录下
1
2
3
4
[root@yms2 opt]# ll
总用量 98068
drwx--x--x. 4 root root 28 6月 22 13:28 containerd
-rw-r--r--. 1 root root 100420608 6月 22 13:52 gogs.tar
2、导入镜像
1
2
3
4
5
6
7
8
9
[root@yms2 opt]# docker load -i /opt/gogs.tar
f4111324080c: Loading layer [==================================================>] 7.35MB/7.35MB
f07033ba396b: Loading layer [==================================================>] 25.7MB/25.7MB
130e071c9d92: Loading layer [==================================================>] 2.56kB/2.56kB
66f61b79df21: Loading layer [==================================================>] 2.048kB/2.048kB
fe74d5fb5c7d: Loading layer [==================================================>] 39.94kB/39.94kB
0b870346258a: Loading layer [==================================================>] 64.99MB/64.99MB
8954213ede8a: Loading layer [==================================================>] 2.307MB/2.307MB
Loaded image: gogs/gogs:latest
3、启动容器
1
2
# 创建并运行一个容器,将宿主机的10022端口映射到容器的22端口,将宿主机的13000端口映射到容器的3000端口,10022端口和13000端口可以根据自己的情况修改
docker run -d -p 10022:22 -p 13000:3000 -v /var/gogs:/data gogs/gogs
4、浏览器访问ip:13000,进行初始化设置,比如我这里是http://192.168.171.22:13000
a.gogs目前支持3种数据库:MySQL、PostgreSQL、SQLite3,如果没有可用的数据库,可以选择SQLite3,如果想安装Mysql,请参照linux软件-mysql8.0 - Xavier的博客 | Xavier Blog (830sir.top)

这里使用SQLite3做演示

b、应用基本设置

c、管理员账号设置

d、立即安装

5、创建仓库上传代码


打开代码文件夹初始化本地仓库并上传代码(windows上没安装Git的,请自行百度。。)
在该文件夹下打开git命令行


依次执行以下命令(注意仓库地址)
1
2
3
4
5
git init
git add . #注意有个点
git commit -m "first commit"
git remote add origin http://192.168.171.22:13000/root/Mymallmanagement.git #注意替换ip
git push -u origin master

第一次提交代码可能需要验证密码,账号密码就是刚才创建的管理员账号密码

刷新浏览器

上传成功
三、搭建jenkins(yms1)
1、上传war包至/opt/jenkins目录下
1
2
mkdir /opt/jenkins
cd /opt/jenkins
1
2
3
[root@yms1 jenkins]# ll
总用量 91216
-rw-r--r--. 1 root root 93404074 6月 22 14:41 jenkins.war
1
chmod +x /opt/jenkins/jenkins.war
2、启动jenkins
下载字体库
1
2
3
yum install dejavu-sans-fonts
yum install fontconfig
fc-cache --force
1
java -jar /opt/jenkins/jenkins.war --httpPort=9090

3、浏览器访问
http://192.168.171.21:9090/



点击安装

点击保存并完成

点击现在不要
安装插件


将原有地址https://updates.jenkins.io/update-center.json替换为清华源https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
安装maven插件


继续下载Git插件

配置Java环境和Mvn环境



4、创建工程





1
docker-compose up -d
保存退出
5、构建项目

查看控制台输出



构建完成
6、访问验证

至此,gogs+jenkins实现自动化部署已实现
常见问题
jenkins初始化时,报错 提示字体问题的解决方法
安装字体库
1
2
3
yum install dejavu-sans-fonts
yum install fontconfig
fc-cache --force
jenkins初始化后,如何重新初始化?
jenkins在初始化之后,会在家目录下生成一个.jenkins的隐藏文件
1
2
3
cd
ls -a
rm -rf .jenkins
删除这个文件之后,即可再次构建。