概述
主机上的一个进程监听着某个端口
Java 程序部署需要解决的问题
- 代码上传到服务器
- 依赖的第三方库
- 依赖的特殊环境配置(数据库 | 缓存等)
- 稳定性(挂了如何处理?)
- 升级和回滚
Maven exec Plugin
- 自动将所有的传递性依赖加入
- 优点:简单
- 缺点:不适用于自动化的场景
<project>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</build>
</project>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<!-- automatically creates the classpath using all project dependencies,
also adding the project build directory -->
<classpath/>
<argument>com.example.Main</argument>
</arguments>
</configuration>
- 运行
mvn exec:exec
mvn exec:exec -X // -X 使得报错信息更加详细
jar 包
jar 包 => 编译后的代码和资源打包 => 压缩包,相当于一个 zip 包 => Spring Boot 在打包的时候把所有相关的启动信息都打在了里面,所有运行时依赖的信息都在里面 => 所有的依赖 + 内嵌 Tomcat
- 优点:简单可靠
- 缺点:依赖于 JVM 环境
mvn package // 打包, 生成 jar 包
java -jar xxx.jar // 运行 xxx jar 包
# 等同于
java --classpath xxx com.xxx.yyy.Main
在 jar 包中 META-INF/MANIFEST.MF 其中有重要的信息,其中包括了 Main-Class
,即上述的 com.xxx.yyy.Main
后台启动 | 关闭 Java 服务
启动
- nohup == no hung up
nohup java -jar test.jar &
nohup java -jar test.jar > temp.txt & // 将日志文件输入到 temp.txt
-
tmux => terminal multiplexer 终端多路复用器
-
tmux
=> 进入 - control + b 之后按 d => 脱离
-
tmux attach
=> 回到 tmux -
exit
=> 退出
-
- 上述两种方法无法解决进程崩溃。服务机制:进程放在后台运行,同时监控进程,如果进程出现问题,服务会自动重启使得对外服务不中断 => Google <OS> create service
- docker =>
docker run -d
列出后台进程
ps -ef | grep java
杀死进程
kill -9 <PID> // -9 表示无条件终止
Docker
- 将所有的依赖,包括操作系统,打包在一起
- 完全的资源隔离
- 轻量级,启动迅速
- 方便大规模水平扩展
服务器搭建 Docker Register
docker pull registry
docker run -d -p 5000:5000 --restart always --name registry registry:2
之后配置 docker 的配置文件 daemon.json
{
"insecure-registries": [
"http://<ip>:<port>"
]
}
Dockerfile
# 基础镜像
FROM openjdk:11.0.12-jdk
RUN mkdir /app
WORKDIR /app
# 相对路径相对于当前目录
COPY your/jar/path/xxx-0.0.1-SNAPSHOT.jar /app
# 暴露端口
EXPOSE 8080
CMD ["java", "-jar", "xxx-0.0.1-SNAPSHOT.jar"]
Build
# . 代表当前文件
docker build [-f <DockerfileName>] -t <Ip>:<Port>/<Name>:<Tag> .
Push
推送到远程,默认推送至 Docker 中心仓库
# docker push <Ip>:<Port>/<Name>:<Tag>,推送至私服 Ip:port
docker push 1.2.3.4:5001/xxx:0.0.1
服务器拉取镜像
# docker pull <Ip>:<Port>/<Name>:<Tag>
docker pull 1.2.3.4:5001/xxx:0.0.1
启动 Docker 镜像
在服务器上启动 Docker 镜像即启动 Java 服务
docker run -p 8081:8080 -d xxx
之后便可以通过 8081 端口访问 Java 服务了
NGINX 代理
NGINX 作为 Load Balancer configuration
# nginx.conf
events {}
http {
# NGINX 代理静态资源,css 文件可以加载但是不生效 => css文件正常加载
include mime.types;
default_type application/octet-stream;
upstream app {
server <局域网IP>:8081;
}
server {
listen 80;
location / {
root /static; # 静态文件
autoindex on;
}
location /api {
proxy_pass http://app;
}
}
}
启动 NGINX 代理
docker run --name nginx -v /<path>/<to>/nginx.conf:/etc/nginx/nginx.conf:ro -v /<path>/<to>/<static>/<file>:/static -p <对外暴露的端口号>:80 -d nginx
网友评论