当前位置: 首页 > news >正文

SpringCloudAlibaba实战-nacos集群部署

写在前面:在学习阶段,我们想快速学习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.20container_name: mysqlenvironment:- MYSQL_ROOT_PASSWORD=123456volumes:- /usr/local/software/nacos/init_mysql:/docker-entrypoint-initdb.d- /usr/local/software/nacos/mysql_data:/var/lib/mysqlports:- "3306:3306"networks:- nacos_networknacos1:image: nacos/nacos-server:1.4.0container_name: nacos1hostname: nacos1environment:- 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=nacosports:- "8846:8846"depends_on:- mysqlnetworks:- nacos_networkhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8846/nacos/v1/console/health/readiness"]interval: 30stimeout: 10sretries: 3nacos2:image: nacos/nacos-server:1.4.0container_name: nacos2hostname: nacos2environment:- 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=nacosports:- "8847:8847"depends_on:- mysqlnetworks:- nacos_networkhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8847/nacos/v1/console/health/readiness"]interval: 30stimeout: 10sretries: 3nacos3:image: nacos/nacos-server:1.4.0container_name: nacos3hostname: nacos3environment:- 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=nacosports:- "8848:8848"depends_on:- mysqlnetworks:- nacos_networkhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness"]interval: 30stimeout: 10sretries: 3networks: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.20container_name: mysqlenvironment:- MYSQL_ROOT_PASSWORD=123456volumes:- /usr/local/software/nacos/init_mysql:/docker-entrypoint-initdb.d- /usr/local/software/nacos/mysql_data:/var/lib/mysqlports:- "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.0container_name: nacos1hostname: nacos1environment:- 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=nacosports:- "8846:8846"depends_on:- mysqlnetworks:- nacos_networkhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8846/nacos/v1/console/health/readiness"]interval: 30stimeout: 10sretries: 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.0docker 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.0docker 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)见!

相关文章:

SpringCloudAlibaba实战-nacos集群部署

写在前面&#xff1a;在学习阶段&#xff0c;我们想快速学习SpringCloudAlibaba功能&#xff0c;但总是花费大量时间跟着视频或博客做组件配置。由于版本的更迭&#xff0c;我们学习时的组件版本很可能和作者的不一致&#xff0c;又或者是各自环境不一&#xff0c;只能一坑又一…...

Elasticsearch安装IK分词器

ik分词包 参考博客、参考博客 将下载好的zip包解压&#xff0c;生成一个ik文件夹 将ik文件夹移动到ES安装目录下的plugins文件夹下&#xff08;每台ES节点都要执行相同的操作&#xff09; 重启ES集群 坑...

『51单片机』 DS1302时钟

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大…...

ubuntu部署个人网盘nextCloud使用docker-compose方式

概述 当下各大网盘的容量都是有限制的&#xff0c;而且xx云不开会员网速就拉跨。 所以就想搭建一个自己的盘&#xff0c;并且可以控制用户的权限分组&#xff1b; nextCloud就很合适 我这边都是自己用偶尔给其他人使用下&#xff0c;所以直接docker部署了。 ubuntu版本&…...

【ChatGPT 01】ChatGPT基础科普

1. 从图灵测试到ChatGPT 1950年&#xff0c;艾伦•图灵(Alan Turing)发表论文**《计算机器与智能》&#xff08; Computing Machinery and Intelligence&#xff09;&#xff0c;提出并尝试回答“机器能否思考”这一关键问题。在论文中&#xff0c;图灵提出了“模仿游戏”&…...

2317.操作后的最大异或和

非常好的一个位运算推公式题目 首先num[i]^x可以知道 这里可以变成任意一个数字 又有num[i]&上上面的数字 所以我们可以扣掉任意位的1把它变成0 答案让我们求异或和 所以只要这一位有1 答案的这一位就有1 我们发现这就是一个按位或运算 class Solution { public:int maxi…...

Python爬虫-经典案例详解

爬虫一般指从网络资源的抓取&#xff0c;通过Python语言的脚本特性&#xff0c;配置字符的处理非常灵活&#xff0c;Python有丰富的网络抓取模块&#xff0c;因而两者经常联系在一起Python就被叫作爬虫。爬虫可以抓取某个网站或者某个应用的内容提取有用的价值信息。有时还可以…...

【信创】银河麒麟V10 安装postgis

安装postGis步骤 1、安装 proj4 #tar -zxvf proj-4.8.0.tar.gz #cd proj-4.8.0 #mkdir -p /opt/proj-4.8.0 #./configure --prefix=/opt/proj-4.8.0 #make && make install #vi /etc/ld.so.conf.d/proj-4.8.0.conf #ldconfig 2、安装 geos #tar -xjf geos-3.6.1.tar.b…...

OpenCV常用功能——灰度处理和图像二值化处理

文章目录 一、灰度处理1.1 cvtColor函数 二、图像二值化处理2.1 全局阈值2.2 自适应阈值 一、灰度处理 1.1 cvtColor函数 函数原型&#xff1a; cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst功能&#xff1a;转换图像颜色空间。 参数&#xff1a; src: 输入图像。co…...

excel巧用拼接函数CONCAT输出JSON、SQL字符串

一、前言 工作中有时候需要用Excel对数据进行组装&#xff0c;需要输出JSON或者SQL语句&#xff0c;然后通过脚本或Java程序完成一些特定功能&#xff0c;总结了一下用到的函数&#xff0c;方便以后使用。这里使用的是WPS软件。 二、输出JSON 例如&#xff1a;需要将几列数据…...

Redis桌面管理工具:Redis Desktop Manager for Mac

Redis Desktop Manager是一款非常实用的Redis管理工具&#xff0c;它不仅提供了方便易用的图形用户界面&#xff0c;还支持多种Redis数据结构&#xff0c;可以帮助用户轻松地完成Redis数据库的管理工作。 以下是一些推荐Redis Desktop Manager的理由&#xff1a; 多平台支持&a…...

基于SSM的汽车维修管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的汽车维修管理系统,java项目。 …...

volatile 系列之如何解决可见性问题

下面我们来看一下volatile是如何解决可见性问题的呢?如果我们针对stop字段增加volatile关键字: public static volatile boolean stopfalse; 然后&#xff0c;使用hsdis工具获取IT编译器生成的汇编指令来查看volatile写操作带来的影响和变化。 接着&#xff0c;设置J…...

网络安全(黑客技术)—小白自学

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&am…...

MTK AEE_EXP调试方法及user版本打开方案

一、AEE介绍 AEE (Android Exception Engine)是安卓的一个异常捕获和调试信息生成机制。 手机发生错误(异常重启/卡死)时生成db文件(一种被加密过的二进制文件)用来保存和记录异常发生时候的全部内存信息,经过调试和仿真这些信息,能够追踪到异常的缘由。 二、调试方法…...

京东平台数据分析:2023年9月京东扫地机器人行业品牌销售排行榜

鲸参谋监测的京东平台9月份扫地机器人市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;9月份&#xff0c;京东平台扫地机器人的销量近14万&#xff0c;环比增长约2%&#xff0c;同比降低约4%&#xff1b;销售额为2.9亿&#xff0c;环比降低约4%&#xff0…...

pytorch 笔记:index_select

1 基本使用方法 index_select 是 PyTorch 中的一个非常有用的函数&#xff0c;允许从给定的维度中选择指定索引的张量值 torch.index_select(input, dim, index, outNone) -> Tensorinput从中选择数据的源张量dim从中选择数据的维度index 一个 1D 张量&#xff0c;包含你想…...

面试算法43:在完全二叉树中添加节点

题目 在完全二叉树中&#xff0c;除最后一层之外其他层的节点都是满的&#xff08;第n层有2n-1个节点&#xff09;。最后一层的节点可能不满&#xff0c;该层所有的节点尽可能向左边靠拢。例如&#xff0c;图7.3中的4棵二叉树均为完全二叉树。实现数据结构CBTInserter有如下3种…...

Python算法例3 检测2的幂次

1. 问题描述 检测一个整数n是否为2的幂次。 2. 问题示例 n8&#xff0c;返回True&#xff1b;n6&#xff0c;返回False。 3.代码实现 # 采用UTF-8编码格式 # 参数n是一个整数 # 返回True或者False class Solution:def checkPowerOf2(self,n):ans 1for i in range(31):if …...

线扫相机DALSA--采集卡Base模式设置

采集卡默认加载“1 X Full Camera Link”固件&#xff0c;Base模式首先要将固件更新为“2 X Base Camera Link”。 右键SCI图标&#xff0c;选择“打开文件所在的位置”&#xff0c;找到并打开SciDalsaConfig的Demo&#xff0c;如上图所示&#xff1a; 左键单击“获取相机”&a…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...