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

Docker 启动 MySQL,Redis

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

获取并启动 MySQL

获取最新的 MySQL 镜像

docker pull mysql

启动 MySQL

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

获取并启动 Redis

获取最新的 Redis 镜像

docker pull redis

启动 Redis

docker run -p 6379:6379 -d redis

使用 Maven Exec 插件进行部署

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

            <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 命令对项目进行打包

mvn package

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

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

使用 Docker 部署项目

在当前项目文件中编写 Dockerfile

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 镜像文件,在当前目录运行如下命令

docker build .

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

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

docker pull nginx

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

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 遇到错误会自动重启。

 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。