美文网首页
Java 程序部署

Java 程序部署

作者: bowen_wu | 来源:发表于2021-09-09 14:42 被阅读0次

    概述

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

    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

    • 优点:简单可靠
    • 缺点:依赖于 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 服务

    启动

    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
    

    相关文章

      网友评论

          本文标题:Java 程序部署

          本文链接:https://www.haomeiwen.com/subject/zvzvwltx.html