部署和发布

  • 将程序放在服务器上,使之可以:
    • 监听端口
    • 相应请求
    • 进行预定义的业务逻辑处理

部署和发布中要解决

  • 产品还在不停地迭代
    • 部署的版本需要不停的进行更新
    • 更新版本时服务不能中断
      • 一部分机器一部分机器重新部署
      • 现有的机器必须能够承担流量
  • 环境问题
    • 开发or测试环境
    • 预发环境
      • 一般直接访问生产数据库
      • 代码不停更新
    • 生产环境
  • 环境兼容性问题
    • 硬件,软件,数据库等

发布和部署Java程序

  • 使之在生产环境下可以运行
  • 需要解决的问题
    • 你自己编写的代码
    • 依赖的第三方库
    • 以来的特殊环境配置(数据库/缓存等)
    • 稳定性(挂了怎么办?)
    • 升级和回滚
    • 批量发布

使用Maven Exec插件进行部署

Maven exec plugin

  • 自动将所有的传递性依赖加入
  • 优点:简单
  • 缺点:不适用于自动化的场景
    • 部署前需要先把代码和依赖都下载下来
  • 简单配置示例

    1. <plugin>
    2. <groupId>org.codehaus.mojo</groupId>
    3. <artifactId>exec-maven-plugin</artifactId>
    4. <version>1.6.0</version>
    5. <configuration>
    6. <executable>java</executable>
    7. <workingDirectory>/tmp/project</workingDirectory>
    8. <arguments>
    9. <argument>-classpath</argument>
    10. <!-- automatically creates the classpath using all project dependencies,
    11. also adding the project build directory -->
    12. <classpath/>
    13. <argument>com.example.Main</argument>
    14. </arguments>
    15. </configuration>
    16. </plugin>

使用jar方式部署

  • jar包
    • jar包其实就是一个zip包
    • 实际上就是编译后的代码资源打包
    • jar包与Manifest
    • 简单可靠
    • 依赖于JVM环境
  • spring boot maven plugin
    • mvn package spring-boot:repackage
    • package阶段生成.jar文件
    • jar包中包含了程序运行的所有依赖
  • Java启动zip包
    • java -jar xxx.zip
    • -jar左边是java引擎的参数,右边是程序的参数(args)
    • 会先扫描zip包,找到MAINIFEST.MF文件,里面记录了jar包的信息

Docker部署

Docker运行Java程序

Docker运行数据库

Docker运行Redis

Docker运行Nginx

Dockerfile

  • 一个简单示例 ```dockerfile FROM java:openjdk-8u111-alpine

RUN mkdir /app

WORKDIR /app

COPY target/demo-0.1.0.jar /app

EXPOSE 8080

CMD [“java”, “-jar”, “demo-0.1.0.jar”] ```