一个简单的分布式部署流程
使用 3 种不同的方式,将项目部署成 3 个实例,每个实例监听不同的端口,由 Nginx 负责将请求转发到对应的实例中,完成请求流程。
Docker 启动 MySQL,Redis
首先使用 Docker 启动一个全局的 Redis,MySQL,Nginx,让项目连接上对应的数据库。
获取并启动 MySQL
获取最新的 MySQL 镜像
1 |
|
启动 MySQL
1 |
|
获取并启动 Redis
获取最新的 Redis 镜像
1 |
|
启动 Redis
1 |
|
使用 Maven Exec 插件进行部署
在项目的 pom 文件中,引入并配置 exec 插件,代码如下:
1 |
|
改配置信息指定了可执行程序 java,指定使用 classpath 中的 jar 包,配置了主类(即程序入口),完成以上配置即可使用 mvn exec:exec
运行程序,演示项目运行的端口为 8081。
使用 java -jar 方式运行部署
使用 maven 命令对项目进行打包
1 |
|
得到一个可执行的 jar 包:xxx.jar,接着使用命令执行该 jar,并指定端口为 8082
1 |
|
使用 Docker 部署项目
在当前项目文件中编写 Dockerfile
1 |
|
根据编写好的 Dockerfile 生成一个 Docker 镜像文件,在当前目录运行如下命令
1 |
|
构建好镜像之后运行该镜像文件
1 |
|
由于项目默认使用的 Redis 和 MySQL 连接都是 localhost,因此在 Docker 中运行该项目会访问不了数据库,因此,我们在本地重写了 application.properties
文件,并把该配置文件映射到 Docker 内部,使得 Docker 内的项目可以读取并使用该配置文件(配置文件有优先级关系,详情点击)。
使用并配置 Nginx,完成分布式部署
获取最新的 Nginx
1 |
|
在启动 Nginx 之前需要对它进行配置
1 |
|
上面配置的意思是:Nginx 监听 80 端口,并对所有 80 端口的请求转发给 backend
,backend
里面又配置了三个服务,这三个服务就是上面用三种方式开启的。由于没有配置具体的转发规则,因此 Nginx 会使用默认的负载均衡机制轮询,即请求在三个服务之间均匀分布。详细的负载均衡机制点击这里。
由于 Nginx 是 Docker 启动的,因此需要把本地编写的配置文件映射到 Docker 容器内部,使用 -v
参数。最后 Nginx 的启动命令如下,其中 --restart=always
表示 Nginx 遇到错误会自动重启。
1 |
|
启动完成后,本机上所有的 80 端口请求都会交给 Nginx 去处理,Nginx 把请求转发到对应的服务上,服务完成请求解析,执行相应过程,返回结果,流程结束。
结语
使用了 3 种方式部署 Java 项目,但还是推荐使用 Docker 方式。使用 Docker 编写好一个 Dockerfile,然后构建一个 Docker 镜像,要运行多个服务,使用该镜像启动多个容器即可,非常方便。
Docker 是未来的趋势,学习并使用 Docker 很有必要。最近打算使用 Docker 打造一个 Java 开发环境,理想的结果是本机使用 IDEA,其他所有的环境都在一个 Docker 镜像中,只需要让本机的代码和 Docker 内部的代码保持同步即可。
下一节搞个 Docker 基本概念介绍,以及理解并手动编写自己的 Dockerfile。