一个简单的分布式部署流程

使用 3 种不同的方式,将项目部署成 3 个实例,每个实例监听不同的端口,由 Nginx 负责将请求转发到对应的实例中,完成请求流程。

Docker 启动 MySQL,Redis

首先使用 Docker 启动一个全局的 Redis,MySQL,Nginx,让项目连接上对应的数据库。

获取并启动 MySQL

获取最新的 MySQL 镜像

1
docker pull mysql

启动 MySQL

1
docker run -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql

获取并启动 Redis

获取最新的 Redis 镜像

1
docker pull redis

启动 Redis

1
docker run -p 6379:6379 -d redis

使用 Maven Exec 插件进行部署

在项目的 pom 文件中,引入并配置 exec 插件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath/>
<argument>com.github.hcsp.Application</argument>
</arguments>
</configuration>
</plugin>

改配置信息指定了可执行程序 java,指定使用 classpath 中的 jar 包,配置了主类(即程序入口),完成以上配置即可使用 mvn exec:exec 运行程序,演示项目运行的端口为 8081。

使用 java -jar 方式运行部署

使用 maven 命令对项目进行打包

1
mvn package

得到一个可执行的 jar 包:xxx.jar,接着使用命令执行该 jar,并指定端口为 8082

1
java -Dserver.port=8082  -jar xxx.jar

使用 Docker 部署项目

在当前项目文件中编写 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
FROM java:openjdk-8u111-alpine

RUN mkdir /app

WORKDIR /app

COPY target/spring-aop-redis-mysql-0.0.1.jar /app

EXPOSE 8080

CMD ["java","-jar", "spring-aop-redis-mysql-0.0.1.jar"]

根据编写好的 Dockerfile 生成一个 Docker 镜像文件,在当前目录运行如下命令

1
docker build .

构建好镜像之后运行该镜像文件

1
docker run -v /C/Users/Administrator/Desktop/application.properties:/app/config/application.properties -p 8083:8081 镜像id

由于项目默认使用的 Redis 和 MySQL 连接都是 localhost,因此在 Docker 中运行该项目会访问不了数据库,因此,我们在本地重写了 application.properties 文件,并把该配置文件映射到 Docker 内部,使得 Docker 内的项目可以读取并使用该配置文件(配置文件有优先级关系,详情点击)。

使用并配置 Nginx,完成分布式部署

获取最新的 Nginx

1
docker pull nginx

在启动 Nginx 之前需要对它进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
events {}
http {
upstream backend {
server 192.168.110.112:8081;
server 192.168.110.112:8082;
server 192.168.110.112:8083;
}

server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}

上面配置的意思是:Nginx 监听 80 端口,并对所有 80 端口的请求转发给 backendbackend 里面又配置了三个服务,这三个服务就是上面用三种方式开启的。由于没有配置具体的转发规则,因此 Nginx 会使用默认的负载均衡机制轮询,即请求在三个服务之间均匀分布。详细的负载均衡机制点击这里

由于 Nginx 是 Docker 启动的,因此需要把本地编写的配置文件映射到 Docker 容器内部,使用 -v 参数。最后 Nginx 的启动命令如下,其中 --restart=always 表示 Nginx 遇到错误会自动重启。

1
docker run --restart=always -v /C/Users/Administrator/Desktop/nginx.conf:/etc/nginx/nginx.conf -p 80:80 -d nginx

启动完成后,本机上所有的 80 端口请求都会交给 Nginx 去处理,Nginx 把请求转发到对应的服务上,服务完成请求解析,执行相应过程,返回结果,流程结束。

结语

使用了 3 种方式部署 Java 项目,但还是推荐使用 Docker 方式。使用 Docker 编写好一个 Dockerfile,然后构建一个 Docker 镜像,要运行多个服务,使用该镜像启动多个容器即可,非常方便。

Docker 是未来的趋势,学习并使用 Docker 很有必要。最近打算使用 Docker 打造一个 Java 开发环境,理想的结果是本机使用 IDEA,其他所有的环境都在一个 Docker 镜像中,只需要让本机的代码和 Docker 内部的代码保持同步即可。

下一节搞个 Docker 基本概念介绍,以及理解并手动编写自己的 Dockerfile。


一个简单的分布式部署流程
http://wszzf.top/2021/09/01/一个简单的分布式部署流程/
作者
Greek
发布于
2021年9月1日
许可协议