Nacos 持久化及集群的搭建【微服务】

文章目录

    • 一、统一配置管理
    • 二、微服务配置拉取
    • 三、配置热更新
    • 四、多环境共享配置
    • 五、Nacos 集群搭建
      • 1. 集群结构
      • 2. 初始化数据库
      • 3. 搭建集群
    • 六、Nginx 反向代理
    • 七、启动项目测试

一、统一配置管理

案例练习的时候我们只有两个微服务,管理起来非常简单,但在真正的项目中将会出现大量的微服务,当一些核心配置发生改变的时候,我们就需要修改所有与它相关的微服务,且不得不重启,这样带来的代价是非常大的。所以我们希望这些配置文件能够实现统一的管理,并且保证更改热更新,无需重启即可生效。
此时我们需要一个配置管理服务,将核心的经常需要改动的配置放上去,微服务启动的时候就可以去读取该配置,再与本地的配置相结合,作为完整配置去使用。当这些核心配置需要改动的时候,直接在配置管理服务中去改动就 OK 了,改完之后它就会立即通知微服务,完成配置的读取。

不管是注册中心还是配置管理服务,它们都是由 Nacos 实现的,所以配置管理服务也是在 Nacos 控制台设置的!

① 点击配置列表中的加号添加配置

在这里插入图片描述

② 填写配置表单,Data ID 其实就是配置文件的名称,该名称不能冲突,一般的命名格式为:服务名-生产环境.后缀名(userserver-dev.yaml)

在这里插入图片描述

③ 编写配置内容并发布,注意这里的内容并不是啥都往上写,我们只写核心的、有热更新需求的配置

在这里插入图片描述

在这里插入图片描述

二、微服务配置拉取

配置获取步骤如下:
项目启动 → 读取 Nacos 中的配置文件 → 读取本地配置文件 → 创建 spring 容器 → 加载 bean

Nacos 中的配置文件与本地配置文件相结合,组成最终的配置文件!

项目启动后,我们需要知道去哪里读取 Nacos 配置文件(当然是 Nacos)?要读取的又是哪个文件(落实到文件名)?而这些信息其实都被提前配到了一个叫 bootstrap.yml 文件中。

bootstrap.yml 是引导类配置文件,它的优先级高于 application.yml 文件,所以我们可以把 Nacos 地址以及文件的相关信息都写到 bootstrap.yml 里面,完成 Nacos 配置的读取,而后与本地文件相结合。

① 引入 Nacos 的配置管理客户端依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

在这里插入图片描述

② 在 userserver 中的 resource 目录中添加一个 bootstrap.yml 文件,并编写 Nacos 地址和远程文件相关信息,服务名称+开发环境+文件后缀名其实就是远程配置文件的 Data ID

spring:application:name: userserver #服务名称profiles:active: dev #开发环境cloud:nacos:server-addr: localhost:8848 #Nacos地址config:file-extension: yaml #文件后缀名

在这里插入图片描述

③ 把 application.yml 中重复的配置删掉(服务名称和 Nacos 地址)

在这里插入图片描述

④ 在 UserController 中编写测试代码,试一下是否配置成功,@Value 注解读取配置

在这里插入图片描述

Spring Cloud 新版本默认将 Bootstrap 禁用,所以还需要引入 spring-cloud-starter-bootstrap 依赖到父工程中,否则会报错,旧版本可忽略这一步!

<dependency><!-- 新版本默认将 Bootstrap 禁用,需引入依赖 --><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

⑤ 启动项目并访问

在这里插入图片描述

三、配置热更新

上面的图片可以看到当前时间已经显示出来了,也就是说我们的 Nacos 生效了,那么热更新呢?我们接下来可以试一下配置自动刷新!

我们把远程配置修改一下并发布,刷新浏览器,发现它并没有热更新还是以前的配置,这是为什么呢?

在这里插入图片描述

在这里插入图片描述

Nacos 中的配置文件变更后,微服务无需重启就可以感知,不过需要通过下面两种配置实现:

① 方式一:在 @Value 注入的变量所在类上添加属性刷新的注解 @RefreshScope

在这里插入图片描述

在这里插入图片描述

② 方式二:使用 @ConfigurationProperties 注解,可以完成配置的自动更新

package com.zxe.userserver.pojo;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformat;public String getDateformat() {return dateformat;}public void setDateformat(String dateformat) {this.dateformat = dateformat;}
}

在这里插入图片描述
在这里插入图片描述

推荐使用方式二,因为 @ConfigurationProperties 本身就可以自动更新,无需再添加其他注解!

四、多环境共享配置

什么情况下会遇到微服务的配置共享呢?比如某属性它在开发、生产、测试等环境下的值是一样的,这就没必要在每个环境中都写一遍了,代码冗余,而且如果要改动,每个配置文件都得改,这样显然是不合理的。我们想要只配置一次该属性,不管环境怎么变,该配置始终能被加载,这就是多环境配置共享。

我们之前的 Nacos 远程配置文件是 userserver-dev.yaml,dev 是跟环境相关的。而多环境配置不需要环境相关信息,所以这里的文件名应该是 userserver.yaml,当微服务启动的时候,userserver-dev.yaml 和 userserver.yaml 都会被读取,前者只在 dev 环境下加载,而后者在任何环境中都会被加载,因此,多环境共享配置可以写入这个文件里面。

① 新建配置并发布,DataID 为 userserver.yaml

在这里插入图片描述

在这里插入图片描述

② 编写测试代码,实体类新增 envSharedValue 属性

在这里插入图片描述

在这里插入图片描述

③ 便于测试,我们先在 dev 环境下启动一个服务,修改环境后再启动一个服务,观察控制台输出可以看到,userserver.yaml 的配置内容会同时在这两个环境中显示,这就是多环境共享配置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

配置文件的优先级:
服务名-生产环境.yaml > 服务名.yaml > 本地配置

优先级:远程大于本地,具体大于共享!

五、Nacos 集群搭建

1. 集群结构

实际上,Nacos 的工作量远不止这些,所以为了减小 Nacos 的压力,我们一定为它配置集群模式,此处用 Nginx 来做负载均衡。
假设 A 为消费者,B 为生产者:在集群模式下,A 需要拉取 B,就会向 Nacos 发起拉取请求,此请求会被 Nginx 拦截走做负载均衡,即从 Nacos 集群中挑选一个节点出来,最终我们就是从该结点上拉取服务列表的,在该列表内部继续做负载均衡,挑选出一个具体的实例去处理真正的请求。

在这里插入图片描述

2. 初始化数据库

Nacos默认数据存储在内嵌数据库中,不属于生产可用的数据库。其实数据库也应该用主从模式的高可用数据库集群,为了节省时间这里我们以单点的数据库为例。

首先新建一个数据库,命名为 nacos,而后导入下面的 SQL:

/** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*//******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE TABLE `config_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(255) DEFAULT NULL,`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL,`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`c_desc` varchar(256) DEFAULT NULL,`c_use` varchar(64) DEFAULT NULL,`effect` varchar(64) DEFAULT NULL,`type` varchar(64) DEFAULT NULL,`c_schema` text,`encrypted_data_key` text NOT NULL COMMENT '秘钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(255) NOT NULL COMMENT 'group_id',`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',`content` longtext NOT NULL COMMENT '内容',`gmt_modified` datetime NOT NULL COMMENT '修改时间',`app_name` varchar(128) DEFAULT NULL,`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`encrypted_data_key` text NOT NULL COMMENT '秘钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (`id` bigint(20) NOT NULL COMMENT 'id',`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`nid` bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`nid`),UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (`id` bigint(20) unsigned NOT NULL,`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`data_id` varchar(255) NOT NULL,`group_id` varchar(128) NOT NULL,`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL,`md5` varchar(32) DEFAULT NULL,`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`src_user` text,`src_ip` varchar(50) DEFAULT NULL,`op_type` char(10) DEFAULT NULL,`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`encrypted_data_key` text NOT NULL COMMENT '秘钥',PRIMARY KEY (`nid`),KEY `idx_gmt_create` (`gmt_create`),KEY `idx_gmt_modified` (`gmt_modified`),KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';CREATE TABLE `tenant_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`kp` varchar(128) NOT NULL COMMENT 'kp',`tenant_id` varchar(128) default '' COMMENT 'tenant_id',`tenant_name` varchar(128) default '' COMMENT 'tenant_name',`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';CREATE TABLE `users` (`username` varchar(50) NOT NULL PRIMARY KEY,`password` varchar(500) NOT NULL,`enabled` boolean NOT NULL
);CREATE TABLE `roles` (`username` varchar(50) NOT NULL,`role` varchar(50) NOT NULL,UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);CREATE TABLE `permissions` (`role` varchar(50) NOT NULL,`resource` varchar(255) NOT NULL,`action` varchar(8) NOT NULL,UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

在这里插入图片描述

3. 搭建集群

条件有限,我们只能在一台电脑上部署 Nacos 节点。

① 进入 Nacos 的 conf 目录,修改配置文件 cluster.conf.example,重命名为 cluster.conf

在这里插入图片描述

② 打开 cluster.conf,修改 IP 地址和端口号,这里三个节点均为本机,所以 IP 是你自己本机的 IP 地址(不方便展示,我这里用127.0.0.1代替),如果在生产环境中应该是三台真实机器的 IP 地址,注意 2.0 版本以上的 Nacos 端口号一定不能是连续的数字,否则到后面启动的时候会报错

cmd → ipconfig 查看,注意这里的 IP 必须是外网 IP,如果使用内网 IP 就会出现服务列表在各 Nacos 节点上不同步的问题!

127.0.0.1:2222
127.0.0.1.3333
127.0.0.1.4444

在这里插入图片描述

③ 编辑 application.properties 文件,打开数据源(去掉前面的注释符号),告诉 Nacos 我们用的是 mysql 集群,打开数据库数量(我们只有一台 mysql),打开数据库配置(修改自己的数据库名、账号和密码)

在这里插入图片描述

④ 将 Nacos 文件夹复制三份,分别命名为 nacos1、nacos2、nacos3

在这里插入图片描述

⑤ 分别修改三个文件夹中的 application.properties,填写各自的端口号

在这里插入图片描述

⑥ 分别启动三个 Nacos 节点

startup.cmd

在这里插入图片描述

如果你的 Nacos 版本是 2.0 以上的,那么这时当你在启动第二个节点的时候就会报错(低版本不影响,不报错的可直接跳过这里),报错信息如下:

在这里插入图片描述

简单的来说就是端口被占用了!由于Nacos 2.0 版本新增了 gRPC 通讯方式,导致自身还需要两个端口 9848 和 9849,这就要保证 8848、9848、9849 是空闲的。
而这两个端口号是怎么来的呢?我们都知道原端口号是 8848,那么 9848 和 9849 其实就是原端口号加 1000 和 1001 的结果,如果节点配置的是连续的端口号(比如1111、1112、1113),那么当第二个节点启动的时候,9848 和 9849 这两个端口一定是被第一个节点占用的,所以在前面 cluster.conf 中配置端口的时候,端口号至少应该隔一个位置。

六、Nginx 反向代理

Nginx 下载点击这里!

在这里插入图片描述

① 编辑 conf 目录下的 nginx.conf,将配置代码粘贴到 http 花括号里面

同样,这里的 127.0.0.1 也要替换成你的外网 IP 地址!

upstream nacos-cluster {server 127.0.0.1:2222;server 127.0.0.1:3333;server 127.0.0.1:4444;
}server {listen       80;server_name  localhost;location /nacos {proxy_pass http://nacos-cluster;}
}

在这里插入图片描述

在这里插入图片描述

只要访问到 localhost/nacos 路径,就会被 Nginx 代理到 http://nacos-cluster 集群,然后做负载均衡,最终选择一个节点出来去处理请求。

② Nacos 2.0 以上版本还需配置 grpc 协议,依然是在 nginx.conf 文件里面,粘贴以下代码

注意不要粘在 http 里面!

# nacos的grpc协议配置
stream {upstream nacoscluster-grpc{# nacos2版本,grpc端口与要比主端口多1000server 127.0.0.1:3222 weight=1;server 127.0.0.1:4333 weight=1;server 127.0.0.1:5444 weight=1;}server{listen 1080;proxy_pass nacoscluster-grpc;}
}

在这里插入图片描述

③ 在 nginx.exe 所在目录下 cmd 打开黑窗口,start nginx.exe 启动 Nginx

在这里插入图片描述

④ Nginx 启动成功之后,打开浏览器并访问 localhost/nacos,代理成功,我们看到的 Nacos 只有一个,实际上 Nginx 已经在 Nacos 集群中做了负载均衡

在这里插入图片描述

七、启动项目测试

① Nacos 地址已经不再是 8848 了,Nginx 里面配的是 80,所以代码里面的 Nacos 端口也要改成 80

在这里插入图片描述

② 启动服务测试一下,多刷新几次 Nacos 控制台,可以看到我们的服务已经注册进去了

在这里插入图片描述

在这里插入图片描述

③ 接下来可以新建一个配置文件,测试以下共享配置是否也可以生效

在这里插入图片描述

在这里插入图片描述

④ 这个配置其实已经存到 nacos 数据库里面了,这就是 Nacos 数据的持久化

在这里插入图片描述

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

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

相关文章

el-upload上传文件

需求&#xff1a;选中或拖拽文件后&#xff0c;使用http-request属性实现自动上传&#xff0c;并根据后端传回来的结果显示错误和控制fileList的显示&#xff0c;如果后端返回成功&#xff0c;则文件显示在文件列表处&#xff0c;如果后端返回失败&#xff0c;则文件列表不显示…

Qt/QML编程学习之心得:Timer的使用(22)

Qt中timer计时器如何使用? Timer的创建: void InitTimer(){myTimer = new QTimer(q);myTimer->setInterval(100); // 100msmyTimer->setSingleShot(true); //只运行一次的计时器QObject::connect(myTimer,SIGNAL(timeout()),q,SLOT(onTimeOut()));myTimer->start(…

Oracle分区表

文章目录 A. varchar2类型时间字段(20240102)分区实战1. 表要不要分区2. 将已经存在的表改造为分区表(时间字段&#xff0c;varchar2类型)3. 增加分区3.1 增加分区3.2 置换分区&#xff0c;不会复制索引&#xff0c;不要用这种语法建表&#xff0c;这是专门为置换分区用的3.3 分…

SonarQube 漏洞扫描

SonarQube 漏洞扫描 一、部署服务 1.1 docker方式部署 #安装docker curl -L download.beyourself.org.cn/shell-project/os/get-docker-latest.sh | sh yum install -y docker-compose #进去输入:set paste可以保证不穿行 [rootlocalhost sonar]# vim docker-compose.yml v…

java基于SSM的游戏商城的设计与实现论文

基于SSM的游戏商城的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于游戏信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以…

【C++】内存对齐

本篇文章介绍C中的内存对齐&#xff0c;后续介绍C的union和C的variant的时候&#xff0c;需要用到这部分的知识。 占用内存 先回忆下C各个数据类型占用的内存大小&#xff1a; int&#xff1a;所占内存大小&#xff1a;4byte 32bit&#xff1b;char&#xff1a;所占内存大小…

x-cmd-mod | zuz - 压缩或解压文件

目录 简介首次用户子命令x zuz zx zuz uzx zuz uzrx zuz ls 相关链接 简介 zuz 为 x-cmd 中的必用模块之一&#xff0c;提供压缩与解压文件的功能。 x z 就是调用 x zuz z&#xff0c;可将目标文件压缩根据后缀名成指定格式&#xff0c;x uz 则可以解压任何格式的压缩包 首次…

四个模型建模及数据分析整理(基于Titanic数据集)

目录 介绍&#xff1a; 二、数据 2.1引用数据 2.2检查缺失数据 2.2.1手动检查缺失数据 2.2.2查看某一个特征值为空数据 2.3补充缺失数据 2.3.1盒图 2.3.2手动用均值填补缺失数据 2.3.3手动用类别填补缺失数据 三、数据分析 3.1男女生存比例 3.2男女生存数 3.3船舱级…

ROS学习笔记(11)进一步深入了解ROS第五步

0.前提 我在学习宾夕的ROS公开课的时候发现&#xff0c;外国的对计算机的教育和国内的是完全不一样的&#xff0c;当你接触了外国的课程后回头看自己学的会发现好像自己啥也没学。我这里可以放出来给大家看一下。 1.Python and C 2.Python PDB Tutorial&#xff1a;Python Deb…

PyTorch|构建自己的卷积神经网络

如何搭建网络&#xff0c;这在深度学习中非常重要。简单来讲&#xff0c;我们是要实现一个类&#xff0c;这个类中有属性和方法&#xff0c;能够进行计算。 一般来讲&#xff0c;使用PyTorch创建神经网络需要三步&#xff1a; 继承基类&#xff1a;nn.Module 定义层属性 实现…

动态规划(不同路径1,不同路径2,整数拆分)

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。…

手机上连网络转接app,电脑连接手机,共用网络转接app的办法

方法一&#xff0c;&#xff08;不推荐&#xff09; 因为太简单了所以写一下 电脑安装MuMu模拟器&#xff0c;之后安装网络转接app&#xff0c;这个模拟器设置了从电脑上安装app和&#xff0c;安卓与电脑同步文件夹功能&#xff0c;实现文件共享。所以直接用就可以了。 方法二…

启动 Mac 时显示闪烁的问号

启动 Mac 时显示闪烁的问号 如果启动时在 Mac 屏幕上看到闪烁的问号&#xff0c;这意味着你的 Mac 无法找到自身的系统软件。 如果 Mac 启动时出现闪烁的问号且无法继续启动&#xff0c;请尝试以下步骤。 1.通过按住其电源按钮几秒钟来关闭 Mac。 2.按一下电源按钮&#xf…

你珍藏的那个表情包女孩,现在滤镜碎了一地。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文|猴哥聊娱乐 编辑|侯欢庭 七年前&#xff0c;一个年仅三岁的小女孩以其无邪的表情包风靡网络&#xff0…

FindMy技术用于键盘

键盘是我们生活中不可或缺的输入工具&#xff0c;是人与计算机之间沟通的桥梁&#xff0c;无论是编写文档、浏览网页、玩游戏、或是进行复杂的数据分析&#xff0c;键盘都在其中发挥着关键的作用。此外&#xff0c;键盘还是各种软件的快捷键操作的关键。通过熟练地运用快捷键&a…

大学物理-实验篇——测量误差与数据处理(测量分类、误差、有效数字、逐差法)

目录 测量分类 测量次数角度 测量条件角度 误差 误差分类 系统误差 随机误差 异常值 误差描述 精密度&#xff08;Precision&#xff09; 正确度&#xff08;Trueness&#xff09; 准确度/精确度&#xff08;Accuracy&#xff09; 随机误差的处理 直接测量 算术…

Opencv(C++)学习之cv::calcHist 任意bin数量进行直方图计算

**背景&#xff1a;**当前网上常见的直方图使用方法都是默认使用256的范围&#xff0c;而对于使用特定范围的直方图方法讲的不够清楚。仔细研究后总结如下&#xff1a; 1、常见使用方法&#xff0c;直接对灰度图按256个Bin进行计算。 Mat mHistUn; int channels[1] { 0 }; {…

rollup 原理解析

✨专栏介绍 Rollup专栏是一个专门介绍Rollup打包工具的系列文章。Rollup是一个现代化的JavaScript模块打包工具&#xff0c;它可以将多个模块打包成一个或多个文件&#xff0c;以提高应用程序的性能和加载速度。 在Rollup专栏中&#xff0c;您将学习到如何安装和配置Rollup&a…

Ubuntu18 安装chatglm2-6b

记了下Ubuntu18 上安装chatglm2-6遇到的问题。 环境&#xff1a;Ubuntu18.04 V100(显卡) nvcc 11.6 显卡驱动cudacudnnaniconda chatglm6b 的安装 网上有很多&#xff0c; 不记录 了。 chatglm2-6b 我从别的地方拷贝的&#xff0c; 模型也包含了。 遇到的问题&#xf…

vue简单实现滚动条

背景&#xff1a;产品提了一个需求在一个详情页&#xff0c;一个form表单元素太多了&#xff0c;需要滚动到最下面才能点击提交按钮&#xff0c;很不方便。他的方案是&#xff0c;加一个滚动条&#xff0c;这样可以直接拉到最下面。 优化&#xff1a;1、支持滚动条&#xff0c;…