1.前言:限于个人资源,本篇提供从0到1linux端基于springcloud微服务的完整单机版本搭建,分享给软件开发、测试、运维以及有兴趣的同学作为参考,后续资源满足集群模式后,再整理发布集群部署帖。
2.背景:服务器版本centos8,项目基于springboot2.7版本的微服务模式进行构建,涉及到以下版本的中间件安装:mysql8+tdengine3.0+redis6+nginx1.21+nacos3.3+zookeeper3.4+kafka2.13,jdk默认1.8.x。
3.过程:按顺序一步步执行即可。
3.1docker:
安装相关依赖:yum install -y yum-utils
设置阿里云镜像存储地址:
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker服务:yum install docker-ce docker-ce-cli containerd.io
安装完成后,运行下面的命令,验证是否安装成功:
设置docker拉取镜像地址:docker默认从https://hub.docker.com获取,因为是国外地址且速度较慢,建议多加几个国内地址:vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://mr63yffu.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"]
}
重启Docker Daemon:systemctl daemon-reload
提示:后续部署均基于docker容器化部署,为了方便后续维护,创建容器时,会将数据、日志、配置文件映射到本机。
3.2mysql8:
docker pull mysql 执行该命令会自动拉取当前最新版本的镜像,如果需要指定版本,可以使用docker search mysql查询更多版本。
在本地创建mysql映射目录 mkdir -p /home/mysql/data /home/mysql/logs /home/mysql/conf
创建容器并指定映射目录 docker run -p 3306:3306 --name mysql \
-v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/logs:/logs \
-v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:latest
- -d: 后台运行容器
- -p 将容器的端口映射到本机的端口
- -v 将主机目录挂载到容器的目录
- -e 设置参数
进入容器/执行命令:docker exec -it mysql /bin/bash
验证mysql是否正常工作:mysql -uroot -p 或mysql,进入容器默认是免登录。
3.3td3.3.2.0:
docker pull tdengine/tdengine
mkdir -p /home/taos
mkdir -p /home/taos/data
mkdir -p /home/taos/log
docker run -d --name tdengine -v /home/taos/taos.cfg:/etc/taos/taos.cfg -v /home/taos/data:/var/lib/taos -v /home/taos/log:/var/log/taos -p 6030:6030 -p 6041:6041 -p 6043-6049:6043-6049 -p 6043-6049:6043-6049/udp tdengine/tdengine
提示:TDengine 3.X 服务端仅使用 6030 TCP 端口。6041 为 taosAdapter 所使用提供 REST 服务端口。6043-6049 为 taosAdapter 提供第三方应用接入所使用端口,可根据需要选择是否打开。
docker exec -it tdengine bash
验证tdengine是否正常工作:taosd -C
tdengine客户端连接工具:TDengineGUI是一个基于electron构建的,针对时序数据库TDengine的图形化管理工具。具有跨平台、易于使用、版本适应性强等特点。
下载地址:https://github.com/arielyang/TDengineGUI/releases/download/1.0.3/TDengineGUI.Setup.1.0.3.exe
3.4redis:
docker pull redis
mkdir -p /home/redis/data /home/redis/conf
docker run -p 6379:6379 --name redis -v /home/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
验证redis是否启动成功:
3.5nacos:
docker pull nacos/nacos-server
docker run \
--name thinglinks-nacos -d \
-p 8848:8848 \
-p 7848:7848 \
-p 9848:9848 \
-p 9849:9849 \
--privileged=true \
--restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /home/nacos/logs:/home/nacos/logs \
-v /home/nacos/conf/application.properties:/home/nacos/conf/application.properties \
nacos/nacos-server
验证nacos是否启动成功:
3.6nginx
docker pull nginx
#当nginx容器指定配置文件目录初始化时,需要该目录存在nginx.conf,否则会失败,此时我们先创建一个临时容器,用命令手动取出它的配置文件。
docker run -di --name nginx -p 80:80 nginx
# 创建目录
mkdir -p /home/nginx
# 将容器内的配置文件拷贝到指定目录
docker cp nginx:/etc/nginx /home/nginx/conf
#停止并删除临时容器
docker stop nginx
docker rm nginx
docker run -di --name nginx \
-p 80:80 \
-v /home/nginx/conf:/etc/nginx \
-v /usr/share/nginx/html:/usr/share/nginx/html \
-v /home/nginx/logs:/var/log/nginx \
nginx
#验证nginx是否启动成功:docker exec -it nginx bash
nginx -v
到此,基础应用搭建完毕,接下来我们继续搭建业务应用。
3.7springboot应用:
a、从本地idea工具把项目打成jar包
b、将编写好的Dockfile文件、docker-compose文件和jar包上传至服务器。
Dockfile文件样例auth如下:
# 使用 Java 运行环境 FROM openjdk:8-jre # 维护者信息 LABEL maintainer="slyomg" # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 创建工作目录 WORKDIR /home/iot_pro/iot-auth # 从构建上下文(Dockerfile 所在目录的相对路径)复制 JAR 文件 COPY iot-auth.jar /iot-auth.jar # 暴露服务端口 EXPOSE 8081 # 添加健康检查,确保应用健康状态 HEALTHCHECK --interval=30s --timeout=30s --retries=3 \ CMD curl -f http://localhost:8081/actuator/health || exit 1 # 启动 Java 应用 ENTRYPOINT ["java", "-Xmx512m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/iot-auth.jar"]
docker-compose.yml部分如下:
version: '3.5' # 网络配置 networks: backend: driver: bridge # 作者信息 x-metadata-config: &metadata-config maintainer: "slyomg" # 共享环境配置 x-env-config: &env-config TZ: Asia/Shanghai SPRING_PROFILES_ACTIVE: prod NACOS_IP: 127.0.0.1 NACOS_PORT: 8848 NACOS_NAMESPACE: 41a03bfb-33c4-2a11-833f-8b57313a2d30 NACOS_USERNAME: nacos NACOS_PASSWORD: nacos # 共享卷和网络配置 x-shared-config: &shared-config environment: - TZ=Asia/Shanghai volumes: - /data/slyomg/iot-pro:/home/data/slyomg - /etc/timezone:/etc/timezone - /etc/localtime:/etc/localtime restart: always networks: - backend logging: driver: json-file options: max-size: "10m" max-file: "3" # 服务定义 services: iot-auth: container_name: iot-auth build: context: back/iot-auth dockerfile: Dockerfile ports: - "8081:8081" # 映射端口 environment: <<: *env-config SERVICE_PORT: 8081 healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:8081/actuator/health" ] interval: 30s timeout: 10s retries: 5 start_period: 60s <<: *shared-config
注:后续需要追加剩下的服务配置!
c、编写脚本通过docker-compose方式创建镜像并启动容器:
#!/bin/sh
# 开启所需端口
port(){
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --add-port=6030/tcp --permanent
firewall-cmd --add-port=6041/tcp --permanent
firewall-cmd --add-port=6043/tcp --permanent firewall-cmd --add-port=6379/tcp --permanent
firewall-cmd --add-port=7848/tcp --permanent
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --add-port=9848/tcp --permanent
firewall-cmd --add-port=9849/tcp --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-port=8081/tcp --permanent
firewall-cmd --add-port=8082/tcp --permanent
firewall-cmd --add-port=8083/tcp --permanent
firewall-cmd --add-port=8084/tcp --permanent
firewall-cmd --add-port=8085/tcp --permanent
firewall-cmd --add-port=8086/tcp --permanent
firewall-cmd --add-port=2181/tcp --permanent
firewall-cmd --add-port=9092/tcp --permanent
service firewalld restart
}
# 启动程序模块
modules(){
docker-compose up -d iot-auth iot-gateway iot-system iot-tdengine
}
# 关闭所有环境/模块
stop(){
docker-compose stop
}
# 删除所有环境/模块
rm(){
docker-compose rm
}
# 根据输入参数,选择执行对应方法,
case "$1" in
"port")
port
;;
"modules")
modules
;;
"stop")
stop
;;
"rm")
rm
;;
esac
运行完毕之后,执行docker images/docker ps等命令,逐个验证镜像和容器是否正常建立,执行docker logs 容器名 查看各容器启动是否正常。
3.8.前端Vue应用部署
a、在idea工具的终端界面,路由到指定文件夹里,执行以下命令:
npm install --registry=https://registry.npm.taobao.org
b、在前端工程根目录下压缩dist包,然后上传并解压至linux服务器3.6nginx中设置的前端文件路径里,追溯如下:
-v /usr/share/nginx/html:/usr/share/nginx/html \
c、修改3.6nginx下nginx.conf的配置,路径追溯如下:
-v /home/nginx/conf:/etc/nginx \
#iotweb服务
server {
listen 80;
server_name ip地址;
charset utf-8;
access_log /home/iot-pro.log;
location / {
root /usr/share/nginx/html/dist;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://gateway_ip:port/;
}
location /prod-soket/ {
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr; proxy_pass http://gateway_ip:port/;
}
# 避免actuator暴露
if ($request_uri ~ "/actuator") {
return 403;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
d、修改完成后执行docker exec -it nginx /bash
nginx -s reload #热加载nginx配置
nginx -t #对nginx.conf配置做合规性检查
当提示successful则成功,此时可成功登录项目主页。
由于时间匆忙,不完善的地方后续再做补充吧。