如何快速部署上线项目

CSDN 的小伙伴们,大家好呀,我是苍何。

今天在群里面看到有小伙伴反馈说,面试的时候一被问到简历中的项目还没上线,就不继续问了,感觉挺奇葩的,要知道就校招来说,项目本身大部分都是练手的项目,上线也得花费很多的成本啊。

群友反馈项目没上线就没下文

就 Java 应用来说本身是很吃内存的,再者现在不拿个微服务项目挂简历又拿不出手,但一上线微服务,服务器资源耗费将会是之前的好几倍。就拿 PmHub 来说,之前单体的时候,1 核 2G 的服务器,跑的还可以。

但一换上微服务,即使升级为 4 核 8G, 服务还没全开的情况下,内存一样被打满,不得已把运行 CI/CD 的 Jenkins 给关了才得以「保命」。

我的服务器资源占用整体情况

我的服务器资源占用细节

而且该说不说,现在的云服务器续费也是贵的离谱,省下好几个月的余粮才咬牙升级配置。(为了项目有个舒服的体验环境也是拼了😂)

含泪升级云服务器

说回面试需要项目上线的问题,我觉得主要有两个办法,一是本地电脑部署外挂内网穿透出去,这样也省去买域名和服务器一堆操作,是性价比最高的。但缺点就是电脑不能关,直到拿到 offer 结束。

当然条件允许的话也可以体验一把部署上线的快感。为什么说是快感呢?有经验的开发应该清楚,每次上线都是激动人心的时刻,线下爱你千万遍,不如线上见一面。上线一次就顺利的算是运气好,很多情况,上线总要出问题。

c8177f3e6709c93d829448ccecc21ed9d00054a8.webp

今天分享一下我们项目的容器化部署实战,希望对你有帮助。

什么是 Docker 容器

当把环境从一个服务器迁移到另一个服务器,当你新买了电脑,会遇上要重新安装一系列的软件,比如 JDK、Tomcat、Maven、Redis 等,而安装完之后每一次都需要再去配置环境,但是这些都是重复性的工作,有什么办法可以解决呢?

玩过云服务器的听说过有镜像一说,将所有的软件和需要的配置都打包好做成镜像,下次需要的时候只需要安装镜像就可以。

类似的,Docker 就是解决这种问题的,将所有的软件程序都放在 Docker 仓库中,我们只需要在电脑上下载 Docker 即可,不需要再去进行繁琐的安装和配置了,只需要几个命令就可以将我们的环境搭建好,这就是 Docker。

docker

总结来说, Docker 是一个开源的应用容器引擎;是一个轻量级容器技术,Docker 支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;运行中的这个镜像称为容器,容器启动是非常快速的。

Docker 架构

Docker 的工作原理如下:

docker工作原理(来源于 X)

通过下图可以得知,Docker在运行时分为Docker引擎(服务端守护进程)和客户端工具,我们日常使用各种docker命令,其实就是在使用客户端工具与Docker引擎进行交互。

docker架构图(来源于网络)

Dockerfile

在 Docker 中构建镜像最常用的方式,就是使用Dockerfile。Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。官方文档:https://docs.docker.com/engine/reference/builder。

就是可以存放构建启动指令,可以用来动态构建 docker 镜像容器的文件。

为什么要用 Docker-Compose

因为是微服务项目,经常来说,单独去启动每个服务太麻烦了,而且有些服务间有启动顺序,有需要数据库服务容器、缓存容器等这些。

这就需要用到 Docker-Compose,它是用于定义和运行多容器 Docker 应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序所需要的服务。然后使用一个命令,就可以通过YAML配置文件创建并启动所有服务。

我们的项目用的也是 Docker-Compose,可以做到一条命令就可以启动所有服务容器,主打一个高效

项目上线实战

本地构建

1、前端构建

前端的 vue 进行构建的时候还是比较吃资源的,如果资源配置不足的情况下,可以在本地电脑构建,然后将构建好后的 dist 文件上传到服务器即可。

如果.gitignore 忽略了 dist 的提交,记得注释掉!

npm run build:prod

构建好后生成的静态文件

后端构建

后端打包构建完全可以放在服务器上,后面配合 CI/CD 构建脚本,可以做到自动化打包构建部署上线,它其实也就是一条命令即可。

# 切换到目录
cd /你的安装目录/
# 包构建项目
mvn -T 1C clean package -Dmaven.test.skip=true -Dmaven.compile.fork=true

构建完成后,在每个项目的 target 下面就可以看到打包好的 jar 包:

jar包的位置

阿里云开启安全组

如果服务器是阿里云的话,在操作云服务器之前,先需要开启阿里云的安全组,进行端口的放开。一般来说,云服务器的端口由以下两个控制。

  • 安全组放开端口
  • 防火墙开启端口

阿里云开启安全组

下载项目

接下来就是在云服务器上 clone 项目:

# 进去目录
cd /你的安装目录

git clone git@github.com:laigeoffer/pmhub.git

拷贝 jar 包

微服务的 jar 包分散在各自的模块,不大方便操作,因此提供了一键复制 jar 包合相关配置文件到统一地方的 shell 脚本如下:

#!/bin/sh

# 复制项目的文件到对应docker路径,便于一键生成镜像。
usage() {
	echo "Usage: sh copy.sh"
	exit 1
}


# copy sql
echo "begin copy sql "
cp ../sql/pmhub_20240305.sql ./mysql/db
cp ../sql/pmhub_nacos_20240423.sql ./mysql/db

# copy html
echo "begin copy html "
cp -r ../pmhub-ui/dist/** ./nginx/html/dist


# copy jar
echo "begin copy pmhub-gateway "
cp ../pmhub-gateway/target/pmhub-gateway.jar ./pmhub/gateway/jar

echo "begin copy pmhub-auth "
cp ../pmhub-auth/target/pmhub-auth.jar ./pmhub/auth/jar

echo "begin copy pmhub-monitor "
cp ../pmhub-monitor/target/pmhub-monitor.jar  ./pmhub/monitor/jar

echo "begin copy pmhub-system "
cp ../pmhub-modules/pmhub-system/target/pmhub-system.jar ./pmhub/modules/system/jar

echo "begin copy pmhub-job "
cp ../pmhub-modules/pmhub-job/target/pmhub-job.jar ./pmhub/modules/job/jar

echo "begin copy pmhub-gen "
cp ../pmhub-modules/pmhub-gen/target/pmhub-gen.jar ./pmhub/modules/gen/jar

echo "begin copy pmhub-project "
cp ../pmhub-modules/pmhub-project/target/pmhub-project.jar ./pmhub/modules/project/jar

echo "begin copy pmhub-workflow "
cp ../pmhub-modules/pmhub-workflow/target/pmhub-workflow.jar ./pmhub/modules/workflow/jar


这样就可以将 jar 包合配置文件统一路径,方便管理和一键启动。

开启服务器防火墙

服务器防火墙端口的开启也是基于阿里云安全组开启之后,其实开启命令比较简单,如果是 Debian 系统的话是:

ufw allow 9849/tcp

如果是 centos 系统:

firewall-cmd --add-port=80/tcp --permanent

但是端口有好多,能不能一次性开启呢?可以的,同样编写 shell 脚本,一键启动即可:

sh deploy.sh port
# 查看是否开启
ufw status

启动 Nginx

Nginx 我建议不要通过容器来安装,直接安装在宿主机上会比较好。

安装方法如下:

# 更新系统
1、安装
apt install -y nginx
2、看版本号
nginx -v
# 显示nginx的版本号和编译信息
nginx -V
# 查看安装的所有 Nginx 包
# 查看 Nginx 安装相关的文件位置信息
whereis nginx

3、启动Nginx
cd /usr/sbin/
./nginx

4、查询进程:

ps -ef | grep nginx
查看进程id
ps -C nginx -o pid

5、检查配置是否正确
nginx -t

重启命令:systemctl restart nginx

6、使配置生效

nginx -s reload

在 nginx 中配置前段的 dist 文件所在的路径以及域名和 https 即可完成反向代理。意味着你就可以直接通过域名访问到网站啦

一键启动基础环境

基础环境包括 MySQL、Redis、Nacos 等,同样构建了 shell 脚本方便一键启动。

# 进去目录
cd /安装路径/pmhub/docker

# 启动基础环境(必须)
sh deploy.sh base

其实内部也就是几个 docker-compose 启动命令:

# 启动基础环境(必须)
base(){
	docker-compose up -d pmhub-mysql pmhub-redis pmhub-nacos
}

一键启动应用服务

同里,我们将需要一次性启动的几个服务放在一键启动脚本中即可一键启动,但是如果服务器 CPU 核数不足,不建议一次启动过多服务,否则直接就会把服务器搞咋了,推荐还是单个服务启动并观察内存使用情况。

docker-compose up -d 你要启动的服务

扩展:jar 包启动

如果在本地或者不想通过 docker 的方式启动,也完全可以用 jar 的方式启动,但并不推荐,一来比较慢,二来不方便。

举个例子,需要启动 pmhub-gateway:

# 定位到jar目录
cd /你的安装目录/pmhub/docker/pmhub/gateway/jar

# 后台启动
java -jar pmhub-gateway.jar & 

# 查看是否启动
netstat -tuln | grep 6880
或者
ps aux | grep pmhub-gateway.jar

# 如何关闭服务
kill 12345

至此,在服务器上部署上线服务就已经完成,但还有不少的细节,比如域名如何配置啊,如何进行 ssl 解析啊,如何进行 CI/CD 自动化部署啊,这些其实都需要自己手动去玩了才能搞明白。

如果是在大公司,上线流程其实还更复杂,一个优秀的程序员一定是懂的上线的流程的,我想这可能是面试官为什么对未上线项目这么在意的一些原因吧(个人观点)。

ending

历经几个月时间,我们的的首个开源项目就要上线了,这是一套基于 SpringCloud & SpringCloud Alibaba & LLM 的分布式微服务的智能项目管理系统,这个项目旨在让同学们快速掌握微服务/分布式项目的架构设计和开发流程,如果想在校招或者社招中拿到一个满意的 offer, 这个项目将是一个非常 nice 的选择。

项目包括认证、流程、项目管理、系统、网关等服务。包含了 Redis 缓存、RocketMQ 消息队列、Docker 容器化、Jenkins 自动化部署、Spring Security 安全框架、Nacos 服务注册和发现、sentinel 分布式事务、Spring Boot Actuator 服务监控、SkyWalking 链路追踪、OAuth2 统一认证、OpenFeign 服务调用,Vue3 前端框架等互联网开发中需要用到的主流技术栈,可以帮助同学们快速掌握微服务/分布式项目的核心知识点。

并且同时也是一套企业工作流的开发框架,您可以根据自身需求,快速定制出适合自己公司的企业工作流系统。

项目目前已经取得** 24 个 star** 了(每一个 star 都格外珍惜)

真希望能尽快和大家见面呀!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/675103.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 Potree.js 的 3D 点云展示

本文由ScriptEcho平台提供技术支持 项目地址:传送门 基于 Potree.js 的 3D 点云展示 应用场景 本代码主要应用于需要在 Web 浏览器中展示和交互式浏览 3D 点云数据的场景。点云数据广泛应用于建筑、测绘、地理信息等领域,通过可视化点云,…

Mac下载docker

先安装homebrew Mac下载Homebrew-CSDN博客 然后输入以下命令安装docker brew install --cask --appdir/Applications docker 期间需要输入密码。输入完等待即可

解决uni-app progress控件不显示问题

官方代码&#xff1a; <view class"progress-box"><progress :percent"80" show-info activeColor"red" stroke-width"10" /> </view> 进度条并不在页面中显示&#xff0c;那么我们需要给进度条加上宽高style"…

面试Tip--java创建对象的四种方式

java创建对象一共有四种方式&#xff0c;但是我们在写代码的时候用的new 关键字偏多&#xff0c;像一些接口对接则是序列化创建对象偏多&#xff0c;今天我们来简单介绍下使用场景以及各个方式 1. 使用 new 关键字 这是最常见的创建对象的方式。 public class Example {priva…

vue-cl-service不同环境运行/build配置

概述 在项目开发过程中&#xff0c;同一个项目在开发、测试、灰度、生产可能需要不同的配置信息&#xff0c;所以如果能根据环境的不同来设置参数很重要。 vue项目的vue-cl-service插件也支持不同环境的不同参数配置和打包。 实现 新建不同环境配置文件 vue项目中的配置文件以…

人脸识别系统之静态人脸识别

人脸识别系统 一. 静态人脸识别 1. 人脸提取 1.1. 导入资源包 import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTk, ImageDraw import face_recognition import os import subprocess import sys注&#xff1a;进行人脸识别…

基于Docker+Jenkins实现自动部署SpringBoot+Maven项目

安装Docker随便根据其他教程安装即可&#xff0c;本文着重讲jenkins的安装与环境配置。 一、安装jenkins 1.运行命令搜索Jenkins docker search jenkins deprecated 是弃用的意思&#xff0c;第一条搜索记录就是告诉我们 jenkins 镜像已经弃用&#xff0c;让我们使用 jenkins…

ardupilot开发 --- 机载计算机-软件方案 篇

马儿跑马儿不吃草 0. 概述APSyncBlueOSDroneKitFlytOSMaverickROSRpanion-server结论 0. 概述 The Companion Computer software refers to the programs and tools that run on the Companion Computer. They will take in MAVLink telemetry from the Flight Controller and…

IGraph使用实例——图属性创建1

1 概述 在图论中&#xff0c;图由顶点&#xff08;vertices&#xff09;和边&#xff08;edges&#xff09;组成&#xff0c;可以是无向的或有向的。图的属性是用来提供关于图、顶点或边的额外信息的数据。以下是从图论角度对图的属性的描述&#xff1a; 图的属性&#xff08…

C++:特殊类设计和四种类型转换

一、特殊类设计 1.1 不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98&#xff1a; 1、将拷贝构造函数与赋值运算符重载只…

个人百度百科怎么创建

编辑百度词条是一个相对简单的流程&#xff0c;但需要注意的是&#xff0c;并不是所有的词条都可以编辑&#xff0c;部分锁定的词条是无法编辑的&#xff0c;但可以通过官方平台申请解封。以下百科优化网yajje分享是详细的步骤&#xff1a; 注册百度账号 首先&#xff0c;用户…

kernelbase.dll故障怎么处理的几种常见方法,有效的解决kernelbase.dll故障

kernelbase.dll是 Windows 操作系统的一个系统文件&#xff0c;它是 Windows NT 基本 API 客户端库的一部分。如果你遇到了kernelbase.dll出现故障的情况&#xff0c;这可能会导致软件崩溃或无法正常运行。下面是一些处理kernelbase.dll故障的常见方法。 重新启动计算机&#x…

企业百度百科词条怎么修改

企业百度百科词条的修改是提升企业网络形象的重要手段。以下是百科优化网yajj总结详细的修改步骤&#xff1a; 准备工作 注册并登录百度账号&#xff1a;这是进行词条编辑的前提]。熟悉百度百科编辑规则&#xff1a;了解内容要求、格式规范、参考资料等&#xff0c;有助于更好…

深入解析 Web 开发中的强缓存与协商缓存机制

在 Web 开发中,缓存机制是提高页面加载速度和用户体验的重要技术。缓存分为两种主要类型:强缓存和协商缓存。本文将详细介绍这两种缓存机制的原理、实现方式及其区别,并演示如何在 <meta> 元素中和 Nginx 服务器中进行缓存控制。 强缓存 强缓存(Strong Caching)是指…

气泡式水位计施工技术要求

1、气泡式水位计压力气管出气口应安装并固定在最低水位处&#xff0c;其压力气管也应固定&#xff0c;有条件的可用金属管或塑料管保护。气泡式水位计安装示意图见附图。 2、安装要求 1&#xff09;检查气泡式水位计气管外观有无破损及变形&#xff1b; 2&#xff09;旋开带有…

【c++进阶(二)】STL之string类的模拟实现

&#x1f493;博主CSDN主页:Am心若依旧&#x1f493; ⏩专栏分类c从入门到精通⏪ &#x1f69a;代码仓库:青酒余成&#x1f69a; &#x1f339;关注我&#x1faf5;带你学习更多c   &#x1f51d;&#x1f51d; 1.前言 本章重点 本章主要介绍一些关键接口的模拟实现&#xff…

Simulink从0搭建模型09-P10 各类常用子系统介绍

Simulink从0搭建模型09-P10 各类常用子系统介绍 今日学习内容1. 使能子系统 Enabled Subsystem2. 触发子系统 Triggered Subsystem3. 函数调用子系统 Function-Call Subsystem3.1. 使用Function-Call Generator 产生一个f()信号3.2. 使用Stateflow产生f()一个信号3.2.1. Chart模…

CentOS 7~9 救援模式恢复root密码实战指南

在管理Linux服务器时&#xff0c;忘记root密码是一件棘手的事情&#xff0c;但幸运的是&#xff0c;CentOS提供了救援模式来帮助我们重置root密码。本文将详细介绍如何通过GRUB引导菜单进入紧急模式&#xff08;或称为救援模式&#xff09;&#xff0c;进而恢复root用户的密码。…

政安晨【零基础玩转各类开源AI项目】:解析开源项目:Champ 利用三维参数指导制作可控且一致的人体图像动画

目录 论文题目 Champ: 利用三维参数指导制作可控且一致的人体图像动画 安装 创建 conda 环境&#xff1a; 使用 pip 安装软件包 推理 1. 下载预训练模型 2. 准备准备引导动作数据 运行推理 训练模型 准备数据集 运行训练脚本 数据集 政安晨的个人主页&#xff1a;…

Stable diffusion文生图大模型——隐扩散模型原理解析

1、前言 本篇文章&#xff0c;我们将讲这些年非常流行的文生图大模型——Stable Diffusion。该模型也不难&#xff0c;甚至说很简单。创新点也相对较少&#xff0c;如果你学会了我以前的文章讲过的模型&#xff0c;学习这个也自然水到渠成&#xff01; 参考论文&#xff1a;H…