企业级微服务大项目实战《学成在线》【一】(项目环境搭建)

企业级微服务大项目实战《学成在线》【一】(项目环境搭建)
何平安!!!图片已过期,移步老博客:企业级微服务大项目实战《学成在线》【一】(项目环境搭建) - 何平安 - 博客园!!!
项目架构
先来看看项目架构图:
我们主要搞的就是微服务层和数据层。
而这个项目比较大,框架就分成了三个端:
环境搭建
在开发这个项目前,你需要了解java,ssm,.springboot,springcloud,springcloudAlibaba,nacos,mysql,虚拟机,docker,SSH通信,ngnix,redis,rabbitMQ,CentOS,操作系统,git,gogs…以及最重要的耐心。
ssh科普:【科普】SSH都不懂,还搞什么网络 - 知乎 (zhihu.com)
操作系统了解速通:计算机操作系统知识点总结(有这一篇就够了!!!)-CSDN博客
先安装好黑马的虚拟机,就是那个有8个G的文件,解压后双击cenos7 64位.vmx的文件:
选择用VMware打开,进去后选择复制,配置虚拟机ip:VMware中进入编辑->虚拟网络编译器->修改子网ip为192.168.101.0:
登录的账号/密码:root/centos,登录后打开终端输入systemctl start docker(启动docker)和sh /data/soft/restart.sh(运行)
,再查询docker容器:docker ps,如果出现下面的画面就成功了:
对了这个软件叫FinalShell,网上有教程直接搜。
剩下的就是版本控制了,黑马选用的是gogs,不怎么熟悉,我还是用的gitee。
手动部署虚拟机或服务器
对于电脑配置低内存不够的我来说买个云服务器自己搭建环境代替虚拟机就是个不错的选择~
\1. 安装Docker 18.09.0的详细步骤
步骤1:安装依赖库
-—–
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
-—–
步骤2:添加Docker源
-—–
sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
推荐下面的阿里云加速镜像
sudo yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-—–
步骤3:安装Docker
-—–
sudo yum install docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
-—–
步骤4:启动Docker
-—–
sudo systemctl start docker
-—–
步骤5:设置Docker开机自启
-—–
sudo systemctl enable docker
-—–
\2. 在Docker中安装MySQL 8.0.26
步骤1:拉取MySQL 8的镜像文件
-—–
docker pull mysql:8.0.26
-—–
步骤2:使用Docker创建MySQL容器,创建MySQL数据存储目录并挂载到容器中
-—–
mkdir -p /data/mysql
-—–
docker run -p 3306:3306 –name mysql -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.26
-—–
说明:
参数-p 3306:3306
表示将Docker容器的3306端口映射到宿主机的3306端口。参数--name mysql
表示给容器起个名字叫mysql,方便管理。
参数-v /data/mysql:/var/lib/mysql
表示将宿主机的/data/mysql目录挂载到容器的/var/lib/mysql目录上,这样可以实现数据持久化。
参数-e MYSQL_ROOT_PASSWORD=root
表示设置MySQL的root用户的密码为root。
步骤3:进入MySQL容器执行相关操作
-—–
docker exec -it mysql bash
说明:进入容器后可以在容器内使用MySQL客户端来操作MySQL数据库。
-—–
mysql -u root -p回车
-—–
输入你的密码(我的密码是:root)
-—–
exit
说明:退出mysql窗口
-—–
exit
说明:退出mysql容器
-—–
\3. 在Docker中安装Nacos 1.4.1
步骤1:拉取Nacos 1.4.1的镜像文件
-—–
docker pull nacos/nacos-server:1.4.1
-—–
步骤2:使用Docker创建Nacos容器,在宿主机上创建Nacos数据存储目录并挂载到容器中
-—–
mkdir /data/nacos
-—–
docker run -p 8848:8848 –name nacos -v /data/nacos:/home/nacos/nacos-server-1.4.1/nacos-logs -d nacos/nacos-server:1.4.1
-—–
说明:
参数-p 8848:8848
表示将Docker容器的8848端口映射到宿主机的8848端口。
参数--name nacos
表示给容器起个名字叫nacos,方便管理。
参数-v /data/nacos:/home/nacos/nacos-server-1.4.1/nacos-logs
表示将宿主机的/data/nacos目录挂载到容器的/home/nacos/nacos-server-1.4.1/nacos-logs目录上,这样可以实现数据持久化。
步骤3:设置Nacos开机自启
-—–
docker update –restart=always nacos
-—–
\4. 在Docker中安装RabbitMQ 3.8.34
步骤1:拉取RabbitMQ 3.8.34的镜像文件
-—–
docker pull rabbitmq:3.8.34-management
-—–
步骤2:使用Docker创建RabbitMQ容器
-—–
mkdir /data/rabbitmq
-—–
docker run -p 15672:15672 -p 5672:5672 –name rabbitmq -v /data/rabbitmq:/var/lib/rabbitmq -d rabbitmq:3.8.34-management
-—–
说明:
参数-p 15672:15672 -p 5672:5672
表示将Docker容器的15672和5672端口映射到宿主机的15672和5672端口。
参数--name rabbitmq
表示给容器起个名字叫rabbitmq,方便管理。
参数-v /data/rabbitmq:/var/lib/rabbitmq
表示将宿主机的/data/rabbitmq目录挂载到容器的/var/lib/rabbitmq目录上,这样可以实现数据持久化。
说明:
步骤3:设置RabbitMQ开机自启
-—–
docker update –restart=always rabbitmq
-—–
\5. 在Docker中安装Redis 6.2.7
步骤1:拉取Redis 6.2.7的镜像文件
-—–
docker pull redis:6.2.7
-—–
步骤2:使用Docker创建Redis容器;在宿主机上创建Redis数据存储目录并挂载到容器中
-—–
mkdir /data/redis
-—–
docker run -p 6379:6379 –name redis -v /data/redis:/data -d redis:6.2.7 redis-server –appendonly yes
-—–
说明:
参数-p 6379:6379
表示将Docker容器的6379端口映射到宿主机的6379端口。
参数--name redis
表示给容器起个名字叫redis,方便管理。
参数-v /data/redis:/data
表示将宿主机的/data/redis目录挂载到容器的/data目录上,这样可以实现数据持久化。
参数redis-server --appendonly yes
表示开启Redis的数据持久化功能。
步骤3:设置Redis开机自启
-—–
docker update –restart=always redis
-—–
\7. 在Docker中安装Minio RELEASE.2022-09-07
步骤1:拉取Minio RELEASE.2022-09-07的镜像文件
-—–
docker pull minio/minio
-—–
步骤2:使用Docker创建Minio容器;在宿主机上创建Minio数据存储目录并挂载到容器中
-—–
mkdir /data/minio
docker run -p 9000:9000 –name minio -v /data/minio:/data -d minio/minio server /data
-—–
说明:参数-p 9000:9000
表示将Docker容器的9000端口映射到宿主机的9000端口。参数--name minio
表示给容器起个名字叫minio,方便管理。参数server /data
表示在/data目录下启动Minio服务。参数-v /data/minio:/data
表示将宿主机的/data/minio目录挂载到容器的/data目录上,这样可以实现数据持久化。
步骤3:设置Minio开机自启
-—–
docker update –restart=always minio
-—–
\8. 在Docker中安装Elasticsearch 7.12.1
步骤1:拉取Elasticsearch 7.12.1的镜像文件
-—–
docker pull elasticsearch:7.12.1
-—–
步骤2:使用Docker创建Elasticsearch容器;在宿主机上创建Elasticsearch数据存储目录并挂载到容器中
-—–
mkdir /data/elasticsearch
-—–
docker run -p 9200:9200 -p 9300:9300 –name elasticsearch -v /data/elasticsearch:/usr/share/elasticsearch/data -e “discovery.type=single-node” -d elasticsearch:7.12.1
-—–
说明:
参数-p 9200:9200 -p 9300:9300
表示将Docker容器的9200和9300端口映射到宿主机的9200和9300端口。
参数--name elasticsearch
表示给容器起个名字叫elasticsearch,方便管理。
参数-e "discovery.type=single-node"
表示设置Elasticsearch为单节点模式。
参数-v /data/elasticsearch:/usr/share/elasticsearch/data
表示将宿主机的/data/elasticsearch目录挂载到容器的/usr/share/elasticsearch/data目录上,这样可以实现数据持久化。
步骤4:设置Elasticsearch开机自启
-—–
docker update –restart=always elasticsearch
-—–
\9. 在Docker中安装Kibana 7.12.1
步骤1:拉取Kibana 7.12.1的镜像文件
-—–
docker pull kibana:7.12.1
-—–
步骤2:使用Docker创建Kibana容器
-—–
docker run -p 5601:5601 –name kibana -d kibana:7.12.1
-—–
说明:参数-p 5601:5601
表示将Docker容器的5601端口映射到宿主机的5601端口。参数--name kibana
表示给容器起个名字叫kibana,方便管理。
步骤3:设置Kibana开机自启
-—–
docker update –restart=always kibana
-—–
10.在Docker中安装nginx 1.12.2的步骤如下:
步骤1. 拉取nginx:1.12.2的镜像文件;创建一个数据存储目录,比如/data/nginx
docker pull nginx:1.12.2
-—–
mkdir /data/nginx/conf
-—–
mkdir /data/nginx/logs
-—–
mkdir /data/nginx/html
-—–
步骤2. 启动一个nginx 1.12.2的容器并将数据存储目录挂载到容器内部的/data目录中
docker run -d –name nginx -p 80:80 -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/conf:/etc/nginx -v /data/nginx/logs:/var/log/nginx -d nginx:1.12.2
步骤3. 设置应用开机自启
-—–
docker update –restart=always nginx
-—–
以上步骤完成后,就可以启动nginx容器并访问ip:80了。
nginx挂载目录这里有同学可能会有疑问,平时我们打包的vue文件都生成在dist中,为什么没有挂载/data/nginx/dist目录呢?
因为data/nginx/dist 目录和 /data/nginx/html 目录的作用是一样的,用于存放Nginx服务提供的静态文件。
所以你可以选择任意一个目录挂载到 Docker 容器中,而无需挂载两个目录同时使用。
在步骤1语句4仅仅挂载了 /data/nginx/html 目录,这是因为在 Nginx 默认配置中,静态文件的根目录是 /usr/share/nginx/html,
所以我们需要挂载主机中的 /data/nginx/html 目录到容器中的 /usr/share/nginx/html 目录。
如果更喜欢使用 /data/nginx/dist 目录,则可以将上面命令中的 /data/nginx/html 目录改为 /data/nginx/dist 目录,
并将 Nginx 配置文件中的 root /usr/share/nginx/html 改为 root /usr/share/nginx/dist。
后续会导入xcplus的system包模块,里面的配置记得修改hikari的配置,就像这样:
1 | hikari: |
——————————————————–——————————————————————————————————————————————————————————————————————————————
下面是minio安装步骤
进入linux服务器并创建文件夹(可以自己选择一个位置,我这就直接在根目录创建了)
mkdir minio
进入创建的文件夹
cd /minio
在线下载安装包
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
创建minio的log文件
touch minio.log
赋予minio文件夹777权限
chmod 777 minio
启动minio
./minio server /minio/data
控制台提示密码过于简单;下面进入配置文件设置你的账号密码(举例账号:zxcMinio123 密码:zxcMinio123),密码前不能有”@”符号,图片是之前的记录,“@”在application.yml中属于特殊字符需要+”@“进行转义成普通”@”符号,但转义之后我在项目用起来还是有小问题,所以就不推荐密码前有”@”符号啦!
vim /etc/profile
添加以下代码
# set minio account
export MINIO_ROOT_USER=zxcMinio123
export MINIO_ROOT_PASSWORD=zxcMinio123
保存退出;
esc+:wq!
重载配置文件
source /etc/profile
后台启动minio
nohup /minio/minio server /minio/data –console-address “:61234” > /minio/minio.log 2>&1 &
说明:
这里的61234端口可以是其他的,你上面运行命令是什么端口下面访问就写什么(情况1:本地虚拟机安装记得开放对应的这个运行端口和9000端口或者你直接关闭虚拟机防火墙;情况2:云服务器安装记得安全组开放这两个端口【记得设置复杂的minio账号密码;或者限制访问的ip为你自己电脑的ip;别问为什么:因为我之前云服务器上mysql由于设置传统root账户root密码被攻击过,不过我是自己玩,没有重要数据攻击了也没事,这里给大家提个醒】)
浏览器访问输入:你的ip:9000或者ip:61234
(安装方法摘自cyborg2077.github.io)
gogs
教下gogs吧,用一遍就会了。端口10880
对了分享个我遇到过许多次的问题就是docker启动后有些镜像端口没有开启,这时候多运行几遍sh /data/soft/restart.sh 再docker ps查看就好了
这里gogs账号和密码都是gogs,先确保你安装了git。
1、首先创建一个组织
该组织通常以项目名命名,填写组织名称。
创建成功,进入管理面板修改组织信息
点击编辑,填写组织名称。
修改成功,进入首页点击组织名称
进入组织首页
下边开始创建团队
假如创建研发团队,填写团队名称
选择权限等级,注意:这里即使选择了权限等级也需要在仓库管理中去管理协作者的权限。
团队创建成功
团队创建成功下边开始创建成员账号 。
首先在用户管理中添加账号分配给成员。
然后在下边的界面 中向团队添加成员
团队和组织创建完成,下边创建仓库,进入组织,创建仓库。
填写仓库信息
创建成功,仓库地址:http://192.168.101.65:10880/xuecheng-plus-group1/xuecheng-plus-group1.git,如下
下边配置使用仓库的人员
点击“仓库设置”,
添加协作者,将团队成员的账号添加为协作者。
添加完成注意分配权限,如下图,通常测试人员为读取权限,开发人员为读写权限。
团队Leader需要将初始代码上传至Git仓库,团队成员通过Idea克隆一份项目代码,通过此仓库进行协作开发。
然后回到IDEA将git远程地址复制进去就行,它需要输入凭证,就输刚刚创建的用户或gogs用户
课程查询接口
先了解项目每个模块的内容,是干嘛的,比如content的就是主要内容,content-model就是内容的模型,base就是这个项目的基础类。对于课表查询接口就写在content模块里,先定义一个springboot的启动类和controller类,为了方便项目以后的开发,在base里model包里创建PageParams和PageResult类分别用来定义页面查询的参数类和页面结果。
swagger接口文档
为了方便前后端分离开发之间的数据接收和传输(虽然前后端分离人不分离),文档就很重要。swagger就为我们提供了自动生成文档接口。首先导入swagger的maven坐标:(这个项目里就是xuecheng-content-api里的pom了)
1 | <!-- Spring Boot 集成 swagger --> |
然后再在该模块的启动类上加上@EnableSwagger2Doc注解