8 容器化微服务

文章目录

前面的文章:

1、1 一个测试驱动的Spring Boot应用程序开发

2、2 使用React构造前端应用

3、3 试驱动的Spring Boot应用程序开发数据层示例

4、4 向微服务架构转变

5、5 转向事件驱动的架构

6、6 网关和配置服务器

7、7 集中式日志和分布式跟踪

代码:下载

前面的微服务都是在本地环境下执行的,包括微服务、RabbitMQ、Consul、前端等,需要安装JDK、相关的服务器等,随着架构的发展,可能需要引入其他工具和服务,这些工具和服务有自己的安装过程,具体取决于操作系统及其版本。

总体而言,想在各种环境中运行后端系统,无论是什么OS版本,理想情况下,希望能受益于"一次构建,随处部署"策略,并避免在所部署系统的每种环境中重复执行所有配置和安装步骤,而且,部署尽可能简单。

原来,打包系统的一种方法是创建虚拟机(VM)。有几种创建和运行虚拟机的解决方案,称为虚拟机监控程序。其优点是一台管理机可以同时运行多个VM,共享硬件资源,每个VM都需要自己的操作系统,然后通过该监控程序将其连接到主机的CPU、RAM和硬盘等。

这个方案中,可以从Linux发行版开始创建一个VM,并在其中设置和安装运行系统所需的工作和服务:Consul、RabbitMQ、Java运行时、JAR应用程序等。一旦虚拟机正常工作,就可以将其转移到运行了虚拟机监控程序的其他任何计算机上。其层次结构如图所示:
虚拟机 Gateway Consul RabbitMQ Multiplication Gamification Logs Linux OS(安装了Java) 虚拟机监控程序 主机的操作系统
(如果运行裸机监控程序,则不需要) 主机的硬件

但是,将所有程序放到一个虚拟机中并不灵活,如果要扩展,则必须进入虚拟机,添加新实例,并确保分配更多CPU、内存等,需要了解所有组件的工作原理,部署过程不再那么容易。

更动态的方法是为每个服务和工具配备独立的虚拟机,然后,添加一些网络配置,确保它们可以互相连接。由于使用服务发现和动态扩展,可以添加更多运行了微服务的虚拟机实例,并透明地使用。这些新实例只要使用其地址在Consul中注册即可。层次结构如图所示。这比单个VM更好,但考虑到每个虚拟机都需要自己的操作系统,会浪费大量资源,而且,在虚拟机编排方面带来很多挑战:监视、创建新实例、配置网络、存储等。
虚拟机 VM Logs Linux VM RabbitMQ Linux VM Consul Linux VM Multiplication Linux VM Gamification Linux VM Gateway Linux 虚拟机监控程序 主机的操作系统
(如果运行裸机监控程序,则不需要) 主机的硬件

随着虚拟化技术的发展,虚拟机已经被废弃了,容器成为主流的应用程序虚拟化方式。因为容器不需要安装操作系统,体积要小得多,占用资源也更少。另外,像Docker这样的容器化平台大大简化了云和本地部署,并提供易于使用的工具来打包应用程序,将它们作为容器运行并在公共注册表中共享。

Docker

容器在业界存在很多年了,但Docker的流行使容器重焕光彩,因此许多容器的定义和观点都是从Docker的架构中产生的。Docker实在太流行了,以至于容器化也称为Docker化。Docker是一个基于Linux内核的、构建、传输和运行轻量级容器的平台。Docker默认支持Linux平台。借助在Virtual Box之上运行的Boot2Docker, Docker也支持Mac和Windows平台。亚马逊的EC2 Container Service(ECS)默认支持在AWS EC2实例上运行Docker。Docker可以安装在裸机上,也可以安装在传统的虚拟机上,比如VMWare或Hyper-V。

在Docker中,可将应用程序及其可能需要的任何支持组件打包为映像(image),这些映像可以基于从Docker注册表中提取的其他现有映像,可以重复使用并节省时间,映像的官方注册表是Docker Hub。例如,Multiplication微服务的映像可以基于JDK 21映像,然后,可在其上添加Spring Boot打包的JAR文件。要创建一个映像,需要编写一个Dockerfile文件,其中包含Docker CLI工具命令。Multiplication微服务的Dockerfile文件如下所示:

dockerfile 复制代码
FROM openjdk:21
COPY ./target/multiplication-0.0.1-SNAPSHOT.jar z:/_Docker/multiplication
WORKDIR z:/_Docker/multiplication
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "multiplication-0.0.1-SNAPSHOT.jar"]

这些命令告诉Docker使用官方映像opendjk的21版为基础,然后将可分发的.jar文件复制到文件夹z:/_Docker/multiplication,接着设置工作目录为拷贝到的目标文件夹z:/_Docker/multiplication,再使用EXPOSE开放8080端口来提供REST API访问,最后通过ENTRYPOINT运行命令,启动服务。

注意:这里使用Windows下的Docker,所以目录是Windows的访问方式,Linux下使用Docker更方便。

要构建映像,必须使用Docker CLI工具,该工具随标准Docker安装包一起提供,安装了Docker工具后,通常就可以使用。在使用Dockerfile文件构建映像时,有一个前提,就是要生成./target/multiplication-0.0.1-SNAPSHOT.jar文件,可以使用maven来生成,命令如:./mvnw clean package。有了基础,就可以执行构建命令了,过程如下所示:

bash 复制代码
> docker build -t multiplication:1.0.0 .
[+] Building 17.3s (8/8) FINISHED                                                                                                                  docker:default
 => [internal] load .dockerignore                                                                                                                            0.0s
 => => transferring context: 2B                                                                                                                              0.0s 
 => [internal] load build definition from Dockerfile                                                                                                         0.0s 
 => => transferring dockerfile: 236B                                                                                                                         0.0s 
 => [internal] load metadata for docker.io/library/openjdk:21                                                                                               16.9s 
 => [internal] load build context                                                                                                                            0.0s
 => => transferring context: 90B                                                                                                                             0.0s 
 => CACHED [1/3] FROM docker.io/library/openjdk:21@sha256:af9de795d1f8d3b6172f6c55ca9ba1c5768baa11bb2dc8af7045c7db9d4c33ac                                   0.0s 
 => [2/3] COPY ./target/multiplication-0.0.1-SNAPSHOT.jar /usr/src/multiplication/                                                                           0.1s
 => [3/3] WORKDIR /usr/src/multiplication/                                                                                                                   0.0s 
 => exporting to image                                                                                                                                       0.2s 
 => => exporting layers                                                                                                                                      0.2s 
 => => writing image sha256:ee85066623658180d950aff3c53a15df0a998232b3c0ddbc07153a216e223121                                                                 0.0s 
 => => naming to docker.io/library/multiplication:1.0.0                                                                                                      0.0s 

使用docker images命令,就可以看到映像已经创建,如下所示:

bash 复制代码
> docker images
REPOSITORY                                             TAG          IMAGE ID       CREATED         SIZE
multiplication                                         1.0.0        ee8506662365   2 minutes ago   571MB
...

构建映像后,就可以在本地使用了,可将其作为容器运行,该容器是映像的运行实例,运行容器的命令如下所示:

bash 复制代码
> docker run -it -p 18080:8080 multiplication:1.0.0

如果本地镜像不可用,Docker的run命令会从服务器获取镜像(如果服务器存在该镜像)并运行。当容器执行时,这个容器无法正常执行,查看日志可以看到如下错误:

bash 复制代码
2023-12-27 11:59:21 2023-12-27T03:59:21.268Z ERROR 1 --- [multiplication] [           main] [                                                 ] o.s.c.c.s.ConsulServiceRegistry          : Error registering service with consul: NewService{id='multiplication', name='multiplication', tags=[], address='6732d0548338', meta={secure=false}, port=8080, enableTagOverride=null, check=Check{script='null', dockerContainerID='null', shell='null', interval='10s', ttl='null', http='http://6732d0548338:8080/actuator/health', method='null', header={}, tcp='null', timeout='null', deregisterCriticalServiceAfter='null', tlsSkipVerify=null, status='null', grpc='null', grpcUseTLS=null}, checks=null}
2023-12-27 11:59:21 
2023-12-27 11:59:25 2023-12-27T03:59:25.918Z ERROR 1 --- [multiplication] [           main] [                                                 ] o.s.c.c.s.ConsulServiceRegistry          : Error registering service with consul: NewService{id='multiplication', name='multiplication', tags=[], address='6732d0548338', meta={secure=false}, port=8080, enableTagOverride=null, check=Check{script='null', dockerContainerID='null', shell='null', interval='10s', ttl='null', http='http://6732d0548338:8080/actuator/health', method='null', header={}, tcp='null', timeout='null', deregisterCriticalServiceAfter='null', tlsSkipVerify=null, status='null', grpc='null', grpcUseTLS=null}, checks=null}
2023-12-27 11:59:25 
2023-12-27 11:59:25 com.ecwid.consul.transport.TransportException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:8500 [localhost/127.0.0.1] failed: Connection refused

因为容器无法正常连接Consul和RabbitMQ,默认情况下,Spring Boot会与Consul一样尝试在localhost上查找RabbitMQ主机。在容器中,localhost指容器自己,而不是其他,要想正确设置后端系统在Docker中运行,必须将RabbitMQ和Consul部署为容器,并使用Docker网络将其连接起来,层次结构如图所示:
虚拟机 容器 Logs 容器 RabbitMQ 容器 Consul 容器 Multiplication 容器 Gamification 容器 Gateway Docker 主机的操作系统
(如果运行裸机监控程序,则不需要) 主机的硬件

下面就来看看Spring Boot如何构建Docker映像,这样就不需要自己创建Dockerfile了。

Spring Boot和Buildpacks

Spring Boot支持云原生的Buildpacks来构建Open Container Initiative(OCI)镜像,旨在帮助打包应用程序以将其部署到任何云提供商的项目,可在Docker和其他容器平台中运行生成的镜像。

Buildpacks插件可以基于项目的Maven配置准备一个计划,然后打包一个准备部署的Docker镜像,此外,以某种方式将镜像分层组织,以便未来的应用程序版本甚至使用该工具构建的其他微服务镜像(例如,包含所有Spring Boot核心库的层)都可以重用,有助于快速测试和部署。

如果从命令行运行build-image目标,就可以看到Buildpacks在执行:
./mvnw spring-boot:build-image

在Gamification项目文件夹下,执行上述命令,就可以看到相应的构建镜像的日志,如果一切顺利,可以在最后看到如下日志:

bash 复制代码
[INFO] Building image 'docker.io/library/gamification:0.0.1-SNAPSHOT'
...

Docker标记设置为pom.xml文件gamification:0.0.1-SNAPSHOT中指定的Maven工件的名称和版本,docker.io/library/是所有公共Docker镜像的默认值,也可以自定义选项。

可以像前面执行镜像一样运行容器,命令如下:

bash 复制代码
> docker run -it -p 18081:8081 gamification:0.0.1-SNAPSHOT

类似地,会出现相同的错误,应用程序无法连接到RabbitMQ和Consul,它们需要两种服务。

如果想完全控制要构建的内容以及要包含在镜像中的工具和文件,最后自定义Dockerfile命令,这并不难。

在Docker中运行系统

现在,将系统的每个组件构建或找到一个Docker镜像,以便进行容器化部署:

  • Multiplication、Gamification、Gateway和Logs微服务:将使用Spring Boot的Maven插件和Buildpacks来生成这些Docker镜像。
  • RabbitMQ:前面就已经使用Docker来部署了。
  • Consul:前面也采用了Docker的镜像来提供服务了。
  • 前端:如果想在Docker中部署整个系统,还需要Web服务器来托管React构建生成的HTML/Javascript文件。可以使用Nginx这样的轻量级静态服务器,使用Docker官方镜像。

整个系统计划6个不同的Docker镜像并使用两个公共的Docker镜像,如下所示:
REST API调用
8000 获取HTML/JS
3000 Consul的
配置导入器 consul-importer:1.0
(based consul:1.11.1) 集中式日志 logs:0.0.1
(Buildpacks) Consul consul:1.11.1 RabbitMQ rabbitmq:3-
management Gamification gamification:0.0.1
(Buildpacks) Multiplication multiplication:0.0.1
(Buildpacks) 前端的Web服务器 challenge-frontend:1.0
(based on nginx:1.21.5) 网关 gateway:0.0.1
(Buildpacks) 浏览器

Docker化微服务

首先为Spring Boot应用程序构建所有镜像,在每个项目文件夹下执行以下命令:

bash 复制代码
> ./mvnw spring-boot:build-image

Docker化前端

在前端项目创建一个Dockerfile文件,只要两条命令,指定基本的nginx镜像,将build文件夹复制到容器目录下,如下所示:

bash 复制代码
FROM nginx:1.25.3
COPY build /usr/share/nginx/html

在创建Docker镜像前,先执行npm run build命令,编译React项目,生成build文件夹,就可以创建Docker镜像了,命令如下:

bash 复制代码
> docker build -t challenge-frontend:1.0 .

Docker化配置导入器

还需要一个Docker镜像来加载预定义的集中式配置,已经有一个运行服务器的Consul容器,通过运行一个额外的容器来执行Consul CLI来加载一些KV数据:一个Docker配置文件。这样,可以在Docker中运行微服务时使用预加载的配置文件配置,因为需要不同的RabbitMQ参数。

想要在文件中加载配置,可在本地Consul服务器中创建该配置,然后,通过CLI命令将其导出。使用UI创建config根目录,并创建一个名为defaults,docker的子文件夹。在内部,创建一个名为application.yml的键,其配置如下所示:

yml 复制代码
spring:
  rabbitmq:
    host: rabbitmq
  cloud:
    consul:
      discovery:
        instance-id: ${spring.application.name}-${random.int(1000)}

该配置执行如下操作:

  • 将RabbitMQ主机设为rabbitmq,覆盖默认的localhost,要确保消息代理的容器在该地址可用。
  • 覆盖分配给正在运行的服务的实例标识符,以在服务注册表中使用。默认的Spring Consul配置将应用程序名称与端口号连接在一起,该方法对容器无效。在Docker中运行同一服务的多个实例时,都使用相同的内部端口,因此会有相同的标识符。为解决这个问题,可使用随机数为后缀。

下图显示了Consul用户界面添加的配置:

然后将配置导出到文件,可在Consul终端执行如下命令:

bash 复制代码
> consul kv export config/ > consul-kv-docker.json

文件内容如下:

json 复制代码
[
        {
                "key": "config/",
                "flags": 0,
                "value": ""
        },
        {
                "key": "config/defaults,docker/application.yml",
                "flags": 0,
                "value": "c3ByaW5nOgogIHJhYmJpdG1xOgogICAgaG9zdDogcmFiYml0bXEKICBjbG91ZDoKICAgIGNvbnN1bDoKICAgICAgZGlzY292ZXJ5OgogICAgICAgIGluc3RhbmNlLWlkOiAke3NwcmluZy5hcHBsaWNhdGlvbi5uYW1lfS0ke3JhbmRvbS5pbnQoMTAwMCl9"
        }
]

现在,需要创建一个docker文件夹,存放Dockerfile文件,以及所导出的json配置,便于创建Docker镜像,Dockerfile如下:

Dockerfile 复制代码
FROM consul:1.11.1
COPY ./consul-kv-docker.json /usr/src/consul/
WORKDIR /usr/src/consul
ENV CONSUL_HTTP_ADDR=consul:8500
ENTRYPOINT until consul kv import @consul-kv-docker.json; do echo "正在启动 Consul"; sleep 2; done

这个镜像使用Consul为基础,将json文件复制到镜像内部,并将工作目录设置为与文件相同,然后,使用ENV命令设置环境变量,以使用远程主机访问服务器,这里是consul:8500,最后,是一个内联的shell脚本,遵循until ... done模式,直到运行命令成功为止,两次尝试之间的间隔为2秒,主命令是consul kv import @consul-kv-docker.json,将文件内容导入KV存储器,需要循环执行,因为此时,Consul服务器可能尚未启动。

现在,就可用构建容器了:

bash 复制代码
> docker build -t consul-importer:1.0 .

Docker Compose

构建完所有镜像后,需要将系统作为一组容器运行,下面就来看看然后启动这些容器并通信。

可使用单个Docker命令来启动所有必需的容器,并设置网络以使它们彼此连接,但是,如果要告诉其他人如何启动系统,需要向其传递包含所有这些命令和说明的脚本或文档。Docker有更好的方法可用对容器配置和部署指令进行分组:Docker Compose。

通过Compose,使用YAML文件来定义基于多个容器的应用程序,然后,使用命令docker-compose来运行所有服务。需要创建一个docker-compose.yml配置文件,下面给出了RabbitMQ和Consul的配置:

yaml 复制代码
version: "3"

services:
  consul-dev:
    image: consul:latest
    container_name: d_consul
    ports:
      - '8500:8500'
      - '8600:8600/udp'
    command: 'agent -dev -node=learnmicro -client=0.0.0.0 -log-level=INFO'
    networks:
      - microservices
  rabbitmq-dev:
    image: rabbitmq:management
    container_name: d_rabbitmq
    ports:
      - '5672:5672'
      - '15672:15672'
    networks:
      - microservices

networks:
  microservices:
    driver: bridge

这里定义了两个服务:consul-dev和rabbitmq-dev,可以用任何名称,-dev后缀,表明都在开发模式下运行(没有集群的独立节点)。这两个服务使用的是没有创建的Docker容器,使用Docker Hub中的公共镜像。container_name指定了容器名称,其他容器可以通过名称来找到它,这意味着应用程序可以使用地址d_rabbitmq:5672而不是默认的localhost:5672连接到RabbitMQ服务器。一旦指定了名称,就无法将服务扩展到多个容器了。

这里还定义了一个类型为bridge的网络,名称为microservices,驱动程序的类型为默认类型,用于连接独立的容器。然后,在每个服务定义中使用参数networks将microservices网络设置为可以访问的网络,这意味着这些服务可以互相连接,因为它们属于同一网络。Docker网络与主机网络是隔离的,除了使用ports参数显示公开的服务之外,无法访问任何服务。

现在,使用这个docker-compose.yml文件来运行Consul和RabbitMQ容器,需要执行命令:

bash 复制代码
> docker-compose up

Docker Compose会自动获取docker-compose.yml而不指定名称,这是默认文件名,所有容器的输出都会附加到当前终端和容器。如果要在后台将其作为守护进程,只需要在命令中添加-d标志即可。执行命令后,可以看到如下日志:

bash 复制代码
> docker-compose up
[+] Running 3/0
 ✔ Network docker_microservices  Created                                                                                    0.0s
 ✔ Container d_rabbitmq          Created                                                                                    0.0s
 ✔ Container d_consul            Created                                                                                    0.0s
Attaching to d_consul, d_rabbitmq
d_consul    | ==> Starting Consul agent...
d_consul    |            Version: '1.11.1'
d_consul    |            Node ID: 'daa7c4ae-b987-1916-d574-b5bf8522fd81'
d_consul    |          Node name: 'learnmicro'
d_consul    |         Datacenter: 'dc1' (Segment: '<all>')
d_consul    |             Server: true (Bootstrap: false)
d_consul    |        Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
d_consul    |       Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
d_consul    |            Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
d_consul    |
d_consul    | ==> Log data will now stream in as it occurs:
d_consul    |
d_consul    | 2023-12-30T08:00:35.265Z [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:daa7c4ae-b987-1916-d574-b5bf8522fd81 Address:127.0.0.1:8300}]"
d_consul    | 2023-12-30T08:00:35.265Z [INFO]  agent.server.raft: entering follower state: follower="Node at 127.0.0.1:8300 [Follower]" leader=
d_consul    | 2023-12-30T08:00:35.266Z [INFO]  agent.server.serf.wan: serf: EventMemberJoin: learnmicro.dc1 127.0.0.1
d_consul    | 2023-12-30T08:00:35.266Z [INFO]  agent.server.serf.lan: serf: EventMemberJoin: learnmicro 127.0.0.1
d_consul    | 2023-12-30T08:00:35.266Z [INFO]  agent.router: Initializing LAN area manager
d_consul    | 2023-12-30T08:00:35.266Z [INFO]  agent.server: Adding LAN server: server="learnmicro (Addr: tcp/127.0.0.1:8300) (DC: dc1)"
d_consul    | 2023-12-30T08:00:35.266Z [INFO]  agent.server: Handled event for server in area: event=member-join server=learnmicro.dc1 area=wan
d_consul    | 2023-12-30T08:00:35.266Z [WARN]  agent: grpc: addrConn.createTransport failed to connect to {dc1-127.0.0.1:8300 0 learnmicro.dc1 <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:0->127.0.0.1:8300: operation was canceled". Reconnecting...
d_consul    | 2023-12-30T08:00:35.266Z [INFO]  agent: Started DNS server: address=0.0.0.0:8600 network=tcp
d_consul    | 2023-12-30T08:00:35.266Z [INFO]  agent: Started DNS server: address=0.0.0.0:8600 network=udp
d_consul    | 2023-12-30T08:00:35.267Z [INFO]  agent: Starting server: address=[::]:8500 network=tcp protocol=http
d_consul    | 2023-12-30T08:00:35.267Z [WARN]  agent: DEPRECATED Backwards compatibility with pre-1.9 metrics enabled. These metrics will be removed in a future version of Consul. Set `telemetry { disable_compat_1.9 = true }` to disable them.
d_consul    | 2023-12-30T08:00:35.267Z [INFO]  agent: Started gRPC server: address=[::]:8502 network=tcp
d_consul    | 2023-12-30T08:00:35.267Z [INFO]  agent: started state syncer
d_consul    | 2023-12-30T08:00:35.267Z [INFO]  agent: Consul agent running!
d_consul    | 2023-12-30T08:00:35.334Z [WARN]  agent.server.raft: heartbeat timeout reached, starting election: last-leader=
d_consul    | 2023-12-30T08:00:35.334Z [INFO]  agent.server.raft: entering candidate state: node="Node at 127.0.0.1:8300 [Candidate]" term=2
d_consul    | 2023-12-30T08:00:35.334Z [INFO]  agent.server.raft: election won: tally=1
d_consul    | 2023-12-30T08:00:35.334Z [INFO]  agent.server.raft: entering leader state: leader="Node at 127.0.0.1:8300 [Leader]"
d_consul    | 2023-12-30T08:00:35.334Z [INFO]  agent.server: cluster leadership acquired
d_consul    | 2023-12-30T08:00:35.334Z [INFO]  agent.server: New leader elected: payload=learnmicro
d_consul    | 2023-12-30T08:00:35.335Z [INFO]  agent.leader: started routine: routine="federation state anti-entropy"
d_consul    | 2023-12-30T08:00:35.335Z [INFO]  agent.leader: started routine: routine="federation state pruning"
d_consul    | 2023-12-30T08:00:35.336Z [INFO]  connect.ca: initialized primary datacenter CA with provider: provider=consul
d_consul    | 2023-12-30T08:00:35.336Z [INFO]  agent.leader: started routine: routine="intermediate cert renew watch"
d_consul    | 2023-12-30T08:00:35.336Z [INFO]  agent.leader: started routine: routine="CA root pruning"
d_consul    | 2023-12-30T08:00:35.336Z [INFO]  agent.leader: started routine: routine="CA root expiration metric"
d_consul    | 2023-12-30T08:00:35.336Z [INFO]  agent.leader: started routine: routine="CA signing expiration metric"
d_consul    | 2023-12-30T08:00:35.336Z [INFO]  agent.leader: started routine: routine="virtual IP version check"
d_consul    | 2023-12-30T08:00:35.336Z [INFO]  agent.server: member joined, marking health alive: member=learnmicro partition=default
d_consul    | 2023-12-30T08:00:35.357Z [INFO]  agent: Synced node info
d_consul    | 2023-12-30T08:00:35.736Z [INFO]  agent.server: federation state anti-entropy synced
d_rabbitmq  | 2023-12-30 08:00:36.816748+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:36.825064+00:00 [info] <0.222.0> Feature flags:   [ ] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:36.825093+00:00 [info] <0.222.0> Feature flags:   [ ] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:36.825103+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:36.825115+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:36.825125+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:36.825132+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:36.825140+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:37.044042+00:00 [noti] <0.44.0> Application syslog exited with reason: stopped
d_rabbitmq  | 2023-12-30 08:00:37.044110+00:00 [noti] <0.222.0> Logging: switching to configured handler(s); following messages may not be visible in this log output
d_rabbitmq  | 2023-12-30 08:00:37.053636+00:00 [noti] <0.222.0> Logging: configured log handlers are now ACTIVE
d_rabbitmq  | 2023-12-30 08:00:37.179591+00:00 [info] <0.222.0> ra: starting system quorum_queues
d_rabbitmq  | 2023-12-30 08:00:37.179697+00:00 [info] <0.222.0> starting Ra system: quorum_queues in directory: /var/lib/rabbitmq/mnesia/rabbit@892990533f7a/quorum/rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:37.228271+00:00 [info] <0.259.0> ra: meta data store initialised for system quorum_queues. 0 record(s) recovered
d_rabbitmq  | 2023-12-30 08:00:37.237355+00:00 [noti] <0.264.0> WAL: ra_log_wal init, open tbls: ra_log_open_mem_tables, closed tbls: ra_log_closed_mem_tables
d_rabbitmq  | 2023-12-30 08:00:37.242485+00:00 [info] <0.222.0> ra: starting system coordination
d_rabbitmq  | 2023-12-30 08:00:37.242512+00:00 [info] <0.222.0> starting Ra system: coordination in directory: /var/lib/rabbitmq/mnesia/rabbit@892990533f7a/coordination/rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:37.244060+00:00 [info] <0.272.0> ra: meta data store initialised for system coordination. 0 record(s) recovered
d_rabbitmq  | 2023-12-30 08:00:37.244209+00:00 [noti] <0.277.0> WAL: ra_coordination_log_wal init, open tbls: ra_coordination_log_open_mem_tables, closed tbls: ra_coordination_log_closed_mem_tables
d_rabbitmq  | 2023-12-30 08:00:37.247005+00:00 [info] <0.222.0>
d_rabbitmq  | 2023-12-30 08:00:37.247005+00:00 [info] <0.222.0>  Starting RabbitMQ 3.9.11 on Erlang 24.2 [jit]
d_rabbitmq  | 2023-12-30 08:00:37.247005+00:00 [info] <0.222.0>  Copyright (c) 2007-2021 VMware, Inc. or its affiliates.
d_rabbitmq  | 2023-12-30 08:00:37.247005+00:00 [info] <0.222.0>  Licensed under the MPL 2.0. Website: https://rabbitmq.com
d_rabbitmq  |
d_rabbitmq  |   ##  ##      RabbitMQ 3.9.11
d_rabbitmq  |   ##  ##
d_rabbitmq  |   ##########  Copyright (c) 2007-2021 VMware, Inc. or its affiliates.
d_rabbitmq  |   ######  ##
d_rabbitmq  |   ##########  Licensed under the MPL 2.0. Website: https://rabbitmq.com
d_rabbitmq  |
d_rabbitmq  |   Erlang:      24.2 [jit]
d_rabbitmq  |   TLS Library: OpenSSL - OpenSSL 1.1.1m  14 Dec 2021
d_rabbitmq  |
d_rabbitmq  |   Doc guides:  https://rabbitmq.com/documentation.html
d_rabbitmq  |   Support:     https://rabbitmq.com/contact.html
d_rabbitmq  |   Tutorials:   https://rabbitmq.com/getstarted.html
d_rabbitmq  |   Monitoring:  https://rabbitmq.com/monitoring.html
d_rabbitmq  |
d_rabbitmq  |   Logs: /var/log/rabbitmq/rabbit@892990533f7a_upgrade.log
d_rabbitmq  |         <stdout>
d_rabbitmq  |
d_rabbitmq  |   Config file(s): /etc/rabbitmq/conf.d/10-default-guest-user.conf
d_rabbitmq  |
d_rabbitmq  |   Starting broker...2023-12-30 08:00:37.247784+00:00 [info] <0.222.0>
d_rabbitmq  | 2023-12-30 08:00:37.247784+00:00 [info] <0.222.0>  node           : rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:37.247784+00:00 [info] <0.222.0>  home dir       : /var/lib/rabbitmq
d_rabbitmq  | 2023-12-30 08:00:37.247784+00:00 [info] <0.222.0>  config file(s) : /etc/rabbitmq/conf.d/10-default-guest-user.conf
d_rabbitmq  | 2023-12-30 08:00:37.247784+00:00 [info] <0.222.0>  cookie hash    : dw5XV6bWOUm3+unVnJBRhw==
d_rabbitmq  | 2023-12-30 08:00:37.247784+00:00 [info] <0.222.0>  log(s)         : /var/log/rabbitmq/rabbit@892990533f7a_upgrade.log
d_rabbitmq  | 2023-12-30 08:00:37.247784+00:00 [info] <0.222.0>                 : <stdout>
d_rabbitmq  | 2023-12-30 08:00:37.247784+00:00 [info] <0.222.0>  database dir   : /var/lib/rabbitmq/mnesia/rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:37.384276+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:37.384342+00:00 [info] <0.222.0> Feature flags:   [ ] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:37.384355+00:00 [info] <0.222.0> Feature flags:   [ ] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:37.384365+00:00 [info] <0.222.0> Feature flags:   [ ] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:37.384395+00:00 [info] <0.222.0> Feature flags:   [ ] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:37.384405+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:37.384412+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:37.384420+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:37.384458+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:37.384483+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.004359+00:00 [info] <0.222.0> Running boot step pre_boot defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.004418+00:00 [info] <0.222.0> Running boot step rabbit_global_counters defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.004814+00:00 [info] <0.222.0> Running boot step rabbit_osiris_metrics defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.004891+00:00 [info] <0.222.0> Running boot step rabbit_core_metrics defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.005486+00:00 [info] <0.222.0> Running boot step rabbit_alarm defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.008007+00:00 [info] <0.288.0> Memory high watermark set to 19256 MiB (20192341196 bytes) of 48142 MiB (50480852992 bytes) total
d_rabbitmq  | 2023-12-30 08:00:39.010387+00:00 [info] <0.290.0> Enabling free disk space monitoring
d_rabbitmq  | 2023-12-30 08:00:39.010418+00:00 [info] <0.290.0> Disk free limit set to 50MB
d_rabbitmq  | 2023-12-30 08:00:39.012262+00:00 [info] <0.222.0> Running boot step code_server_cache defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.012333+00:00 [info] <0.222.0> Running boot step file_handle_cache defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.012514+00:00 [info] <0.293.0> Limiting to approx 1048479 file handles (943629 sockets)
d_rabbitmq  | 2023-12-30 08:00:39.012642+00:00 [info] <0.294.0> FHC read buffering: OFF
d_rabbitmq  | 2023-12-30 08:00:39.012686+00:00 [info] <0.294.0> FHC write buffering: ON
d_rabbitmq  | 2023-12-30 08:00:39.013057+00:00 [info] <0.222.0> Running boot step worker_pool defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.013112+00:00 [info] <0.279.0> Will use 16 processes for default worker pool
d_rabbitmq  | 2023-12-30 08:00:39.013129+00:00 [info] <0.279.0> Starting worker pool 'worker_pool' with 16 processes in it
d_rabbitmq  | 2023-12-30 08:00:39.013989+00:00 [info] <0.222.0> Running boot step database defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.014230+00:00 [info] <0.222.0> Node database directory at /var/lib/rabbitmq/mnesia/rabbit@892990533f7a is empty. Assuming we need to join an existing cluster or initialise from scratch...
d_rabbitmq  | 2023-12-30 08:00:39.014286+00:00 [info] <0.222.0> Configured peer discovery backend: rabbit_peer_discovery_classic_config
d_rabbitmq  | 2023-12-30 08:00:39.014305+00:00 [info] <0.222.0> Will try to lock with peer discovery backend rabbit_peer_discovery_classic_config
d_rabbitmq  | 2023-12-30 08:00:39.014366+00:00 [info] <0.222.0> All discovered existing cluster peers:
d_rabbitmq  | 2023-12-30 08:00:39.014401+00:00 [info] <0.222.0> Discovered no peer nodes to cluster with. Some discovery backends can filter nodes out based on a readiness criteria. Enabling debug logging might help troubleshoot.
d_rabbitmq  | 2023-12-30 08:00:39.015937+00:00 [noti] <0.44.0> Application mnesia exited with reason: stopped
d_rabbitmq  | 2023-12-30 08:00:39.081730+00:00 [info] <0.222.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
d_rabbitmq  | 2023-12-30 08:00:39.081850+00:00 [info] <0.222.0> Successfully synced tables from a peer
d_rabbitmq  | 2023-12-30 08:00:39.088999+00:00 [info] <0.222.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
d_rabbitmq  | 2023-12-30 08:00:39.089061+00:00 [info] <0.222.0> Successfully synced tables from a peer
d_rabbitmq  | 2023-12-30 08:00:39.089088+00:00 [info] <0.222.0> Feature flag `drop_unroutable_metric`: supported, attempt to enable...
d_rabbitmq  | 2023-12-30 08:00:39.089201+00:00 [info] <0.222.0> Feature flag `drop_unroutable_metric`: mark as enabled=state_changing
d_rabbitmq  | 2023-12-30 08:00:39.089744+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.089791+00:00 [info] <0.222.0> Feature flags:   [~] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.089806+00:00 [info] <0.222.0> Feature flags:   [ ] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.089816+00:00 [info] <0.222.0> Feature flags:   [ ] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.089824+00:00 [info] <0.222.0> Feature flags:   [ ] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.089832+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.089839+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.089872+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.089882+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.089899+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.095985+00:00 [info] <0.222.0> Feature flag `drop_unroutable_metric`: mark as enabled=true
d_rabbitmq  | 2023-12-30 08:00:39.096903+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.096943+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.096959+00:00 [info] <0.222.0> Feature flags:   [ ] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.096969+00:00 [info] <0.222.0> Feature flags:   [ ] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.096995+00:00 [info] <0.222.0> Feature flags:   [ ] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.097005+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.097012+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.097020+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.097055+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.097083+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.103271+00:00 [info] <0.222.0> Feature flag `empty_basic_get_metric`: supported, attempt to enable...
d_rabbitmq  | 2023-12-30 08:00:39.103371+00:00 [info] <0.222.0> Feature flag `empty_basic_get_metric`: mark as enabled=state_changing
d_rabbitmq  | 2023-12-30 08:00:39.104171+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.104223+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.104242+00:00 [info] <0.222.0> Feature flags:   [~] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.104284+00:00 [info] <0.222.0> Feature flags:   [ ] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.104300+00:00 [info] <0.222.0> Feature flags:   [ ] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.104310+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.104321+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.104332+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.104343+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.104363+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.110373+00:00 [info] <0.222.0> Feature flag `empty_basic_get_metric`: mark as enabled=true
d_rabbitmq  | 2023-12-30 08:00:39.112267+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.112303+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.112324+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.112334+00:00 [info] <0.222.0> Feature flags:   [ ] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.112355+00:00 [info] <0.222.0> Feature flags:   [ ] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.112367+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.112375+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.112382+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.112391+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.112399+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.119750+00:00 [info] <0.222.0> Feature flag `implicit_default_bindings`: supported, attempt to enable...
d_rabbitmq  | 2023-12-30 08:00:39.119939+00:00 [info] <0.222.0> Feature flag `implicit_default_bindings`: mark as enabled=state_changing
d_rabbitmq  | 2023-12-30 08:00:39.121166+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.121204+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.121220+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.121258+00:00 [info] <0.222.0> Feature flags:   [~] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.121279+00:00 [info] <0.222.0> Feature flags:   [ ] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.121289+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.121354+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.121368+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.121376+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.121384+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.127174+00:00 [info] <0.222.0> Waiting for Mnesia tables for 30000 ms, 0 retries left
d_rabbitmq  | 2023-12-30 08:00:39.127322+00:00 [info] <0.222.0> Successfully synced tables from a peer
d_rabbitmq  | 2023-12-30 08:00:39.127367+00:00 [info] <0.222.0> Feature flag `implicit_default_bindings`: mark as enabled=true
d_rabbitmq  | 2023-12-30 08:00:39.129376+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.129440+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.129459+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.129472+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.129496+00:00 [info] <0.222.0> Feature flags:   [ ] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.129512+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.129523+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.129534+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.129557+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.129583+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.135071+00:00 [info] <0.222.0> Feature flag `maintenance_mode_status`: supported, attempt to enable...
d_rabbitmq  | 2023-12-30 08:00:39.135142+00:00 [info] <0.222.0> Feature flag `maintenance_mode_status`: mark as enabled=state_changing
d_rabbitmq  | 2023-12-30 08:00:39.135868+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.135900+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.135920+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.135952+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.135972+00:00 [info] <0.222.0> Feature flags:   [~] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.135983+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.135990+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.135999+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.136006+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.136013+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.141870+00:00 [info] <0.222.0> Creating table rabbit_node_maintenance_states for feature flag `maintenance_mode_status`
d_rabbitmq  | 2023-12-30 08:00:39.145109+00:00 [info] <0.222.0> Feature flag `maintenance_mode_status`: mark as enabled=true
d_rabbitmq  | 2023-12-30 08:00:39.147259+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.147315+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.147335+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.147345+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.147373+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.147393+00:00 [info] <0.222.0> Feature flags:   [ ] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.147404+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.147412+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.147440+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.147462+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.152954+00:00 [info] <0.222.0> Feature flag `quorum_queue`: supported, attempt to enable...
d_rabbitmq  | 2023-12-30 08:00:39.153033+00:00 [info] <0.222.0> Feature flag `quorum_queue`: mark as enabled=state_changing
d_rabbitmq  | 2023-12-30 08:00:39.153716+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.153766+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.153783+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.153808+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.153821+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.153829+00:00 [info] <0.222.0> Feature flags:   [~] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.153837+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.153859+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.153868+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.153890+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.158923+00:00 [info] <0.222.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
d_rabbitmq  | 2023-12-30 08:00:39.159030+00:00 [info] <0.222.0> Successfully synced tables from a peer
d_rabbitmq  | 2023-12-30 08:00:39.159057+00:00 [info] <0.222.0> Feature flag `quorum_queue`:   migrating Mnesia table rabbit_queue...
d_rabbitmq  | 2023-12-30 08:00:39.169647+00:00 [info] <0.222.0> Feature flag `quorum_queue`:   migrating Mnesia table rabbit_durable_queue...
d_rabbitmq  | 2023-12-30 08:00:39.180353+00:00 [info] <0.222.0> Feature flag `quorum_queue`:   Mnesia tables migration done
d_rabbitmq  | 2023-12-30 08:00:39.180398+00:00 [info] <0.222.0> Feature flag `quorum_queue`: mark as enabled=true
d_rabbitmq  | 2023-12-30 08:00:39.182022+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.182050+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.182062+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.182071+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.182119+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.182143+00:00 [info] <0.222.0> Feature flags:   [x] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.182155+00:00 [info] <0.222.0> Feature flags:   [ ] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.182189+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.182242+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.182257+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.188097+00:00 [info] <0.222.0> Feature flag `stream_queue`: supported, attempt to enable...
d_rabbitmq  | 2023-12-30 08:00:39.188195+00:00 [info] <0.222.0> Feature flag `stream_queue`: mark as enabled=state_changing
d_rabbitmq  | 2023-12-30 08:00:39.189025+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.189057+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.189078+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.189105+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.189122+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.189132+00:00 [info] <0.222.0> Feature flags:   [x] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.189146+00:00 [info] <0.222.0> Feature flags:   [~] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.189153+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.189160+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.189168+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.194781+00:00 [info] <0.222.0> Feature flag `stream_queue`: mark as enabled=true
d_rabbitmq  | 2023-12-30 08:00:39.196539+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.196589+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.196605+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.196614+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.196644+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.196655+00:00 [info] <0.222.0> Feature flags:   [x] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.196663+00:00 [info] <0.222.0> Feature flags:   [x] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.196684+00:00 [info] <0.222.0> Feature flags:   [ ] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.196718+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.196737+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.202944+00:00 [info] <0.222.0> Feature flag `user_limits`: supported, attempt to enable...
d_rabbitmq  | 2023-12-30 08:00:39.203087+00:00 [info] <0.222.0> Feature flag `user_limits`: mark as enabled=state_changing
d_rabbitmq  | 2023-12-30 08:00:39.203820+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.203867+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.203891+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.203901+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.203909+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.203932+00:00 [info] <0.222.0> Feature flags:   [x] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.203942+00:00 [info] <0.222.0> Feature flags:   [x] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.203950+00:00 [info] <0.222.0> Feature flags:   [~] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.203957+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.203967+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.210370+00:00 [info] <0.222.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
d_rabbitmq  | 2023-12-30 08:00:39.210569+00:00 [info] <0.222.0> Successfully synced tables from a peer
d_rabbitmq  | 2023-12-30 08:00:39.222439+00:00 [info] <0.222.0> Feature flag `user_limits`: mark as enabled=true
d_rabbitmq  | 2023-12-30 08:00:39.224371+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.224401+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.224427+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.224436+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.224474+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.224485+00:00 [info] <0.222.0> Feature flags:   [x] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.224493+00:00 [info] <0.222.0> Feature flags:   [x] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.224524+00:00 [info] <0.222.0> Feature flags:   [x] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.224537+00:00 [info] <0.222.0> Feature flags:   [ ] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.224546+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.230739+00:00 [info] <0.222.0> Feature flag `virtual_host_metadata`: supported, attempt to enable...
d_rabbitmq  | 2023-12-30 08:00:39.230830+00:00 [info] <0.222.0> Feature flag `virtual_host_metadata`: mark as enabled=state_changing
d_rabbitmq  | 2023-12-30 08:00:39.231752+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.231790+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.231809+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.231844+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.231865+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.231875+00:00 [info] <0.222.0> Feature flags:   [x] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.231902+00:00 [info] <0.222.0> Feature flags:   [x] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.231918+00:00 [info] <0.222.0> Feature flags:   [x] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.231927+00:00 [info] <0.222.0> Feature flags:   [~] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.231935+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.237305+00:00 [info] <0.222.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
d_rabbitmq  | 2023-12-30 08:00:39.237434+00:00 [info] <0.222.0> Successfully synced tables from a peer
d_rabbitmq  | 2023-12-30 08:00:39.249094+00:00 [info] <0.222.0> Feature flag `virtual_host_metadata`: mark as enabled=true
d_rabbitmq  | 2023-12-30 08:00:39.250829+00:00 [info] <0.222.0> Feature flags: list of feature flags found:
d_rabbitmq  | 2023-12-30 08:00:39.250873+00:00 [info] <0.222.0> Feature flags:   [x] drop_unroutable_metric
d_rabbitmq  | 2023-12-30 08:00:39.250892+00:00 [info] <0.222.0> Feature flags:   [x] empty_basic_get_metric
d_rabbitmq  | 2023-12-30 08:00:39.250904+00:00 [info] <0.222.0> Feature flags:   [x] implicit_default_bindings
d_rabbitmq  | 2023-12-30 08:00:39.250928+00:00 [info] <0.222.0> Feature flags:   [x] maintenance_mode_status
d_rabbitmq  | 2023-12-30 08:00:39.250944+00:00 [info] <0.222.0> Feature flags:   [x] quorum_queue
d_rabbitmq  | 2023-12-30 08:00:39.250955+00:00 [info] <0.222.0> Feature flags:   [x] stream_queue
d_rabbitmq  | 2023-12-30 08:00:39.250966+00:00 [info] <0.222.0> Feature flags:   [x] user_limits
d_rabbitmq  | 2023-12-30 08:00:39.250990+00:00 [info] <0.222.0> Feature flags:   [x] virtual_host_metadata
d_rabbitmq  | 2023-12-30 08:00:39.251028+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes
d_rabbitmq  | 2023-12-30 08:00:39.257508+00:00 [info] <0.222.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
d_rabbitmq  | 2023-12-30 08:00:39.257675+00:00 [info] <0.222.0> Successfully synced tables from a peer
d_rabbitmq  | 2023-12-30 08:00:39.266516+00:00 [info] <0.222.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
d_rabbitmq  | 2023-12-30 08:00:39.266671+00:00 [info] <0.222.0> Successfully synced tables from a peer
d_rabbitmq  | 2023-12-30 08:00:39.266703+00:00 [info] <0.222.0> Peer discovery backend rabbit_peer_discovery_classic_config does not support registration, skipping registration.
d_rabbitmq  | 2023-12-30 08:00:39.266729+00:00 [info] <0.222.0> Will try to unlock with peer discovery backend rabbit_peer_discovery_classic_config
d_rabbitmq  | 2023-12-30 08:00:39.266782+00:00 [info] <0.222.0> Running boot step database_sync defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.266839+00:00 [info] <0.222.0> Running boot step feature_flags defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.266939+00:00 [info] <0.222.0> Running boot step codec_correctness_check defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.266972+00:00 [info] <0.222.0> Running boot step external_infrastructure defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.266993+00:00 [info] <0.222.0> Running boot step rabbit_registry defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267081+00:00 [info] <0.222.0> Running boot step rabbit_auth_mechanism_cr_demo defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267249+00:00 [info] <0.222.0> Running boot step rabbit_queue_location_random defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267305+00:00 [info] <0.222.0> Running boot step rabbit_event defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267460+00:00 [info] <0.222.0> Running boot step rabbit_auth_mechanism_amqplain defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267551+00:00 [info] <0.222.0> Running boot step rabbit_auth_mechanism_plain defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267601+00:00 [info] <0.222.0> Running boot step rabbit_exchange_type_direct defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267675+00:00 [info] <0.222.0> Running boot step rabbit_exchange_type_fanout defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267729+00:00 [info] <0.222.0> Running boot step rabbit_exchange_type_headers defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267826+00:00 [info] <0.222.0> Running boot step rabbit_exchange_type_topic defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267923+00:00 [info] <0.222.0> Running boot step rabbit_mirror_queue_mode_all defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.267983+00:00 [info] <0.222.0> Running boot step rabbit_mirror_queue_mode_exactly defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.268049+00:00 [info] <0.222.0> Running boot step rabbit_mirror_queue_mode_nodes defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.268121+00:00 [info] <0.222.0> Running boot step rabbit_priority_queue defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.268148+00:00 [info] <0.222.0> Priority queues enabled, real BQ is rabbit_variable_queue
d_rabbitmq  | 2023-12-30 08:00:39.268206+00:00 [info] <0.222.0> Running boot step rabbit_queue_location_client_local defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.268258+00:00 [info] <0.222.0> Running boot step rabbit_queue_location_min_masters defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.268314+00:00 [info] <0.222.0> Running boot step kernel_ready defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.268358+00:00 [info] <0.222.0> Running boot step rabbit_sysmon_minder defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.268484+00:00 [info] <0.222.0> Running boot step rabbit_epmd_monitor defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.269275+00:00 [info] <0.567.0> epmd monitor knows us, inter-node communication (distribution) port: 25672
d_rabbitmq  | 2023-12-30 08:00:39.269370+00:00 [info] <0.222.0> Running boot step guid_generator defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.271310+00:00 [info] <0.222.0> Running boot step rabbit_node_monitor defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.271450+00:00 [info] <0.571.0> Starting rabbit_node_monitor
d_rabbitmq  | 2023-12-30 08:00:39.271613+00:00 [info] <0.222.0> Running boot step delegate_sup defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.272186+00:00 [info] <0.222.0> Running boot step rabbit_memory_monitor defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.272402+00:00 [info] <0.222.0> Running boot step core_initialized defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.272424+00:00 [info] <0.222.0> Running boot step upgrade_queues defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.277562+00:00 [info] <0.222.0> message_store upgrades: 1 to apply
d_rabbitmq  | 2023-12-30 08:00:39.277641+00:00 [info] <0.222.0> message_store upgrades: Applying rabbit_variable_queue:move_messages_to_vhost_store
d_rabbitmq  | 2023-12-30 08:00:39.277747+00:00 [info] <0.222.0> message_store upgrades: No durable queues found. Skipping message store migration
d_rabbitmq  | 2023-12-30 08:00:39.277799+00:00 [info] <0.222.0> message_store upgrades: Removing the old message store data
d_rabbitmq  | 2023-12-30 08:00:39.278413+00:00 [info] <0.222.0> message_store upgrades: All upgrades applied successfully
d_rabbitmq  | 2023-12-30 08:00:39.283744+00:00 [info] <0.222.0> Running boot step channel_tracking defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.286524+00:00 [info] <0.222.0> Setting up a table for channel tracking on this node: tracked_channel_on_node_rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:39.289083+00:00 [info] <0.222.0> Setting up a table for channel tracking on this node: tracked_channel_table_per_user_on_node_rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:39.289218+00:00 [info] <0.222.0> Running boot step rabbit_channel_tracking_handler defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.289267+00:00 [info] <0.222.0> Running boot step connection_tracking defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.292118+00:00 [info] <0.222.0> Setting up a table for connection tracking on this node: tracked_connection_on_node_rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:39.294888+00:00 [info] <0.222.0> Setting up a table for per-vhost connection counting on this node: tracked_connection_per_vhost_on_node_rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:39.297384+00:00 [info] <0.222.0> Setting up a table for per-user connection counting on this node: tracked_connection_table_per_user_on_node_rabbit@892990533f7a
d_rabbitmq  | 2023-12-30 08:00:39.297633+00:00 [info] <0.222.0> Running boot step rabbit_connection_tracking_handler defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.297685+00:00 [info] <0.222.0> Running boot step rabbit_exchange_parameters defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.297732+00:00 [info] <0.222.0> Running boot step rabbit_mirror_queue_misc defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.298119+00:00 [info] <0.222.0> Running boot step rabbit_policies defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.298396+00:00 [info] <0.222.0> Running boot step rabbit_policy defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.298502+00:00 [info] <0.222.0> Running boot step rabbit_queue_location_validator defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.298572+00:00 [info] <0.222.0> Running boot step rabbit_quorum_memory_manager defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.298646+00:00 [info] <0.222.0> Running boot step rabbit_stream_coordinator defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.298831+00:00 [info] <0.222.0> Running boot step rabbit_vhost_limit defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.298921+00:00 [info] <0.222.0> Running boot step rabbit_mgmt_reset_handler defined by app rabbitmq_management
d_rabbitmq  | 2023-12-30 08:00:39.299035+00:00 [info] <0.222.0> Running boot step rabbit_mgmt_db_handler defined by app rabbitmq_management_agent
d_rabbitmq  | 2023-12-30 08:00:39.299084+00:00 [info] <0.222.0> Management plugin: using rates mode 'basic'
d_rabbitmq  | 2023-12-30 08:00:39.299507+00:00 [info] <0.222.0> Running boot step recovery defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.300340+00:00 [info] <0.222.0> Running boot step empty_db_check defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.300377+00:00 [info] <0.222.0> Will seed default virtual host and user...
d_rabbitmq  | 2023-12-30 08:00:39.300450+00:00 [info] <0.222.0> Adding vhost '/' (description: 'Default virtual host', tags: [])
d_rabbitmq  | 2023-12-30 08:00:39.312798+00:00 [info] <0.632.0> Making sure data directory '/var/lib/rabbitmq/mnesia/rabbit@892990533f7a/msg_stores/vhosts/628WB79CIFDYO9LJI6DKMI09L' for vhost '/' exists
d_rabbitmq  | 2023-12-30 08:00:39.313829+00:00 [info] <0.632.0> Setting segment_entry_count for vhost '/' with 0 queues to '2048'
d_rabbitmq  | 2023-12-30 08:00:39.316250+00:00 [info] <0.632.0> Starting message stores for vhost '/'
d_rabbitmq  | 2023-12-30 08:00:39.316398+00:00 [info] <0.636.0> Message store "628WB79CIFDYO9LJI6DKMI09L/msg_store_transient": using rabbit_msg_store_ets_index to provide index
d_rabbitmq  | 2023-12-30 08:00:39.317628+00:00 [info] <0.632.0> Started message store of type transient for vhost '/'
d_rabbitmq  | 2023-12-30 08:00:39.317738+00:00 [info] <0.640.0> Message store "628WB79CIFDYO9LJI6DKMI09L/msg_store_persistent": using rabbit_msg_store_ets_index to provide index
d_rabbitmq  | 2023-12-30 08:00:39.318331+00:00 [warn] <0.640.0> Message store "628WB79CIFDYO9LJI6DKMI09L/msg_store_persistent": rebuilding indices from scratch
d_rabbitmq  | 2023-12-30 08:00:39.318989+00:00 [info] <0.632.0> Started message store of type persistent for vhost '/'
d_rabbitmq  | 2023-12-30 08:00:39.319124+00:00 [info] <0.632.0> Recovering 0 queues of type rabbit_classic_queue took 4ms
d_rabbitmq  | 2023-12-30 08:00:39.319155+00:00 [info] <0.632.0> Recovering 0 queues of type rabbit_quorum_queue took 0ms
d_rabbitmq  | 2023-12-30 08:00:39.319173+00:00 [info] <0.632.0> Recovering 0 queues of type rabbit_stream_queue took 0ms
d_rabbitmq  | 2023-12-30 08:00:39.321783+00:00 [info] <0.222.0> Created user 'guest'
d_rabbitmq  | 2023-12-30 08:00:39.323226+00:00 [info] <0.222.0> Successfully set user tags for user 'guest' to [administrator]
d_rabbitmq  | 2023-12-30 08:00:39.324767+00:00 [info] <0.222.0> Successfully set permissions for 'guest' in virtual host '/' to '.*', '.*', '.*'
d_rabbitmq  | 2023-12-30 08:00:39.324810+00:00 [info] <0.222.0> Running boot step rabbit_looking_glass defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.324851+00:00 [info] <0.222.0> Running boot step rabbit_core_metrics_gc defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.324964+00:00 [info] <0.222.0> Running boot step background_gc defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.325133+00:00 [info] <0.222.0> Running boot step routing_ready defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.325173+00:00 [info] <0.222.0> Running boot step pre_flight defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.325195+00:00 [info] <0.222.0> Running boot step notify_cluster defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.325246+00:00 [info] <0.222.0> Running boot step networking defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.325284+00:00 [info] <0.222.0> Running boot step definition_import_worker_pool defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.325352+00:00 [info] <0.279.0> Starting worker pool 'definition_import_pool' with 16 processes in it
d_rabbitmq  | 2023-12-30 08:00:39.326193+00:00 [info] <0.222.0> Running boot step cluster_name defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.326259+00:00 [info] <0.222.0> Initialising internal cluster ID to 'rabbitmq-cluster-id-YZ_t6O--WTeTPXS7viBMPg'
d_rabbitmq  | 2023-12-30 08:00:39.327743+00:00 [info] <0.222.0> Running boot step direct_client defined by app rabbit
d_rabbitmq  | 2023-12-30 08:00:39.327854+00:00 [info] <0.222.0> Running boot step rabbit_management_load_definitions defined by app rabbitmq_management
d_rabbitmq  | 2023-12-30 08:00:39.327961+00:00 [info] <0.685.0> Resetting node maintenance status
d_rabbitmq  | 2023-12-30 08:00:39.337368+00:00 [info] <0.744.0> Management plugin: HTTP (non-TLS) listener started on port 15672
d_rabbitmq  | 2023-12-30 08:00:39.337453+00:00 [info] <0.772.0> Statistics database started.
d_rabbitmq  | 2023-12-30 08:00:39.337507+00:00 [info] <0.771.0> Starting worker pool 'management_worker_pool' with 3 processes in it
d_rabbitmq  | 2023-12-30 08:00:39.342158+00:00 [info] <0.786.0> Prometheus metrics: HTTP (non-TLS) listener started on port 15692
d_rabbitmq  | 2023-12-30 08:00:39.342237+00:00 [info] <0.685.0> Ready to start client connection listeners
d_rabbitmq  | 2023-12-30 08:00:39.343416+00:00 [info] <0.830.0> started TCP listener on [::]:5672
d_rabbitmq  |  completed with 4 plugins.
d_rabbitmq  | 2023-12-30 08:00:39.391629+00:00 [info] <0.685.0> Server startup complete; 4 plugins started.
d_rabbitmq  | 2023-12-30 08:00:39.391629+00:00 [info] <0.685.0>  * rabbitmq_prometheus
d_rabbitmq  | 2023-12-30 08:00:39.391629+00:00 [info] <0.685.0>  * rabbitmq_management
d_rabbitmq  | 2023-12-30 08:00:39.391629+00:00 [info] <0.685.0>  * rabbitmq_web_dispatch
d_rabbitmq  | 2023-12-30 08:00:39.391629+00:00 [info] <0.685.0>  * rabbitmq_management_agent

要停止Docker Compose的Docker容器,执行如下命令:

bash 复制代码
> docker-compose down -v
[+] Running 3/3
 ✔ Container d_rabbitmq          Removed                                                                           6.4s
 ✔ Container d_consul            Removed                                                                           0.3s
 ✔ Network docker_microservices  Removed                                                                           0.2s

下一步将配置加载到Consul KV中,进行修改docker-compose.yml文件:

yml 复制代码
version: "3"

services:
  consul-importer:
    image: consul-importer:1.0
    depends_on:
      - consul-dev
    networks:
      - microservices
  consul-dev:
    # ...
  rabbitmq-dev:
    # ...

networks:
  microservices:
    driver: bridge

这里利用前面构建的consul-importer:1.0镜像来进行Consul KV存储的导入,使用参数depends_on在compose文件中建立依赖关系,让它在consul-dev容器之后启动。无论如何,不能保证consul-importer运行时Consul服务器已经就绪。原因是Docker只知道容器何时启动,不知道Consul服务器何时启动并准备接受请求,这是要在导入程序镜像中添加脚本的原因,该脚本会重试导入,直到导入成功为止。

当再次运行docker-compose up时,会看到相应的输出,加载了配置并成功退出,如下所示:

bash 复制代码
> docker-compose up
...
consul-importer-1  | Imported: config
consul-importer-1  | Imported: config/defaults,docker/application.yml
consul             | 2023-12-31T00:47:17.155Z [INFO]  agent: Synced node info
consul             | 2023-12-31T00:47:17.273Z [INFO]  agent.server: federation state anti-entropy synced
consul-importer-1 exited with code 0
...

consul-importer容器是作为函数而不是连续运行的服务,这里使用简单地加载配置然后完成的命令替换了Consul镜像中的默认命令,命令在Dockerfile中定义,将服务器作为进程运行,Docker知道命令已退出,容器无事可做,因此不必保持容器处于活动状态。

还可以查看docker-compose配置中正在运行的容器是哪些,可使用docker-compose ps命令,如下所示:

bash 复制代码
> docker-compose ps
NAME         IMAGE                 COMMAND                  SERVICE        CREATED          STATUS          PORTS
consul       consul:1.11.1         "docker-entrypoint.s..."   consul-dev     18 minutes ago   Up 18 minutes   8300-8302/tcp, 8600/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->8600/udp
d_rabbitmq   rabbitmq:management   "docker-entrypoint.s..."   rabbitmq-dev   18 minutes ago   Up 18 minutes   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp

使用浏览器访问http://localhost:8500/,就可以进入Consul界面,导航到KV选项卡,就可以看到config条目,进一步可以看到已加载的配置,如下所示:

接着向Docker Compose中添加前端定义,只需要添加基于Nginx构建的镜像,并公开重定向到内部端口的端口3000,默认情况下基本镜像的端口为80,可以更改公开的端口,但要相应地调整Gateway中的CORS配置,docker-compose.yml添加如下:

yml 复制代码
version: "3"

services:
  frontend:
    image: challenge-frontend:1.0
    ports:
      - '3000:80'
  consul-importer:
    # ...
  consul-dev:
    # ...
  rabbitmq-dev:
    # ...

networks:
  microservices:
    driver: bridge

为了使整个系统正常运行,需要将Spring Boot微服务添加到Docker Compose文件中,将它们配置为使用之前创建的同一网络,这些容器都需要到达consul和d_rabbitmq容器才能正常工作,有两种不同的策略:

  • 对于Consul设置,Spring中的集中式配置功能要求服务在引导阶段知道服务器所在的位置。需要覆盖属性spring.cloud.consul.host,将其指向consul容器,这可以通过环境变量来实现,在Spring Boot中,如果设置的环境变量与现有属性匹配或遵循某种命名约定,将覆盖本地配置。
  • 对于RabbitMQ配置,将使用docker配置文件。假设微服务连接到Consul,并且配置服务器具有defaults,docker的一个预加载条目,那么它们都将使用其中的属性。要注意,在配置文件中RabbitMQ主机改为了d_rabbitmq了。要激活每个微服务中的docker配置文件,使用Spring Boot属性来通过环境变量SPRING_PROFILES_ACTIVE=docker来传递。

另外,在compose中配置Spring Boot容器时需要注意:

  • 不在localhost:8000上将后端服务直接公开给主机(Gateway服务除外),因此,不会将ports部分添加到Multiplication、Gamification和Logs服务中。
  • 对后端容器使用depends_on参数,以等待consul-importer运行,因此,在Spring Boot应用程序启动时,docker配置的Consul配置将可用。
  • 将rabbitmq作为这些服务的依赖项,但这不能保证RabbitMQ服务器在应用程序启动前就已准备就绪,但Spring Boot默认情况下会重试连接到服务器,系统最终将会稳定。

完整的配置如下:

yml 复制代码
version: "3"

services:
  frontend:
    image: challenge-frontend:1.0
    ports:
      - '3000:80'
  multiplication:
    image: multiplication:1.0.0
    environment:
      - SPRING_PROFILES_ACTIVE=docker
      - SPRING_CLOUD_CONSUL_HOST=consul
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysqlServer33106:3306/multiplication?useUnicode=true&characterEncoding=utf8
    depends_on:
      - rabbitmq-dev
      - consul-importer
      - mysql-server-dev
    networks:
      - microservices
  gamification:
    image: gamification:1.0.0
    environment:
      - SPRING_PROFILES_ACTIVE=docker
      - SPRING_CLOUD_CONSUL_HOST=consul
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysqlServer33106:3306/gamification?useUnicode=true&characterEncoding=utf8
    depends_on:
      - rabbitmq-dev
      - consul-importer
      - mysql-server-dev
      - multiplication
    networks:
      - microservices
  gateway:
    image: gateway:1.0.0
    ports:
      - '8000:8000'
    environment:
      - SPRING_PROFILES_ACTIVE=docker
      - SPRING_CLOUD_CONSUL_HOST=consul
    depends_on:
      - rabbitmq-dev
      - consul-importer
    networks:
      - microservices
  logs:
    image: logs:1.0.0
    environment:
      - SPRING_PROFILES_ACTIVE=docker
      - SPRING_CLOUD_CONSUL_HOST=consul
    depends_on:
      - rabbitmq-dev
      - consul-importer
    networks:
      - microservices
  consul-importer:
    image: consul-importer:1.0
    depends_on:
      - consul-dev
    networks:
      - microservices
  consul-dev:
    image: consul:1.11.1
    container_name: consul
    ports:
      - '8500:8500'
      - '8600:8600/udp'
    command: 'agent -dev -node=learnmicro -client=0.0.0.0 -log-level=INFO'
    networks:
      - microservices
  rabbitmq-dev:
    image: rabbitmq:management
    container_name: rabbitmq
    ports:
      - '5672:5672'
      - '15672:15672'
    networks:
      - microservices
  mysql-server-dev:
    image: mysql
    container_name: mysqlServer33106
    privileged: true
    volumes:
      - Z:\_Docker\mysql\data:/var/lib/mysql
      - Z:\_Docker\mysql\conf:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
    ports:
      - '33106:3306'
    networks:
      - microservices


networks:
  microservices:
    driver: bridge

现在就可用测试完整的Docker部署系统了,运行docker-compose up命令,就可以在输出中看到许多日志,这些日志由启动的多个服务生成。可能会看到,某些后端服务在尝试连接到RabbitMQ时会抛出异常,这是预期的情况,因为RabbitMQ服务启动需要更长的时间,在rabbitmq服务启动就绪后,将恢复正常。

可能还会遇到没有足够的内存或CPU来同时运行所有容器而产生的错误,这不是异常,因为每个微服务容器最多可以占用1GB的RAM。

要了解系统状态,可以使用Docker提供的聚合日志(附加输出)或logs容器的输出。可以从终端使用另一个docker-compose logs [container_name]来查看对应的日志,下面就是检查logs日志的输出:

bash 复制代码
> docker-compose logs logs
[...]
logs-1  | [gamification   ] INFO  07:36:28.759 [http-nio-8081-exec-10] c.z.g.game.LeaderBoardController - 查询排行榜
logs-1  | [multiplication ] INFO  07:36:28.772 [http-nio-8080-exec-8] c.z.m.user.UserController - 解析用户别名:[202, 154, 3, 1, 252, 102, 153, 152]
logs-1  | [gamification   ] INFO  07:36:33.809 [http-nio-8081-exec-2] c.z.g.game.LeaderBoardController - 查询排行榜
logs-1  | [multiplication ] INFO  07:36:33.823 [http-nio-8080-exec-9] c.z.m.user.UserController - 解析用户别名:[202, 154, 3, 1, 252, 102, 153, 152]
logs-1  | [gamification   ] INFO  07:36:38.866 [http-nio-8081-exec-3] c.z.g.game.LeaderBoardController - 查询排行榜
logs-1  | [multiplication ] INFO  07:36:38.880 [http-nio-8080-exec-1] c.z.m.user.UserController - 解析用户别名:[202, 154, 3, 1, 252, 102, 153, 152]
logs-1  | [gamification   ] INFO  07:36:43.912 [http-nio-8081-exec-5] c.z.g.game.LeaderBoardController - 查询排行榜
logs-1  | [multiplication ] INFO  07:36:43.923 [http-nio-8080-exec-2] c.z.m.user.UserController - 解析用户别名:[202, 154, 3, 1, 252, 102, 153, 152]
logs-1  | [gamification   ] INFO  07:36:48.956 [http-nio-8081-exec-6] c.z.g.game.LeaderBoardController - 查询排行榜
logs-1  | [multiplication ] INFO  07:36:48.969 [http-nio-8080-exec-4] c.z.m.user.UserController - 解析用户别名:[202, 154, 3, 1, 252, 102, 153, 152]
logs-1  | [gamification   ] INFO  07:36:54.017 [http-nio-8081-exec-8] c.z.g.game.LeaderBoardController - 查询排行榜
logs-1  | [multiplication ] INFO  07:36:54.029 [http-nio-8080-exec-5] c.z.m.user.UserController - 解析用户别名:[202, 154, 3, 1, 252, 102, 153, 152]
[...]

现在Consul中检查服务,可以看到运行状况检查是否通过,这意味着服务已经运行并连接到RabbitMQ了,如下所示:

点击一项服务(如multiplication),可以看到docker网络中容器的地址,如图所示:

使用浏览器访问http://localhost:3000/,就可以使用应用程序了,如下所示:

数据持久化,应该考虑添加卷来存储数据库文件。

使用Docker扩展系统

使用docker compose,还可以使用单个命令来扩展服务。

首先,启动系统(docker-compose up),然后,从另一个终端再次运行带有scale参数的命令,指出服务名称和希望获取的实例数,可在单个命令中多次使用scale参数,如下所示:

bash 复制代码
> docker-compose up --scale multiplication=2 --scale gamification=2

现在,查看终端日志,就可以看到Docker Compose为multiplication和gamification服务启动了额外的实例,也可以在Consul服务中看到,如下所示:

从Consul中可以看到其中的变化,借助Consul发现、网关模式、Spring Cloud负载均衡器和RabbitMQ消费者的负载均衡,系统会再次在多个实例之间适当地负载均衡,可使用HTTPie命令来进行尝试:

bash 复制代码
> http POST :8000/attempts factorA=50 factorB=60 userAlias=noise10 guess=3000

在日志中可以看到实例如何处理来自API的请求,如下所示:

bash 复制代码
gamification-1     | 2023-12-31T08:12:49.943Z  INFO 1 --- [gamification] [nio-8081-exec-5] [65912281dacc46bac85523453edcb3f3-9b6b761c5b6a9382] c.z.g.game.LeaderBoardController         : 查询排行榜
logs-1             | [gamification   ] INFO  08:12:49.943 [http-nio-8081-exec-5] c.z.g.game.LeaderBoardController -  查询排行榜
multiplication-2   | 2023-12-31T08:12:49.956Z  INFO 1 --- [multiplication] [nio-8080-exec-5] [659122819e60bbd6bd36c80f10415a6c-c82fbfb9011596f0] c.z.multiplication.user.UserController   : 解析用户别名:[202, 154, 252, 3, 1, 304, 102, 153, 152, 302, 303]
logs-1             | [multiplication ] INFO  08:12:49.956 [http-nio-8080-exec-5] c.z.m.user.UserController - 解析用户别名:[202, 154, 252, 3, 1, 304, 102, 153, 152, 302, 303]
gamification-2     | 2023-12-31T08:12:55.010Z  INFO 1 --- [gamification] [nio-8081-exec-4] [6591228710d45c9284ba9a61e5c0744d-62f697171d3aae75] c.z.g.game.LeaderBoardController         : 查询排行榜
logs-1             | [gamification   ] INFO  08:12:55.010 [http-nio-8081-exec-4] c.z.g.game.LeaderBoardController -  查询排行榜
multiplication-2   | 2023-12-31T08:12:55.027Z  INFO 1 --- [multiplication] [nio-8080-exec-6] [65912287ef8a6efed625404105289f9f-fc0e8491e8bb04e7] c.z.multiplication.user.UserController   : 解析用户别名:[202, 154, 252, 3, 1, 304, 102, 153, 152, 302, 303]
logs-1             | [multiplication ] INFO  08:12:55.027 [http-nio-8080-exec-6] c.z.m.user.UserController - 解析用户别名:[202, 154, 252, 3, 1, 304, 102, 153, 152, 302, 303]
multiplication-2   | 2023-12-31T08:12:59.806Z  INFO 1 --- [multiplication] [nio-8080-exec-8] [6591226d4e0180f5952d698c92aca5ea-608c654d76df9c9f] c.z.multiplication.user.UserController   : 解析用户别名:[202, 154, 252, 3, 1, 102, 153, 152, 302, 303, 304]
logs-1             | [multiplication ] INFO  08:12:59.806 [http-nio-8080-exec-8] c.z.m.user.UserController - 解析用户别名:[202, 154, 252, 3, 1, 102, 153, 152, 302, 303, 304]
gamification-1     | 2023-12-31T08:13:00.063Z  INFO 1 --- [gamification] [nio-8081-exec-7] [6591228ce8dd021b4bf8138109b7bdbe-6830efc62e66a5c2] c.z.g.game.LeaderBoardController         : 查询排行榜
logs-1             | [gamification   ] INFO  08:13:00.063 [http-nio-8081-exec-7] c.z.g.game.LeaderBoardController -  查询排行榜
multiplication-2   | 2023-12-31T08:13:00.077Z  INFO 1 --- [multiplication] [nio-8080-exec-9] [6591228cd6801e2722b013ceb70ee8d3-908ed9142522d3da] c.z.multiplication.user.UserController   : 解析用户别名:[202, 154, 252, 3, 1, 304, 102, 153, 152, 302, 303]
logs-1             | [multiplication ] INFO  08:13:00.077 [http-nio-8080-exec-9] c.z.m.user.UserController - 解析用户别名:[202, 154, 252, 3, 1, 304, 102, 153, 152, 302, 303]
multiplication-2   | 2023-12-31T08:13:01.669Z  INFO 1 --- [multiplication] [io-8080-exec-10] [6591227ce7aa7b1af8117cf72707d5e9-d36245ec69c9f940] c.z.multiplication.user.UserController   : 解析用户别名:[202, 154, 252, 3, 1, 102, 153, 152, 302, 303, 304]
logs-1             | [multiplication ] INFO  08:13:01.669 [http-nio-8080-exec-10] c.z.m.user.UserController - 解析用 户别名:[202, 154, 252, 3, 1, 102, 153, 152, 302, 303, 304]

共享Docker镜像

目前为止,所有镜像都存储在本地计算机中,这不能实现"一次构建,随处部署"的策略。

Docker Hub是一个公共注册表,从中下载的RabbitMQ和Consul官方镜像,以及微服务的基础镜像。如果在这里上传自己的镜像,每个人就都可以使用了。

关于如何使用Docker Hub上传镜像,这里不再介绍,感兴趣的请自己查找相关资料。

小结

文章介绍了Docker容器化技术,有助于将微服务部署到多个环境中;简述了Spring Boot应用程序如何构建Docker镜像,并使用Docker Compose实现对Docker容器集群的快速编排,这样使多个容器相互配合来完成整个应用系统,可以轻松、高效的管理容器,提高效率。

相关推荐
陌北v127 分钟前
Docker Compose 配置指南
运维·docker·容器·docker-compose
阿里嘎多学长1 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
明 庭2 小时前
Ubuntu下通过Docker部署Caddy服务器
服务器·ubuntu·docker
DT辰白2 小时前
如何解决基于 Redis 的网关鉴权导致的 RESTful API 拦截问题?
后端·微服务·架构
G_whang3 小时前
windos 安装docker
运维·docker·容器
Mitch3113 小时前
【漏洞复现】CVE-2021-45788 SQL Injection
sql·web安全·docker·prometheus·metersphere
运维小文3 小时前
K8S中的PV、PVC介绍和使用
docker·云原生·容器·kubernetes·存储
CYX_cheng4 小时前
Docker挂载
docker
老猿讲编程4 小时前
技术发展历程:从 CORBA 到微服务
微服务·云原生·架构
奉孝7 小时前
docker基础
后端·docker