8 容器化微服务

news2024/11/24 6:41:57

文章目录

  • 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.coloradmin.cn/o/1404812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据结构]顺序表

1、顺序表的概念及结构 1.1 线性表 线性表&#xff08; linear list &#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#…

47. 全排列 II - 力扣(LeetCode)

题目描述 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 输入示例 nums [1,1,2]输出示例 [[1,1,2], [1,2,1], [2,1,1]]解题思路 解题代码 class Solution {List<List<Integer>> result new ArrayList<>();Deq…

探索元宇宙:游戏的全新境界

你是否曾经想过&#xff0c;在一个完全由你自己掌控的虚拟世界里&#xff0c;体验前所未有的冒险和刺激&#xff1f; UTONMOS元宇宙游戏将带你进入这个全新的领域&#xff0c;让你的想象力和创造力自由驰骋。 UTONMOS&#xff0c;基于上海和数集团自主研发的和数链&#xff0c…

MoEs学习

和多任务学习的mmoe很像哦&#xff08;有空再学习一下&#xff09;moe layer的起源&#xff1a;Switch Transformers paper MoE moe由两个结构组成&#xff1a; Moe Layer &#xff1a;这些层代替了传统 Transformer 模型中的前馈网络 (FFN) 层。MoE 层包含若干“专家”(例如…

【教程】混淆Dart 代码

什么是代码混淆&#xff1f; 代码混淆是一种将应用程序二进制文件转换为功能上等价&#xff0c;但人类难于阅读和理解的行为。在编译 Dart 代码时&#xff0c;混淆会隐藏函数和类的名称&#xff0c;并用其他符号替代每个符号&#xff0c;从而使攻击者难以进行逆向工程。 Flut…

dubbo和eureka的区别

dubbo可以作为客户端&#xff0c;也可以作为服务端&#xff0c;因此他内置了很多序列化框架可供选择&#xff0c;通过配置可以进行选择。默认是hession&#xff0c;还有gson&#xff0c;fastJson&#xff0c;jdk自带的序列化。 eureka只能作为服务端&#xff0c;他序列要与客户…

LeetCode 670 最大交换数

周一&#xff0c;非常冷&#xff0c;大风呼呼的&#xff0c;上班路都走不动。 好消息&#xff0c;马上要过年了。大风吹&#xff0c;天气好。 过年过年&#xff0c;回家过年~ 学生时代的迷茫是不应该存在的&#xff0c;最好的时光应该尽情享受&#xff0c;而不应该自己给加层…

【zlm】针对单个设备的码率的设置

目录 代码修改 实验数据一 实验数据二 同时拉一路视频后 修改记录 使用方法 代码修改 要被子类引用 &#xff0c;所以放在protected 不能放private 下面的结论&#xff0c;可以在下面的实验数据里引用。“同时拉一路视频后” 实验数据一 https://10.60.3.45:10443/index…

深度学习如何弄懂那些难懂的数学公式?是否需要学习数学?

经过1~2年的学习&#xff0c;我觉得还是需要数学有一定认识&#xff0c;重新捡起高等数学、概率与数理、线代等这几本&#xff0c;起码基本微分方程、求导、对数、最小损失等等还是会用到。 下面给出几个链接&#xff0c;可以用于平时充电学习。 知乎上的&#xff1a; 机器学…

目标检测 - RCNN系列模型

文章目录 1. RCNN2. Fast-RCNN3. Faster-RCNN 1. RCNN 论文&#xff1a;Rich feature hierarchies for accurate object detection and semantic segmentation 地址&#xff1a;https://arxiv.org/abs/1311.2524 分为两个阶段&#xff1a; 目标候选框Object ProposalsProposal…

C语言float 类型数如何与0值⽐较?

一、问题 写出 float a 与“0值”⽐较的if语句。 二、解答 1、问题分析与解答 ⼀般地&#xff0c;如果⽤证判断⼀个数值型变量(short、int、long 等)&#xff0c;应该⽤ if(a0)&#xff0c;表示的含义是a与0进⾏“数值”上的⽐较; 但 float 型变量并不精确&#xff0c;不能直…

docker里安装conda,并source本地已有的虚拟环境包

有的环境比较难配&#xff0c;在镜像里配置的版本总是与本地不同&#xff0c;导致程序起不来&#xff0c;今天就用个最基础的镜像&#xff0c;去配置anaconda&#xff0c;然后直接导入虚拟环境。 本次使用镜像&#xff1a;nvcr.io/nvidia/cuda:12.2.0-runtime-ubuntu20.04&…

2024阿里云优惠活动隐藏页面,必看!

阿里云优惠活动隐藏页面之前在官网是可以看到的&#xff0c;2024阿里云官网升级后这个页面隐藏了&#xff0c;阿里云百科分享给大家阿里云优惠活动隐藏页面 aliyunbaike.com/go/activity 这是阿里云最新优惠活动集合页面&#xff0c;当前所有的活动都在这个页面&#xff0c;还有…

Ubuntu及CentOS 离线下载安装文件方法说明

一、离线安装包说明 Centos 包后缀名: rpm 安装方法&#xff1a;sudo rpm -ivh package.rpm Ubuntu 包后缀名字&#xff1a; deb 安装方法&#xff1a; sudo dpkg -i <package_file.deb> 二、手动下载 https://pkgs.org/ 通过网站搜索需要的离线包&#xff0c;选择…

数据库防水坝是什么?有什么作用?有哪些优势?

数据库是公司重要IT资产&#xff0c;是公司数据存储、数据整合、数据备份等重要载体。所以保障数据库安全至关重要。目前保障数据库安全产品较多&#xff0c;例如堡垒机、防火墙、数据库防水坝等等。今天我们就先来简单了解一下数据库防水坝是什么&#xff1f;有什么作用&#…

【位运算专题】介绍+详解5道题

本文讲解位运算的基础介绍和详解6道题&#xff0c;在讲解题目的同时提供AC代码【注&#xff1a;点击题目可打开对应链接】 1、位运算的基础介绍【重点】 如果上面位图不了解的&#xff0c;可以看我之前写过的文章&#xff1a; 【C和数据结构】位图和布隆过滤器-CSDN博客 2、…

LeetCode.670. 最大交换

题目 题目链接 分析 这道题的意思是我们只能交换一次&#xff0c;需要得到最大的数字。 我们的第一个想法就是要这个数字先变成一个数组&#xff0c;便于我们操作。 然后把数组最大的数放到第一个位置&#xff0c;如果最大的数字已经在第一个位置&#xff0c;那么就把次大的…

司铭宇老师:二手房电话营销培训:二手房电话销售技巧和话术

二手房电话营销培训&#xff1a;二手房电话销售技巧和话术 一、二手房电话销售的重要性 1.高效传播&#xff1a;通过电话&#xff0c;我们可以迅速将房源信息传播给潜在客户&#xff0c;提高房源的曝光率。 2.精准定位&#xff1a;通过电话沟通&#xff0c;我们可以初步了解客户…

掌握Vim:提升编程效率的实用指南

掌握Vim&#xff1a;提升编程效率的实用指南 1. 引言常用命令解析基础命令编辑命令搜索和替换移动和跳转窗口和标签页 Vim配置优化vimrc文件的基本设置常用配置项高级配置技巧 推荐插件及使用NERDTree&#xff1a;项目文件浏览YouCompleteMe&#xff1a;代码自动补全vim-gitgut…

[Unity] Tilemap瓦片左右翻转(上下翻转)

Tile&#xff08;瓦片&#xff09;左右翻转感觉是很常用的一个功能啊&#xff01;看了一些教程都没有提及&#xff0c;心想难道要把每张Sprite再做一张对称的、再做成瓦片吗&#xff1f; 图片量x2 、瓦片量x2、不现实&#xff01;一定有方法&#xff01; 搜索了了半天没找到方…