8 容器化微服务

文章目录

  • Docker
  • Spring Boot和Buildpacks
  • 在Docker中运行系统
  • Docker化微服务
  • Docker化前端
  • Docker化配置导入器
  • Docker Compose
  • 使用Docker扩展系统
  • 共享Docker镜像
  • 小结

前面的文章:
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文件如下所示:

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。有了基础,就可以执行构建命令了,过程如下所示:

> 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命令,就可以看到映像已经创建,如下所示:

> docker images
REPOSITORY                                             TAG          IMAGE ID       CREATED         SIZE
multiplication                                         1.0.0        ee8506662365   2 minutes ago   571MB
...

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

> docker run -it -p 18080:8080 multiplication:1.0.0

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

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

[INFO] Building image 'docker.io/library/gamification:0.0.1-SNAPSHOT'
...

Docker标记设置为pom.xml文件gamification:0.0.1-SNAPSHOT中指定的Maven工件的名称和版本,docker.io/library/是所有公共Docker镜像的默认值,也可以自定义选项。
可以像前面执行镜像一样运行容器,命令如下:

> 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应用程序构建所有镜像,在每个项目文件夹下执行以下命令:

> ./mvnw spring-boot:build-image

Docker化前端

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

FROM nginx:1.25.3
COPY build /usr/share/nginx/html

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

> docker build -t challenge-frontend:1.0 .

Docker化配置导入器

还需要一个Docker镜像来加载预定义的集中式配置,已经有一个运行服务器的Consul容器,通过运行一个额外的容器来执行Consul CLI来加载一些KV数据:一个Docker配置文件。这样,可以在Docker中运行微服务时使用预加载的配置文件配置,因为需要不同的RabbitMQ参数。
想要在文件中加载配置,可在本地Consul服务器中创建该配置,然后,通过CLI命令将其导出。使用UI创建config根目录,并创建一个名为defaults,docker的子文件夹。在内部,创建一个名为application.yml的键,其配置如下所示:

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

该配置执行如下操作:

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

下图显示了Consul用户界面添加的配置:
consul
然后将配置导出到文件,可在Consul终端执行如下命令:

> consul kv export config/ > consul-kv-docker.json

文件内容如下:

[
        {
                "key": "config/",
                "flags": 0,
                "value": ""
        },
        {
                "key": "config/defaults,docker/application.yml",
                "flags": 0,
                "value": "c3ByaW5nOgogIHJhYmJpdG1xOgogICAgaG9zdDogcmFiYml0bXEKICBjbG91ZDoKICAgIGNvbnN1bDoKICAgICAgZGlzY292ZXJ5OgogICAgICAgIGluc3RhbmNlLWlkOiAke3NwcmluZy5hcHBsaWNhdGlvbi5uYW1lfS0ke3JhbmRvbS5pbnQoMTAwMCl9"
        }
]

现在,需要创建一个docker文件夹,存放Dockerfile文件,以及所导出的json配置,便于创建Docker镜像,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服务器可能尚未启动。
现在,就可用构建容器了:

> docker build -t consul-importer:1.0 .

Docker Compose

构建完所有镜像后,需要将系统作为一组容器运行,下面就来看看然后启动这些容器并通信。
可使用单个Docker命令来启动所有必需的容器,并设置网络以使它们彼此连接,但是,如果要告诉其他人如何启动系统,需要向其传递包含所有这些命令和说明的脚本或文档。Docker有更好的方法可用对容器配置和部署指令进行分组:Docker Compose。
通过Compose,使用YAML文件来定义基于多个容器的应用程序,然后,使用命令docker-compose来运行所有服务。需要创建一个docker-compose.yml配置文件,下面给出了RabbitMQ和Consul的配置:

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容器,需要执行命令:

> docker-compose up

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

> 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容器,执行如下命令:

> 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文件:

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时,会看到相应的输出,加载了配置并成功退出,如下所示:

> 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命令,如下所示:

> 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条目,进一步可以看到已加载的配置,如下所示:
kv
接着向Docker Compose中添加前端定义,只需要添加基于Nginx构建的镜像,并公开重定向到内部端口的端口3000,默认情况下基本镜像的端口为80,可以更改公开的端口,但要相应地调整Gateway中的CORS配置,docker-compose.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默认情况下会重试连接到服务器,系统最终将会稳定。

完整的配置如下:

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日志的输出:

> 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网络中容器的地址,如图所示:
multiplication
使用浏览器访问http://localhost:3000/,就可以使用应用程序了,如下所示:
react

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

使用Docker扩展系统

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

> docker-compose up --scale multiplication=2 --scale gamification=2

现在,查看终端日志,就可以看到Docker Compose为multiplication和gamification服务启动了额外的实例,也可以在Consul服务中看到,如下所示:
多个实例
从Consul中可以看到其中的变化,借助Consul发现、网关模式、Spring Cloud负载均衡器和RabbitMQ消费者的负载均衡,系统会再次在多个实例之间适当地负载均衡,可使用HTTPie命令来进行尝试:

> http POST :8000/attempts factorA=50 factorB=60 userAlias=noise10 guess=3000

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

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容器集群的快速编排,这样使多个容器相互配合来完成整个应用系统,可以轻松、高效的管理容器,提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/344080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ系列之交换机的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《RabbitMQ系列之交换机的使用》。&#x1f3af;&…

大白话解析LevelDB 3: SST Compaction

SST Compaction SST Compaction 什么是Compact SST什么时候触发Compact SST 第一处 读取 Key 的时候第二处 使用迭代器遍历数据库时第三处 写入 Key 时第四处 刚打开数据库时 如何进行Compact SST 计算Compaction范围进行Compaction 创建一个迭代器用于读取Compaction范围内的…

【linux】Debian挂起和休眠

一、挂起和休眠 在Debian桌面系统中&#xff0c;挂起和休眠是两种不同的状态&#xff0c;它们之间有一些区别。 挂起&#xff08;Suspend&#xff09;是将当前系统的状态保存到RAM&#xff08;内存&#xff09;中&#xff0c;然后关闭所有硬件设备&#xff0c;除了RAM之外。在…

(2)(2.4) CRSF/ELRS Telemetry

文章目录 前言 1 ArduPilot 参数编辑器 前言 &#xff01;Note ELRS&#xff08;ExpressLRS&#xff09;遥控系统使用穿越火线协议&#xff0c;连接方式类似。不过&#xff0c;它不像穿越火线那样提供双向遥测。 TBS CRSF 接收机与 ArduPilot 的接口中包含遥测和遥控信息。…

输入单词需要的最少按键次数 I

题目链接 输入单词需要的最少按键次数 I 题目描述 注意点 1 < word.length < 26word 仅由小写英文字母组成word 中的所有字母互不相同 解答思路 因为word 中的所有字母互不相同&#xff0c;可以以任意8个字符为一组&#xff0c;第一组每个字符需要按键一次&#xff…

服务器的异步通信——RabbitMQ

目录 一、同步通信 VS 异步通信 二、MQ——消息队列 RabbitMQ RabbitMQ安装 RabbitMQ的整体架构 常见消息模型 基本消息队列&#xff08;BasicQueue&#xff09; 工作消息队列&#xff08;WorkQueue&#xff09; 发布、订阅&#xff08;Publish、Subscribe&#xff0…

C#,生成图片的指定尺寸缩略图的源代码

编程的时候经常用到图像的缩略图。 本文发布一个用于生成指定尺寸的缩略图的简单方法。 1 文本格式 private void button1_Click(object sender, EventArgs e) { CreateThumbnail("demo.jpg", "demo_thumb.jpg", 128, 128); } private void CreateTh…

基于QEMU的vexpress-a9的初始化代码运行(一)

这个part是想详细走读一下用qemu运行kernel的最初始代码&#xff0c;也就是使用qemu运行kernel代码的详细逻辑&#xff0c;从qemu加载根目录下vmlinux镜像的逻辑&#xff0c;也就是运行arch/arm/kernel/head.S的整个过程&#xff0c;直到跳转到start_kernel&#xff0c;使用的k…

IT大侦“碳”:Concept Luna向循环设计持续演进

今天聊点轻松的话题。上个月&#xff0c;小编用来吃饭的家伙开始闹罢工&#xff0c;笔记本的触控和键盘突然没了反应&#xff0c;电脑虽然还能打开&#xff0c;但嗡嗡直叫的风扇让我意识到这件事并不简单。 你问我为什么电脑会出问题&#xff1f;好吧&#xff0c;那我得先搞清楚…

领势 跨越|美创科技数据安全管理平台2023年度回顾

领势 跨越 数据安全管理平台的2023 以数字化安全平台为基础的数据安全体系是未来安全建设的重要方向。 研究咨询机构IDC指出&#xff1a;未来&#xff0c;数据安全基础设施管理平台将逐步发展成为各组织数据安全建设的基础设施。 Gartner《中国数据安全治理解析》预测&…

141:vue+leaflet 利用高德逆地理编码,点击地图标记marker,popup地址信息

第141个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中利用高德逆地理编码,点击地图标记marker,popup地址信息 。主要利用高德地图的api将坐标转化为地址,然后在点击的位置,弹出弹窗,在里面显示出地址信息。 直接复制下面的 vue+leaflet源代码,操作2分钟…

cad二次开发autolisp(二)

目录 一、选择集1.1 选择集的创建1.2 选择集的编辑1.3 操作选择集 二、命令行设置对话框2.1 设置图层2.2 加载线型2.3 设置字体样式2.4 设置标注样式&#xff08;了解即可&#xff09; 三、符号表3.1 简介3.2 符号表查找3.2 符号表删改增 一、选择集 定义&#xff1a;批量选择…

【数据结构与算法】4.自主实现单链表的增删查改

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

在SpringBoot中基于CanvasLabel的地震基础信息展示实践

目录 前言 一、数据库设计 1、数据库设计 2、sql脚本 3、数据记录 二、SpringBoot后台设计与实现 1、Mapper访问层及实体定义 2、Service层实现 3、控制层实现 三、地震信息展示 1、展示数据接入 2、最终效果 总结 前言 在上一篇博客中&#xff0c;对于在Leafle…

直播录屏工具哪家强?让你的直播更精彩!

随着网络技术的不断发展&#xff0c;直播行业逐渐兴起。无论是游戏直播、教育直播还是娱乐直播&#xff0c;人们都希望能够记录这些精彩瞬间。因此&#xff0c;一款好用的直播录屏工具显得尤为重要。本文将详细介绍两款流行的直播录屏工具&#xff0c;通过这些工具&#xff0c;…

亚马逊、eBay、TikTok等平台的综合运营实用工具分享!

亚马逊、eBay等电商平台为卖家提供了广阔的销售机会&#xff0c;但同时也带来了运营管理的挑战。为了提高运营效率和销售业绩&#xff0c;卖家需要借助一些实用工具。本文将介绍一些在亚马逊、eBay等平台上综合运营中非常有用的工具&#xff0c;帮助卖家更高效地管理店铺&#…

flutter底层架构初探

本文出处&#xff1a;​​​​​​​​​​​​​Flutter 中文开发者网站 架构 embedder嵌入层 提供程序入口&#xff08;其他原生应用也采用此方式&#xff09;&#xff0c;程序由此和底层操作系统协调&#xff08;surface渲染、辅助功能和输入服务&#xff0c;管理事件循环…

HTTP3/QUIC 性能测试与配套组件

背景 最近一年很多关于QUIC的文章层出&#xff0c;但是发现一个问题&#xff0c;这些文章都是在介绍QUIC或HTTP3是怎样的一个东西&#xff0c;以及它的优点和机制&#xff0c;将它夸的近乎上天了。然而有心的人估计会亲手做一些测试&#xff0c;就会发现这个被捧上天的东西性能…

如何预防服务器IP被劫持,危害有什么?

服务器IP被劫持是一种严重的网络安全问题&#xff0c;攻击者通过篡改服务器的IP地址&#xff0c;将网络流量重定向到恶意服务器或网站&#xff0c;导致用户无法正常访问目标服务器&#xff0c;并可能面临数据泄露、恶意软件感染等安全风险。了解服务器IP被劫持的危害和预防措施…

探案录 | 细说与人大金仓有关的“神秘数字”

近日&#xff0c;福尔摩斯•K发现&#xff0c;涉及医疗数字化的相关新闻都被人撕毁了&#xff0c;只留下日期和一串神秘数字&#xff1a;301、700、3000、3700……这背后隐瞒了什么呢&#xff1f;快跟着大侦探去揭开真相吧。 News&#xff1a;11月16日 全国首例&#xff0c;301…
最新文章