部署和发布
- 将程序放在服务器上,使之可以:
- 监听端口
- 相应请求
- 进行预定义的业务逻辑处理
部署和发布中要解决
- 产品还在不停地迭代
- 部署的版本需要不停的进行更新
- 更新版本时服务不能中断
- 一部分机器一部分机器重新部署
- 现有的机器必须能够承担流量
- 环境问题
- 开发or测试环境
- 预发环境
- 一般直接访问生产数据库
- 代码不停更新
- 生产环境
- 环境兼容性问题
- 硬件,软件,数据库等
发布和部署Java程序
- 使之在生产环境下可以运行
- 需要解决的问题
- 你自己编写的代码
- 依赖的第三方库
- 以来的特殊环境配置(数据库/缓存等)
- 稳定性(挂了怎么办?)
- 升级和回滚
- 批量发布
使用Maven Exec插件进行部署
Maven exec plugin
- 自动将所有的传递性依赖加入
- 优点:简单
- 缺点:不适用于自动化的场景
- 部署前需要先把代码和依赖都下载下来
简单配置示例
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<executable>java</executable>
<workingDirectory>/tmp/project</workingDirectory>
<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>
</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”] ```