Java 程序部署

2021-09-09  本文已影响0人  bowen_wu

概述

主机上的一个进程监听着某个端口

Java 程序部署需要解决的问题

Maven exec Plugin

  1. pom.xml 添加 Plugin

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
        </plugins>
    </build>
</project>
  1. 添加运行 Java 程序的配置

<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>
  1. 运行
mvn exec:exec
mvn exec:exec -X // -X 使得报错信息更加详细

jar 包

jar 包 => 编译后的代码和资源打包 => 压缩包,相当于一个 zip 包 => Spring Boot 在打包的时候把所有相关的启动信息都打在了里面,所有运行时依赖的信息都在里面 => 所有的依赖 + 内嵌 Tomcat

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 服务

启动

  1. nohup == no hung up
nohup java -jar test.jar & 
nohup java -jar test.jar > temp.txt &  // 将日志文件输入到 temp.txt
  1. tmux => terminal multiplexer 终端多路复用器
    1. tmux => 进入
    2. control + b 之后按 d => 脱离
    3. tmux attach => 回到 tmux
    4. exit => 退出
  2. 上述两种方法无法解决进程崩溃。服务机制:进程放在后台运行,同时监控进程,如果进程出现问题,服务会自动重启使得对外服务不中断 => Google <OS> create service
  3. 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
上一篇下一篇

猜你喜欢

热点阅读