SpringCloudAlibaba实战-nacos集群部署

news2024/11/16 23:39:25

写在前面:在学习阶段,我们想快速学习SpringCloudAlibaba功能,但总是花费大量时间跟着视频或博客做组件配置。由于版本的更迭,我们学习时的组件版本很可能和作者的不一致,又或者是各自环境不一,只能一坑又一坑的踩。因此,本篇博客针对这一痛点,进行nacos集群部署记录。

        关于nacos的理论知识,以及单机版部署网上前人之述足矣。关于集群实战方面,我看了一些视频和博客,一般分为:

  • window搭建(学习不建议)
  • linux搭建(环境准备繁琐)
  • docker单容器部署(集群模式启动\停止,修改配置繁琐)
  • docker-compose部署(企业常用)

        但关于docker-compose部署方式,一般都是单机单台版的,因此我想完善一下集群部署这块,并拓展一下docker-compose的使用方法,因为企业中部署经常需要用到。废话不多说,实战就开干!

一、环境准备

1. 虚拟机

  • 软件VmWare
  • 系统Centos7.6
  • 内存分配:8G

        关于虚拟机怎么配置,我推荐下面这篇博客,就不多介绍了。

VMware安装Centos7系统(命令行模式)_vm安装完centos镜像后怎么进入命令环境-CSDN博客文章浏览阅读6.2k次,点赞4次,收藏31次。一、准备软件、系统镜像二、创建新虚拟机三、安装CentOS7系统四、配置固定IP便于远程管理_vm安装完centos镜像后怎么进入命令环境https://blog.csdn.net/renfeigui0/article/details/102499358

2.安装docker

        使用docker-compose,首先需要下载docker和docker-compose。关于docker的下载,完全可以参考我的另一篇博客:

Study-02-Docker安装icon-default.png?t=N7T8http://t.csdnimg.cn/zrrdO当时跟着视频敲得博客,前面有些啰嗦。直接看从下面这部分开始复制粘贴即可:

ps:我上面的方法默认安装的最新版,当然撰写本博客时间,用的也是当前最新版。

3. 安装docker-compose

  • 命令安装
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

ps:这种方法我没成功过,因为网不好,再者翻墙,容易连接超时。这里有个很恶心的地方,国内也有相关的源,下载速度很快,确实可以下,但是下下来不能用,这就很离谱,试了几个博客的都是这。

  • 手动安装(推荐)

访问网址:

https://github.com/docker/compose/releasesicon-default.png?t=N7T8https://github.com/docker/compose/releases这里以docker-compose v2.21.0为例

(1)点击Assets,下载 docker-compose-linux-x86_64 

(2)上传文件

        将docker-compose-linux-x86_64 上传至下面目录下(一般这个目录都有,没有的话自己创建)。关于怎么上传,Xshell和finalShell这些图形化工具都有。

ps:为什么选择这个目录,因为下载后默认就是这个目录。

cd /usr/local/bin

        上传到该目录下后,重命名为 docker-compose。

mv docker-compose-linux-x86_64 docker-compose

        接下来就是赋予权限。

sudo chmod +x /usr/local/bin/docker-compose

安装完成后,进行验证:

docker-compose --version

二、集群部署

        使用docker-compose部署,首先梳理nacos集群需要什么:

  • mysql 8.0 镜像(本版要求5.7+)
  • nacos1.4.0 镜像 (版本根据项目来)
  • 部署使用:一个msyql容器、三个nacos容器。

1. 创建目录

sudo mkdir -p /usr/local/software/nacos

2. 构建docker-compose

(1)命令介绍

Compose 模板文件 - Docker — 从入门到实践icon-default.png?t=N7T8https://yeasy.gitbook.io/docker_practice/compose/compose_file(2)构建梳理

        nacos需要配置mysql,所以mysql需要先运行。mysql 运行需要先初始化脚本,创建nacos数据库和相关表。

(3)创建mysql初始化文件

  • 在nacos目录下创建init_mysql目录,然后创建init_nacos_mysql.sql文件。
mkdir init_mysql
vim init_nacos_mysql.sql

  • 进入nacos官网,拷贝nacos_db中的内容至init_nacos_mysql.sql中

网址:

https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/META-INF/nacos-db.sqlicon-default.png?t=N7T8https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/META-INF/nacos-db.sql

由于官网sql不包括创建数据库内容,所以在创建表结构上面需要加入创建数据库语句:

/******************************************/
/*   数据库 = nacos   */
/*   字符集 = utf8mb4   */
/*   排序规则 = utf8mb4_general_ci   */
/******************************************/

CREATE DATABASE IF NOT EXISTS nacos DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE nacos;

  • wq保存退出即可

(4)创建文件

  • 在上面创建的nacos目录下,执行:
vim docker-compose.yml
  • 输入 i 进入编辑模式,然后将下面内容复制进去,第三节我对文件会进行详解

ps:复制时,不要忘记使用 i 进入编辑模式!然后就是如果你误操作了的话,在Esc命令模式下,依次输入:gg  d  G 可以快速清空文档。

这里我们使用了端口:8846、8847、8848三个端口作为服务端口。

version: '3'
services:
  mysql:
    image: mysql:8.0.20
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - /usr/local/software/nacos/init_mysql:/docker-entrypoint-initdb.d
      - /usr/local/software/nacos/mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - nacos_network

  nacos1:
    image: nacos/nacos-server:1.4.0
    container_name: nacos1
    hostname: nacos1
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_APPLICATION_PORT=8846
      - NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
      - MYSQL_SERVICE_DB_NAME=nacos
    ports:
      - "8846:8846"
    depends_on:
      - mysql
    networks:
      - nacos_network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8846/nacos/v1/console/health/readiness"]
      interval: 30s
      timeout: 10s
      retries: 3

  nacos2:
    image: nacos/nacos-server:1.4.0
    container_name: nacos2
    hostname: nacos2
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_APPLICATION_PORT=8847
      - NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
      - MYSQL_SERVICE_DB_NAME=nacos
    ports:
      - "8847:8847"
    depends_on:
      - mysql
    networks:
      - nacos_network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8847/nacos/v1/console/health/readiness"]
      interval: 30s
      timeout: 10s
      retries: 3

  nacos3:
    image: nacos/nacos-server:1.4.0
    container_name: nacos3
    hostname: nacos3
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_APPLICATION_PORT=8848
      - NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
      - MYSQL_SERVICE_DB_NAME=nacos
    ports:
      - "8848:8848"
    depends_on:
      - mysql
    networks:
      - nacos_network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  nacos_network:
    driver: bridge
  • 保存后退出

(5)启动

在nacos目录下,输入命令:

docker-compose up -d

(6)检查

健康状态返回为healthy,说明集群部署成功:

传统客户端方法:

        访问网址,查看集群启动情况(记得开放客户端对应端口的防火墙):

sudo firewall-cmd --permanent --add-port=8848/tcp 

sudo firewall-cmd --reload

http://ip:8848/nacos/

如果想要远程访问数据库:记得防火墙开放3306端口。

至此,使用nacos集群部署完毕,下面是docker-compose启动和停止相关命令:

Tip: 要在docker-compose.yml同级目录下执行

  •  首次创建命令(后台执行)

docker-compose up -d

  • 启动命令

docker-compose start

  • 重启命令

docker-compose restart

  • 停止/删除命令
  1. docker-compose down

    这个命令不仅停止项目中定义的所有容器,还会删除它们。除了容器之外,与容器关联的网络、网络接口和默认的网络栈也会被删除。但请注意,除非你特别指定,否则挂载的卷(volumes)不会被删除。

  2. docker-compose down --volumesdocker-compose down -v

    这个命令会做docker-compose down相同的所有事情,并且还会删除所有在docker-compose.yml文件中定义的卷(volumes)。这是一种彻底清理项目的方式,因为它会移除所有数据。

  3. docker-compose stop

    这个命令只会停止容器,不会删除任何东西。所有的数据、网络设置和卷都会保留,以便后续可以通过docker-compose start再次启动。

        当然对于集群快速部署,上面已经完成了,但是对于docker-compose构建,估计还是有很多明白的地方,下面我将在第三节分享自己的心得。

三、docker-compose详解

        关于docker-compose基础知识,我在第二节的构建docker-compose中附的有网址,可以前去学习。下面我对本文编写的部署nacos文件进行详解。

1. 文件分析

version: '3'

        在docker-compose.yml文件中,version: "3"标志表示该文件使用的是Docker Compose的第3版语法。Docker Compose的不同版本提供了不同的特性和选项。版本3是为Docker 1.13及更高版本设计的,提供了一系列针对生产环境优化的新功能和改进。

networks:
  nacos_network:
    driver: bridge
  • networks: 定义了所有自定义网络的配置。
  • nacos_network: 这是自定义网络的名称。

  • driver: bridge: 指定使用桥接(bridge)驱动程序。桥接网络是Docker网络的一种类型,它使容器可以访问外部网络,同时还能让不同的容器互相通信。

        当使用docker-compose up启动服务时,Docker Compose会自动创建这个自定义网络,并且你在这个Compose文件里定义的所有服务都会连接到这个网络,从而能够在该网络内互相通信。

为什么要使用Dokcer网络?

  1. 隔离性: 不同的网络提供不同的隔离层,这样不同的应用或服务之间不会相互影响。这有助于增强安全性。

  2. 简化配置: 使用Docker网络可以自动进行DNS解析,容器可以通过服务名称而不是IP地址进行通信,这大大简化了配置。

  3. 易于扩展: 当应用需要更多服务或组件时,可以很容易地将它们加入到现有的Docker网络中,而不需要对现有系统进行大量修改。

  mysql:
    image: mysql:8.0.20
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - /usr/local/software/nacos/init_mysql:/docker-entrypoint-initdb.d
      - /usr/local/software/nacos/mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - nacos_network
  • mysql:自定义服务名,可以用这个名称在Docker Compose内部引用这个服务。
  • image: 指定使用哪个Docker镜像来创建容器,这里是MySQL的8.0.20版本。
  • container_name: 定义容器的名称为mysql。
  • environment: 定义环境变量。
    • MYSQL_ROOT_PASSWORD=123456: 设置MySQL root用户的密码为123456。
  • volumes: 映射宿主机和容器内的文件或目录。
    • /usr/local/software/nacos/init_mysql:/docker-entrypoint-initdb.d: 将宿主机的/usr/local/software/nacos/init_mysql目录映射到容器的/docker-entrypoint-initdb.d目录。用于初始化数据库。
    • /usr/local/software/nacos/mysql_data:/var/lib/mysql: 将宿主机的/usr/local/software/nacos/mysql_data目录映射到容器的/var/lib/mysql目录,用于保存MySQL的数据。
  • ports: 端口映射。
    • "3306:3306": 将容器的3306端口映射到宿主机的3306端口。
  • networks: 网络设置。
    • nacos_network: 这个容器将连接到名为nacos_network的自定义网络。
  nacos1:
    image: nacos/nacos-server:1.4.0
    container_name: nacos1
    hostname: nacos1
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_APPLICATION_PORT=8846
      - NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
      - MYSQL_SERVICE_DB_NAME=nacos
    ports:
      - "8846:8846"
    depends_on:
      - mysql
    networks:
      - nacos_network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8846/nacos/v1/console/health/readiness"]
      interval: 30s
      timeout: 10s
      retries: 3
  • nacos1: 服务名称,定义nacos1,nacos2,nacos3服务就可以在内部调用了。

  • image: 指定使用哪个Docker镜像来创建容器,这里是Nacos Server的1.4.0版本。

  • container_name: 定义容器的名称为nacos1

  • hostname: 设置容器内部的主机名为nacos1,不写的话默认为容器id。

  • environment: 定义环境变量。

    • PREFER_HOST_MODE=hostname:Nacos首选的主机模式设置为主机名,上面我们自定义为了nacos1。
    • MODE=cluster:Nacos运行在集群模式下。
    • NACOS_APPLICATION_PORT=8846:Nacos应用的端口。
    • NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848:集群中其他Nacos服务器的地址和端口。(这里也可以写ip地址,但记得加"",例如:“192.168.64.1:8846 192.168.64.1:8847 192.168.64.1:8848”)
    • SPRING_DATASOURCE_PLATFORM=mysql:使用MySQL作为数据源。
    • MYSQL_SERVICE_HOST=mysql:MySQL服务的主机名。
    • MYSQL_SERVICE_PORT=3306:MySQL服务的端口。
    • MYSQL_SERVICE_USER=root:MySQL的用户。
    • MYSQL_SERVICE_PASSWORD=123456:MySQL用户的密码。
    • MYSQL_SERVICE_DB_NAME=nacos:使用的MySQL数据库名称。
  • ports: 端口映射。

    • "8846:8846": 将容器的8846端口映射到宿主机的8846端口。
  • depends_on: 依赖服务。

    • mysql: nacos1服务依赖于mysql服务,mysql启动后才执行nacos1。还有一种
  • networks: 网络设置。

    • nacos_network: 这个容器将连接到名为nacos_network的自定义网络。
  • healthcheck: 健康检查设置。

    • test: 执行的健康检查命令,nacos有健康检查命令。
    • interval: 检查间隔。
    • timeout: 超时时间。
    • retries: 重试次数。

其他集群配置和nacos1配置一致,只需要更改端口号和服务名就可以实现增加集群节点。

2. 其他问题

如何修改Nacos配置?

        直接在environment中修改nacos参数即可,但是修改docker-compose后需要重新构建。但是需要重新启动服务。

重新启动服务: 有两种主要方法可以重新启动服务以应用更改。

  • 全部重新启动: 使用docker-compose down将现有的服务容器、网络、卷和图像全部停止并删除,然后使用docker-compose up重新启动。

  • 部分重新启动: 如果你只是修改了一个服务,你也可以仅重新启动该服务。使用docker-compose up -d <service_name>来重新启动特定的服务。这样做通常更快,因为它不会影响到其他正在运行的服务。例如:只修改了nacos1服务,则执行:docker-compose up -d nacos1。

内存配置过大问题?

        nacos会设置默认JVM参数,如果感觉比较大,可以自定义参数,在environment中增加下面的参数配置即可。最后根据情况选择重启服务方式。

	  - JVM_XMS=1g
	  - JVM_XMX=1g
	  - JVM_XMN=512m

出错了,如何查看日志?

docker logs -f 容器id

nacos状态不是healthy?

        第一次构建,有时候会出现某个服务启动失败的情况,有可能是因为数据库容器没有及时启动,可以执行docker-compose restart命令重启试试。还有启动时间较长会处于Starting状态,耐心等待即可,如若不行,请使用上面的查看日志命令,具体定位原因。有可能会有疑惑,为什么docker-compose中使用了depends_on还会出现加载顺序失败的问题,下面进行补充:

  1. 启动顺序: 使用depends_on会控制容器的启动顺序,但它不会等待依赖的服务“完全就绪”后再启动。例如,数据库可能需要一些时间初始化,但depends_on不会等数据库初始化完成。

  2. 停止顺序: depends_on也影响容器的停止顺序。依赖服务将先于依赖它的服务停止

  3. 健康检查: 如果你需要等待依赖服务完全启动(例如,数据库初始化完成),可以在docker-compose.yml中为依赖服务添加一个healthcheck字段。

  4. 并非强制性: 即使没有使用depends_on,所有服务仍然可以手动按任何顺序启动和停止。depends_on只是自动化这个过程。

四、对比普通docker构建

1. 构建mysql

拉取镜像:

docker pull mysql:8.0.20

启动镜像:

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456  -d mysql:8.0.20

2. 构建nacos集群

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8846 \
-e NACOS_SERVERS="192.168.64.142:8846 192.168.64.142:8847 192.168.64.142:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.64.142 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_SERVER_IP=192.168.64.142 \
-p 8846:8846 \
--name my-nacos1 \
nacos/nacos-server:1.4.0


docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8847 \
-e NACOS_SERVERS="192.168.64.142:8846 192.168.64.142:8847 192.168.64.142:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.64.142 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_SERVER_IP=192.168.64.142 \
-p 8847:8847 \
--name my-nacos2 \
nacos/nacos-server:1.4.0


docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS="192.168.64.142:8846 192.168.64.142:8847 192.168.64.142:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.64.142 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_SERVER_IP=192.168.64.142 \
-p 8848:8848 \
--name my-nacos3 \
nacos/nacos-server:1.4.0

开放防火墙端口:

sudo firewall-cmd --permanent --add-port=8846/tcp 

sudo firewall-cmd --permanent --add-port=8847/tcp 

sudo firewall-cmd --permanent --add-port=8848/tcp 

sudo firewall-cmd --reload

测试访问:

http://192.168.64.142:8846/nacos
http://192.168.64.142:8847/nacos
http://192.168.64.142:8848/nacos

3. 优缺点对比

Docker Compose构建的优点:

  1. 简单性和一致性: 通过一个docker-compose.yml文件,你可以定义整个应用环境的所有服务、网络和卷,这样可以确保每次部署都是一致的。

  2. 自动化: 一条docker-compose up命令就可以启动你在docker-compose.yml中定义的所有服务和依赖。

  3. 便于本地开发: 对于多服务应用,使用Docker Compose可以轻易地在本地机器上模拟生产环境。

  4. 依赖管理: 通过depends_on字段,可以轻松管理服务间的依赖关系。

  5. 可读性和文档化: docker-compose.yml文件也作为一种文档,可以让其他开发者或系统管理员快速了解应用的结构和服务。

  6. 网络配置: 简化了容器间网络连接的设置,自动配置了一个默认的网络环境。

  7. 缩放和负载均衡: 使用docker-compose可以方便地扩展服务的实例数量。

Docker Compose构建的缺点:

  1. 复杂性: 对于单一应用或只有一个服务的简单项目,使用Docker Compose可能显得过于复杂。

  2. 学习曲线: 相较于Docker单命令,需要时间学习docker-compose.yml文件的语法和选项。

  3. 不适用于生产: Docker Compose主要是为了简化开发和测试环境的配置,而不是用于生产环境。对于生产环境,更推荐使用如Kubernetes这样的容器编排工具。

  4. 资源消耗: 如果你在本地机器上运行多个容器,可能会消耗大量的资源。

Docker单台运行的优点:

  1. 简单快捷: 对于简单应用或单个服务,使用基础的Docker命令更为直接和快速。

  2. 更少的抽象: 没有额外的抽象层,有时候这样更容易理解和调试。

  3. 适用于生产: Docker容器可以在生产环境中单独运行,或者被集成到其他容器编排解决方案中。

Docker单台运行的缺点:

  1. 手动管理: 每个容器和服务都需要手动启动、停止和连接。

  2. 难以管理依赖: 如果有多个相互依赖的服务,手动管理它们会变得复杂和容易出错。

  3. 不易于复制: 没有一个统一的配置文件,迁移到另一台机器或共享给其他开发者会更困难。

  4. 缺乏自动化和一致性: 由于没有自动化脚本和定义好的配置,可能会导致环境不一致的问题。

        本文详细介绍了docker-compose在单台服务器上构建集群,虽然真实开发中并不会这样做,而是使用的真实的服务器,搭建集群。但是通过本次搭建的过程,可以知道docker-compose的基本应用。如果道友有足够的时间,部署项目时不妨改造试试,假设你的微服务项目有:study_front,study_backend1,study_backend2,mysql等等。使用docker-compose部署构建可以很方便的管理和维护,迁移到别处也不会因为环境问题而头疼。

        至此,一个使用docker-compose搭建nacos集群完毕,恭喜道友在学习之路上更进一步。这学习大道茫茫,然而你我都是这条路上的苦行僧,在此留下心得,祝你我都能修的圆满。咱们下一个路口(BUG)见!

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

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

相关文章

C++前缀和算法的应用:统计得分小于K的子数组数目

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 一个数组的分数定义为数组之和 乘以 数组的长度。 比方说&#xff0c;[1, 2, 3, 4, 5] 的分数为 (1 2 3 4 5) * 5 75 。 给你一个正整数数组 nums 和一个整…

【C】关于动态内存的试题及解析

目录 第1题&#xff1a; 第2题&#xff1a; 第3题&#xff1a; 第4题&#xff1a; 第5题&#xff1a; 在学习了关于动态开辟内存的相关知识后&#xff0c;下面是一些涉及到动态开辟内存程序的试题及解析&#xff08;试题部分来自《高质量的C/C编程》、笔试题&#xff09;。 第1…

2023年【上海市安全员A证】报名考试及上海市安全员A证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员A证报名考试是安全生产模拟考试一点通总题库中生成的一套上海市安全员A证试题及解析&#xff0c;安全生产模拟考试一点通上上海市安全员A证作业手机同步练习。2023年【上海市安全员A证】报名考试及上海市…

智能指针(C++11)

行到水穷处&#xff0c;坐看云起时。 文章目录 简介内存泄漏内存泄漏分类内存泄漏检测工具 RAII智能指针原理智能指针使用std::auto_ptrstd::unique_ptrstd::shared_ptrstd::shared_ptr循环引用 std::weak_ptr 总结 简介 C智能指针是在C11标准引入的一项重要功能&#xff0c;用…

建模仿真软件 Comsol Multiphysics mac中文版软件介绍

COMSOL Multiphysics mac是一款全球通用的基于高级数值方法和模拟物理场问题的通用软件&#xff0c;拥有、网格划分、研究和优化、求解器、可视化和后处理、仿真 App等相关功能&#xff0c;轻松实现各个环节的流畅进行&#xff0c;它能够解释耦合或多物理现象。 附加产品扩展了…

Postman接口测试,全网最详细教程

Postman的脚本可以导出多种语言的脚本&#xff0c;方便二次维护开发。 Python的requests库&#xff0c;支持python2和python3&#xff0c;用于发送http/https请求 使用unittest进行接口自动化测试 0 1****环境准备 1、安装python &#xff08;使用python2或3都可以&#x…

Spring源码-4.Aware接口、初始化和销毁执行顺序、Scope域

Aware接口 其实在生命周期中&#xff0c;Aware接口也参与进来了&#xff0c;如图所示&#xff1a; 如初始化时的第三步&#xff0c;其实就是调用了Aware相关接口。 以常见的Aware接口举例&#xff1a; 1.BeanNameAware 主要是注入Bean的名字 2.BeanFactoryAware 主要是时注…

ESP32开发日志记录

用过一段时间的ESP8266开发&#xff0c; 是在ubunut下建立的开发环境&#xff0c;现在ESP32更简单&#xff0c;直接在Window下IDE即可完成系统配置、新建工程及编译下载工作&#xff0c;使用起来更加简便 一、生成ESP32的工程运行出错 大概意思的芯片是单核芯片&#xff0c;但…

有什么软件能实现erp、crm、oa、财务系统一体化?

只要你能梳理清楚业务逻辑&#xff0c;没有代码基础也完全可以自己搭建业务系统&#xff0c;比ERP管理系统、工程项目管理系统等等......用简道云就可以轻松实现&#xff1a; 下面来按照题主的需求介绍几个系统&#xff1a; 01 客户关系——CRM客户管理套件 重磅打造客户跟进、…

阿里p8推荐,测试覆盖率工具—Jacoco

测试覆盖率工具 测试过程中根据需求文档和设计文档编写测试用例、执行测试&#xff1b;为了更加全面的覆盖&#xff0c;我们可能还需要理解被测程序的逻辑&#xff0c;需要考虑到每个函数的输入与输出&#xff0c;逻辑分支代码的执行情况&#xff0c;这个时候我们的测试执行情…

鉴源论坛 · 观擎丨基于模型的方法在民机机载软件中的应用

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 基于模型的开发和验证MBDV 模型泛指用于支持软件开发过程或软件验证过程的系统的一组软件方面的抽象表示&#xff0c;在机载软件…

【深度学习】【NLP】如何得到一个分词器,如何训练自定义分词器:从基础到实践

文章目录 什么是分词&#xff1f;分词算法使用Python训练分词器步骤1&#xff1a;选择分词算法步骤2&#xff1a;准备训练语料步骤3&#xff1a;配置分词器参数步骤4&#xff1a;训练分词器步骤5&#xff1a;测试和使用分词器 代码示例&#xff1a;使用SentencePiece训练分词器…

技术分享| anyRTC低延时直播优化

直播系统就是把活动现场的音频或视频信号经数字压缩后&#xff0c;传送到直播多媒体服务器(CDN)上&#xff0c;在互联网上供广大网友或授权特定人群收听或收看。而随着技术的日益更新&#xff0c;人民对于直播的互动性&#xff0c;实时性要求更高了&#xff0c;传统的直播少则几…

C语言编写图形化界面-创建按钮-为其指定样式

文章目录 前置章节指定窗口样式给按钮加边框扁平化按钮复选框样式按钮自动复选框 单选按钮三态按钮自动三态按钮 默认按钮样式&#xff08;对话框Enter键&#xff09; 设置按钮位置和大小封装函数 前置章节 开始之前&#xff0c;需要学习以下章节&#xff1a; 创建窗口 窗口过…

10G传输分析仪SDH表TFN D450S参数详情

D450S 10G SDH系列 SDH/SONET传输测试模块 D450S系列SDH/SPNET传输测试模块是TFN模块化测试产品中的一款。D450S系列可配置在FT100测试平台上&#xff0c;实现广泛的PDH/DSn和SDH/SONET的测试功能&#xff0c;为城域网提供综合的测试方案&#xff0c;是高性价比的网络测试产品…

500内部服务器错误很常见,但解决方法也很常见

500内部服务器错误是一个非常通用的HTTP状态代码,这意味着网站的服务器出现了问题,但服务器无法更具体地说明具体问题是什么。 HTTP 500内部服务器错误的原因 大多数情况下,当页面或网站的编程出现问题时,就会出现此错误,但问题肯定在你这边。这些问题可能是由浏览器中的…

Linux系统之file命令的基本使用

Linux系统之file命令的基本使用 一、file命令介绍1.1 Linux简介1.2 file命令简介 二、file命令的使用帮助2.1 file命令的help帮助信息2.2 file命令的语法解释2.3 file命令的man手册 三、文件类型介绍四、file命令的基本使用4.1 查询file版本4.2 显示文件类型4.3 输出时不显示文…

selenium+python web自动化测试框架项目实战实例教程

自动化测试对程序的回归测试更方便。 由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行... 可以运行更加繁琐的测试 自动化测试的一个明显好处就是可以在很短的时间内运行更多的测试。学习自动化测试最终目的是应用到实际项目中&…

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技…

C++模板类用作参数传递

前言 在模板类<>传递参数的一种实现。记不住&#xff0c;以此记录。 // dome.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #define _CRT_SECURE_NO_WARNINGS #include <iostream> //#include "tools.h" #include <fu…