【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解

目录

一、前言

二、前置准备

2.1 基本环境

2.2 准备一个springboot工程

2.2.1 准备几个测试接口

2.3 准备Dockerfile文件

2.4 打包上传到服务器

三、制作微服务镜像与运行服务镜像

3.1 拷贝Dockerfile文件到服务器

3.2 制作服务镜像

3.3 启动镜像服务

3.4 访问一下服务接口

四、配置负载均衡

4.1 源码包方式安装nginx

4.1.1 下载nginx安装包

4.1.2 解压安装包

4.1.3 进入解压后的安装包目录

4.1.4 编译安装

4.1.5 启动nginx

4.1.6 检查nginx服务是否启动成功

4.1.7 访问nginx主页

4.1.8 nginx其他命令补充

4.2 启动另外两个微服务容器

4.3 配置负载均衡

4.3.1 配置nginx负载均衡

4.3.2 负载均衡效果验证

4.4 固定微服务容器IP的方式配置负载均衡

4.4.1 创建一个docker网络

4.4.2 使用指定IP的方式启动三个微服务容器

4.4.3 测试访问服务接口

4.4.4 配置nginx负载均衡

4.5 使用Docker Compose配置负载均衡

4.5.1 创建docker网络

4.5.2 创建nginx.conf配置文件

4.5.3 创建docker-compose文件

4.5.4 启动容器

五、写在文末


一、前言

基于容器化部署微服务的实施方案目前在很多团队中实践应用,得益于docker 领域解决方案的完善,生态和组件的丰富,以及k8s的盛行,于是微服务接入docker进行部署也成为一种比较主流的方式,不过一旦项目上线,高可用问题在任何一个系统中都是需要亟待解决的,使用docker部署springboot也不例外,在不引入k8s的情况下,如何低成本的快速实现docker微服务多节点扩容呢,本篇将详细介绍一下。

二、前置准备

在正式开始操作之前,你需要提前做下面几项准备,以确保后面的部署、实施和相关的操作能够顺利完成。

2.1 基本环境

  • 云服务器或虚拟机,最低,2C4G;
  • 服务器安装了Docker环境,以及Docker Compose环境;
  • 本地JDK(JDK17),Maven,Idea等;

2.2 准备一个springboot工程

如下在本地创建一个springboot工程

2.2.1 准备几个测试接口

方便后面的测试效果

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DockerController {

    //localhost:8081/test
    @GetMapping("/test")
    public String test(){
        return "docker test";
    }

}

本地启动之后,确保接口能够正常调用

2.3 准备Dockerfile文件

在resources目录下添加一个Dockerfile文件,内容如下:

FROM  openjdk:17-jdk-alpine
ADD ./boot-docker.jar /app/boot-docker.jar
ENTRYPOINT ["java", "-jar", "/app/boot-docker.jar"]

2.4 打包上传到服务器

使用maven命令对上面的工程打包,将jar包上传到服务器目录

为了确保可用,使用java -jar命令启动一下

三、制作微服务镜像与运行服务镜像

使用docker的方式运行微服务,首先需要基于Dockerfile文件将原始的服务jar包制作成镜像,参考下面的操作过程

3.1 拷贝Dockerfile文件到服务器

在服务器目录与jar包同目录下,创建一个Dockerfile文件,将上述Dockerfile的内容拷贝进去

3.2 制作服务镜像

使用下面的命令,将本次的微服务jar包制作成docker镜像

  • 这里有个前提,需要服务器提前安装好docker compose组件,否则无法使用这个命令;

docker build -t boot-docker:1.0 .

执行成功后,通过docker imags命令检查微服务镜像是否生成

3.3 启动镜像服务

使用下面的命令启动第一个镜像服务

docker run -d -it -p 8081:8081 --name=boot-docker-1 boot-docker:1.0

3.4 访问一下服务接口

访问工程中预留的接口,看到如下效果,说明服务正常启动可用了

四、配置负载均衡

目前在项目中使用nginx作为路由转发,负载均衡的配置非常普遍,下面就以nginx为例进行说明。

4.1 源码包方式安装nginx

4.1.1 下载nginx安装包

使用下面的命令下载

wget http://nginx.org/download/nginx-1.20.2.tar.gz

4.1.2 解压安装包

执行下面的命令

tar -zxvf nginx-1.20.2.tar.gz -C /usr/local/src/

4.1.3 进入解压后的安装包目录

cd /usr/local/src/nginx-1.20.2

4.1.4 编译安装

依次执行下面的命令

./configure
 
make
 
make install

执行过程

4.1.5 启动nginx

切换到nginx的安装目录

cd /usr/local/nginx

执行下面的命令,启动nginx服务

./sbin/nginx

4.1.6 检查nginx服务是否启动成功

ps -ef | grep nginx

4.1.7 访问nginx主页

如果能够正常启动,访问下80端口,看到下面的效果说明nginx服务启动成功

4.1.8 nginx其他命令补充

这里补充一下其他的几个nginx常用命令

nginx -s reload            # 重新载入配置文件
nginx -s reopen            # 重启 Nginx
nginx -s stop              # 停止 Nginx

4.2 启动另外两个微服务容器

参照2.3 的方式,再启动另外两个服务镜像,使用不同的端口进行区分

docker run -d -it -p 8082:8081 --name=boot-docker-2 boot-docker:1.0
docker run -d -it -p 8083:8081 --name=boot-docker-3 boot-docker:1.0

通过docker ps命令,可以看到三个镜像服务都正常启动了

依次访问一下各自的服务接口,确保可以正常使用

第一个服务

第二个服务

第三个服务

4.3 配置负载均衡

上面的服务环境和nginx服务启动之后,接下来就可以配置负载均衡了

4.3.1 配置nginx负载均衡

将下面的配置信息拷贝到nginx.conf文件中

upstream backend {
        server 101.221.34.177:8081;
        server 101.221.34.177:8082;
        server 101.221.34.177:8083;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

配置完成之后,注意重启nginx

4.3.2 负载均衡效果验证

在上面的配置中,配置监听80端口,然后直接被路由到各个服务模块,各个服务模块直接访问自身的默认的那个接口,我们可以通过查看日志观察效果,上述负载均衡的配置中,没有指定具体的方式,默认采用轮询的策略

第一次访问:

第二次访问:

第三次访问:

4.4 固定微服务容器IP的方式配置负载均衡

在上述的操作中,采用的方式是基于同一个原始镜像,启动多个容器的方式,最后配置负载均衡的效果,在目前金仓的部署方式中,各个微服务容器采用的是固定IP的形式启动的,下面再补充一下这种方式的配置过程。

4.4.1 创建一个docker网络

使用下面的命令自定义一个docker网络

  • 指定的IP段根据服务器自身的情况设置

docker network create --subnet=192.168.100.0/24 my_custom_network

4.4.2 使用指定IP的方式启动三个微服务容器

依次执行下面的命令

docker run -d -it -p 8085:8081 --name boot-docker-5 --network my_custom_network --ip 192.168.100.10 boot-docker:1.0
docker run -d -it -p 8086:8081 --name boot-docker-6 --network my_custom_network --ip 192.168.100.11 boot-docker:1.0
docker run -d -it -p 8087:8081 --name boot-docker-7 --network my_custom_network --ip 192.168.100.12 boot-docker:1.0

4.4.3 测试访问服务接口

访问工程中预留的接口,看到如下效果,说明服务正常启动可用了

4.4.4 配置nginx负载均衡

只需要修改一下upstream中的信息即可

 upstream backend {
        server 192.168.100.10:8085;
        server 192.168.100.11:8086;
        server 192.168.100.12:8087;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

4.5 使用Docker Compose配置负载均衡

4.5.1 创建docker网络

使用自定义的网络,可以确保微服务和nginx的容器在同一个网络域

docker network create --driver bridge --subnet=172.19.0.0/24 network1

4.5.2 创建nginx.conf配置文件

自定义一个nginx.conf配置文件,用于在启动nginx容器的时候作映射,可以直接拷贝上面的做简单的修改使用,关键是负载均衡那里的配置

upstream backend {
        server 172.19.0.5:8085;
        server 172.19.0.6:8086;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            #proxy_pass http://192.168.100.10:8085;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

4.5.3 创建docker-compose文件

在nginx.conf相同的目录下创建一个docker-compose文件

参考下面的配置信息,将其拷贝到docker-compose.yml文件中

version: '3'
services:
  app1:
    image: boot-docker:1.0
    container_name: boot-docker-5
    networks:
      network1:
        ipv4_address: 172.19.0.5
    ports:
      - "8085:8081"

  app2:
    image: boot-docker:1.0
    container_name: boot-docker-6
    networks:
      network1:
        ipv4_address: 172.19.0.6
    ports:
      - "8086:8081"

  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - app1
      - app2
    networks:
      network1:
        ipv4_address: 172.19.0.7

networks:
  network1:
    external: true

4.5.4 启动容器

执行下面的命令启动微服务容器,和nginx

docker-compose up -d

验证下是否启动成功

五、写在文末

本文通过实际操作详细演示了如何基于springboot制作微服务镜像,以及开启多个微服务容器配置nginx负载均衡的过程,希望对看到的同学有用哦,本篇到此结束,感谢观看。

评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码农叔叔

谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值