目录
一、前言
基于容器化部署微服务的实施方案目前在很多团队中实践应用,得益于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负载均衡的过程,希望对看到的同学有用哦,本篇到此结束,感谢观看。