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: rabbitmqcloud: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:latestcontainer_name: d_consulports:- '8500:8500'- '8600:8600/udp'command: 'agent -dev -node=learnmicro -client=0.0.0.0 -log-level=INFO'networks:- microservicesrabbitmq-dev:image: rabbitmq:managementcontainer_name: d_rabbitmqports:- '5672:5672'- '15672:15672'networks:- microservicesnetworks: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.0depends_on:- consul-devnetworks:- microservicesconsul-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.0ports:- '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.0ports:- '3000:80'multiplication:image: multiplication:1.0.0environment:- SPRING_PROFILES_ACTIVE=docker- SPRING_CLOUD_CONSUL_HOST=consul- SPRING_DATASOURCE_URL=jdbc:mysql://mysqlServer33106:3306/multiplication?useUnicode=true&characterEncoding=utf8depends_on:- rabbitmq-dev- consul-importer- mysql-server-devnetworks:- microservicesgamification:image: gamification:1.0.0environment:- SPRING_PROFILES_ACTIVE=docker- SPRING_CLOUD_CONSUL_HOST=consul- SPRING_DATASOURCE_URL=jdbc:mysql://mysqlServer33106:3306/gamification?useUnicode=true&characterEncoding=utf8depends_on:- rabbitmq-dev- consul-importer- mysql-server-dev- multiplicationnetworks:- microservicesgateway:image: gateway:1.0.0ports:- '8000:8000'environment:- SPRING_PROFILES_ACTIVE=docker- SPRING_CLOUD_CONSUL_HOST=consuldepends_on:- rabbitmq-dev- consul-importernetworks:- microserviceslogs:image: logs:1.0.0environment:- SPRING_PROFILES_ACTIVE=docker- SPRING_CLOUD_CONSUL_HOST=consuldepends_on:- rabbitmq-dev- consul-importernetworks:- microservicesconsul-importer:image: consul-importer:1.0depends_on:- consul-devnetworks:- microservicesconsul-dev:image: consul:1.11.1container_name: consulports:- '8500:8500'- '8600:8600/udp'command: 'agent -dev -node=learnmicro -client=0.0.0.0 -log-level=INFO'networks:- microservicesrabbitmq-dev:image: rabbitmq:managementcontainer_name: rabbitmqports:- '5672:5672'- '15672:15672'networks:- microservicesmysql-server-dev:image: mysqlcontainer_name: mysqlServer33106privileged: truevolumes:- Z:\_Docker\mysql\data:/var/lib/mysql- Z:\_Docker\mysql\conf:/etc/mysql/conf.denvironment:MYSQL_ROOT_PASSWORD: "123456"ports:- '33106:3306'networks:- microservicesnetworks: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.mzph.cn/news/643501.shtml

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

相关文章

通信入门系列——复变函数

本节目录 一、复变函数 1、复数 2、复数的四则运算 二、复指数函数 三、欧拉公式本节内容 一、复变函数 1、复数 复数单位i&#xff0c;也就是满足i^2-1&#xff0c;将zxiy表示为复数z&#xff0c;x和y为任意的实数&#xff0c;称为复数z的实部和虚部。由复数zxiy对应的点(x,y…

虚拟歌姬学习:DiffSinger,让GitHub下载快的方法!

《三分钟上手DiffSinger》系列 ——基础篇https://www.bilibili.com/video/BV1ug4y1S7Dk/?spm_id_from333.337.search-card.all.click&vd_source124076d7d88eee393a1d8bf6fc787efa 下载DiffSinger 建议用edge浏览器还有steam&#xff0c;有时只是慢&#xff0c;但是还是…

# 安徽锐锋科技IDMS系统简介

IDMS 由安徽锐锋科技独立开发 该系统负责和海算以及UE\UNITY的无缝衔接并具备远程数据库访问、高速数据库的自动创建及数据存储、支持MQTT等多种物联网接口&#xff0c;支持多种算法。主要完成由于物料、人员、生产、故障、不良异常、订单异常带来的生产损失&#xff0c;通过海…

macOS跨进程通信: TCP Socket 创建实例

macOS跨进程通信: TCP Socket 创建实例 一&#xff1a; 简介 Socket 是 网络传输的抽象概念。 一般我们常用的有Tcp Socket和 UDP Scoket&#xff0c; 和类Unix 系统&#xff08;包括Mac&#xff09;独有的 Unix Domain Socket&#xff08;UDS&#xff09;。 Tcp Socket 能够…

web安全学习笔记【05】——反弹Shell、正反向连接

思维导图 #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载均衡等 ----------------------------------- 1、APP架构-封装&原生态&H5&am…

解决TCP粘包问题

粘包问题已经在上一篇博客中写到具体可以看----------- 以下是利用分包解决粘包问题的步骤&#xff1a; 消息长度前缀&#xff1a; 在每个数据包前加入消息长度信息。 定义协议格式&#xff1a; 明确定义通信协议的格式&#xff0c;包括消息头和消息体。 封包&#xff1a; 将…

Java研学-代理模式

一 概述 1 分类 静态代理&#xff1a;在程序运行前就已经存在代理类的字节码文件&#xff0c;代理对象和真实对象的关系在运行前就确定了。&#xff08;代理类及对象要自行创建&#xff09;   动态代理&#xff1a;代理类是在程序运行期间由 JVM 通过反射等机制动态的生成的…

电脑数据恢复软件哪个有效好用?十大电脑数据恢复软件排行

在数字时代&#xff0c;数据就是一切。从珍贵的家庭照片和重要的工作文档到最喜欢的音乐和电影&#xff0c;我们的生活越来越多地存储在各种设备上。系统崩溃、意外删除或恶意病毒都可能使您的宝贵数据瞬间消失。这就是数据恢复工具的用武之地。 十大电脑数据恢复软件排行 这些…

Integer.valueOf方法详解

Integer.valueOf 是 Java 中 Integer 类的一个静态方法&#xff0c;它用于将给定的字符串或基本数据类型转换成一个 Integer 对象。 使用场景 从字符串转换&#xff1a;将字符串形式的数字转换为 Integer 对象。 Integer num Integer.valueOf("123");从基本数据类…

论文阅读2---多线激光lidar内参标定原理

前言&#xff1a;该论文介绍多线激光lidar的标定内参的原理&#xff0c;有兴趣的&#xff0c;可研读原论文。 1、标定参数 rotCorrection&#xff1a;旋转修正角&#xff0c;每束激光的方位角偏移&#xff08;与当前旋转角度的偏移&#xff0c;正值表示激光束逆时针旋转&…

关于一个QT程序的简单破解思路(不需要分析信号和槽的方法,通用所有程序的破解思路)

几年前,公司买了台国产贴片机,里面的主程序是QT编写,运行在WINDOW XP系统上。主程序打开的界面,如图: 我来简单介绍下程序界面,各位读者不需要搞明白功能,只要知道大体的流程即可。 分析主界面: 一、左边的列表&#xff1a; 贴片生产文件,里面包括了贴片时元器件的坐标、飞达…

C#winform上位机开发学习笔记11-串口助手接收数据用波形显示功能添加

1.功能描述 接收串口数据&#xff0c;并将收到的十六进制数据用坐标系的方式将数据波形展示出来 2.代码部分 步骤1&#xff1a;定义链表&#xff0c;用于数据保存 //数据结构-线性链表private List<byte> DataList new List<byte>(); 步骤2&#xff1a;定义波…

shell脚本2

在自定义变量当中&#xff0c;不可以以数字开头 变量追加值 在变量名后要写的东西 read -p &#xff1a;交互式输入变量值&#xff0c;然后使用变量 自定义变量 export 全局变量 如果想要bash里面的所有进程都能看见变量&#xff0c;加入export 父进程 子进程…

计算机毕业设计 基于SpringBoot的民宿租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Sentinel 新版本发布,提升配置灵活性以及可观测配套

作者&#xff1a;屿山 基本介绍 Sentinel 是阿里巴巴集团开源的&#xff0c;面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;承接了阿里巴巴近 15 年的双十一大促流量的核心场景&#xff0c;例如秒杀、冷启动、消息削峰填谷、集群流量控制、实时熔断下游不可用服…

考研C语言刷题基础篇之分支循环结构基础(二)

目录 第一题分数求和 第二题&#xff1a;求10 个整数中最大值 第三题&#xff1a;在屏幕上输出9*9乘法口诀表 第四题&#xff1a;写一个代码&#xff1a;打印100~200之间的素数 第五题&#xff1a;求斐波那契数的第N个数 斐波那契数的概念&#xff1a;前两个数相加等于第三…

2023 工业 AR 关键词:纵深和开拓

2023 年&#xff0c;以虚实融合、工业元宇宙为代表的“新数字化”升级在工业制造领域达成共识。 ▲五部委联合印发元宇宙行动计划 通过发展元宇宙赋能新型工业化 而相对过去几年的行业渗透广、落地场景多样的 AR 业务拓展与合作&#xff0c;#纵深和#开拓&#xff0c;成为 2023…

80端口被占用解决思路

普及一个概念&#xff1a;80端口是 HTTP&#xff08;HyperText Transport Protocol)即超文本传输协议开放的&#xff0c;此为上网冲浪使用次数最多的协议&#xff0c;主要用于WWW&#xff08;World Wide Web&#xff09;即万维网传输信息的协议。 我们使用 http 域名访问时都会…

Vue3 ref与reactive

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

HarmonyOS鸿蒙学习基础篇 - 基本语法概述

书接上文 HarmonyOS鸿蒙学习基础篇 - 运行第一个程序 Hello World 基本语法概述 打开 entry>src>main>ets>pages>index.ets 代码如下代码详细解释如下&#xff1a; Entry //Entry装饰的自定义组件将作为UI页面的入口。在单个UI页面中&#xff0c;最多可以使用…