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

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 数据的持久化

在这里插入图片描述

相关文章:

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

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务&#xff0c;管理起来非常简单&#xff0c;但…...

win10下vscode+cmake编译C代码操作详解

0 工具准备 1.Visual Studio Code 1.85.1 2.cmake 3.24.01 前言 当我们只有一个.c文件时直接使用vscodeCode Runner插件即可完成编译&#xff0c;如果我们的工程很复杂包含多个.c文件时建议使用cmake来生成对应的make&#xff0c;指导编译器完成编译&#xff0c;否则会提示各…...

网络安全红队常用的攻击方法及路径

一、信息收集 收集的内容包括目标系统的组织架构、IT资产、敏感信息泄露、供应商信息等各个方面&#xff0c;通过对收集的信息进行梳理&#xff0c;定位到安全薄弱点&#xff0c;从而实施下一步的攻击行为。 域名收集 1.备案查询 天眼查爱企查官方ICP备案查询 通过以上三个…...

【基于openGauss2.1.0企业版安装X-Tuner参数调优工具】

【基于openGauss2.1.0企业版安装X-Tuner参数调优工具】 一、前提条件二、安装X-Tuner 2.1.0: 一、前提条件 已安装了openGauss2.1.0企业版 二、安装X-Tuner 2.1.0: 以root用户登录到服务器 安装以下依赖&#xff1a; yum -y groupinstall "Development tools" yum…...

SpringBoot+Vue轻松实现考试管理系统

简介 本系统基于 Spring Boot 搭建的方便易用、高颜值的教学管理平台&#xff0c;提供多租户、权限管理、考试、练习、在线学习等功能。主要功能为在线考试、练习、刷题&#xff0c;在线学习。课程内容支持图文、视频&#xff0c;考试类型支持考试、练习、问卷。 源码下载 网…...

详解Keras:keras.preprocessing.image

keras.preprocessing.image Keras 库中的一个模块&#xff0c;用于处理和增强图像数据&#xff0c;它提供了一些实用的函数&#xff0c;如图像的加载、预处理、增强等。 常用函数 1、load_img 用于加载图像文件&#xff0c;并返回一个 NumPy 数组表示该图像 示例 from ker…...

来瞅瞅Java 11都有啥新特性

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff01;今天小黑要和咱们聊聊Java 11&#xff0c;这个在Java发展史上占有一席之地的版本。说起Java&#xff0c;咱们都知道&#xff0c;它是一门历史悠久又持续发展的编程语言。Java不仅因其“一次编写&#xff0c;到处…...

Copilot在IDEA中的应用:提升编码效率的得力助手

Copilot在IDEA中的应用&#xff1a;提升编码效率的得力助手 前言: 欢迎来到本篇博客&#xff0c;今天我们将深入探讨 GitHub Copilot 在 IntelliJ IDEA 中的应用。GitHub Copilot 是一款由 GitHub 与 OpenAI 共同开发的人工智能代码生成工具&#xff0c;它能够根据上下文提示…...

【Python】Excel不同sheet另存为不同CSV

我有一个excel&#xff0c;内有不同sheet&#xff0c;现在批量生成不通csv文件&#xff0c;并以sheet名命名&#xff0c;或根据sheet名调整命名。 # 读取新的Excel文件 df pd.read_excel(rD:\itm\data.xlsx, sheet_nameNone)# 遍历每个sheet&#xff0c;将其另存为不同的CSV文…...

软件测试|深入学习 Docker Logs

简介 Docker 是一种流行的容器化技术&#xff0c;它能够帮助用户将应用程序及其依赖项打包成一个可移植的容器。Docker logs 是 Docker 提供的用于管理容器日志的命令&#xff0c;本文将深入学习 Docker logs 的使用和管理&#xff0c;帮助用户更好地监测和解决容器问题。 Do…...

试除法求约数算法总结

知识概览 试除法求一个数的约数的时间复杂度是。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/871/ 题解 用试除法求约数&#xff0c;…...

[JavaWeb玩耍日记] 数据库

mysql版本&#xff1a;5.7.24 使用Navicat for MySQL辅助学习(2015年版)&#xff0c;这个在粘贴本博客的块引用内容时会有额外的不可见内容导致sql运行出问题&#xff0c;不过有影响的地方笔者已排除 目录 一.数据库创建 二.使用数据库与创建表 三.表内列的数据类型 四.修…...

rime中州韵小狼毫 inputShow lua Translator 输入字符透传翻译器

在 rime中州韵小狼毫 help lua Translator 中我们分享了如何使用 lua 脚本定义一个 translator&#xff0c;并以 五笔・拼音 为例引用了该 translator&#xff0c;并且达到了预期的效果。 今天&#xff0c;我们继续通过 lua 脚本为 rime中州韵/小狼毫 输入法打造一个 translat…...

【RockChip | RV1126】学习与开发

【RockChip | RV1126】学习与开发 文章目录 【RockChip | RV1126】学习与开发1. 资料1. 资料 您好,这是关于A191型RV1126的资料包,请您及时接收哦~链接: https://pan.baidu.com/s/1FXWVxa27Q78nI78d2QKlBQ?pwd=j7mk 提取码: j7mk 若您在开发过程中遇到技术问题,需要帮助时:…...

copilot在pycharm的应用

Copilot在PyCharm中的应用 一、引言 随着人工智能技术的飞速发展&#xff0c;AI在编程领域的应用也越来越广泛。Copilot&#xff0c;作为一款由微软开发的AI编程助手&#xff0c;已经引起了广大开发者的关注。它利用深度学习技术&#xff0c;通过分析大量开源代码&#xff0c…...

HDU 2841:Visible Trees ← 容斥原理

【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid2841【题目描述】 There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is standing at (0,0) point. He wonders how many trees he can see. If two trees and Sherlock are in…...

分布式数据之复制(Replication)

1.简介 1.1简介——使用复制的目的 在分布式系统中&#xff0c;数据通常需要被分散在多台机器上&#xff0c;主要为了达到以下目的&#xff1a; 扩展性&#xff0c;数据量因读写负载巨大&#xff0c;一台机器无法承载&#xff0c;数据分散在多台机器 上可以有效地进行负载均衡…...

【多线程】

文章目录 一、线程与进程的概念&#xff1a;二、多线程实现三、线程锁四、线程数量的设置 一、线程与进程的概念&#xff1a; 简单理解 假设总共有3个孩子需要喂饭&#xff0c;孩子每吃一口饭需要咀嚼消化一下。 多线程方案&#xff1a; 雇佣1个保姆&#xff0c;在喂A孩子吃饭…...

基于Vue开发的一个仿京东电商购物平台系统(附源码下载)

电商购物平台项目 项目完整源码下载 基于Vue开发的一个仿京东电商购物平台系统 Build Setup # csdn下载该项目源码压缩包 解压重命名为sangpinghui_project# 进入项目目录 cd sangpinghui_project# 安装依赖 npm install# 建议不要直接使用 cnpm 安装以来&#xff0c;会有各…...

Nginx多ip部署多站点

目录 1.修改网卡配置信息 2.修改主要配置文件nginx.conf 1.修改网卡配置信息 1)来到网卡配置文件存放目录下 cd /etc/sysconfig/network-scripts/ 2)对 ifcfg-ens33 文件进行配置修改前先进行备份 cp ifcfg-ens33 ifcfg-ens33.default 3)先修改成最小配置&#xff0c;使用 d…...

VMware Workstation 16开机自启踩坑实录:从环境变量报错到bat脚本优化,一篇搞定

VMware Workstation 16开机自启全攻略&#xff1a;从环境变量到脚本优化的深度实践 每次重启服务器后手动打开虚拟机实在是个体力活。上周我负责维护的测试环境又因为忘记启动虚拟机导致整个团队阻塞了半天&#xff0c;这种低级错误让我决定彻底解决VMware Workstation的开机自…...

Java整型溢出:越界运算后结果如何

Java整形溢出详细说明:越界操作后的结果和类型在Java程序中&#xff0c;理解数据类型的值范围非常重要。本文将深入探讨越界操作后int类型的行为&#xff0c;并解释int类型的值范围和越界操作结果。Javaint类型的值范围为-2、147、483、648至2、147、483、647。当计算结果超出此…...

超级电容matlab simulink储能模型仿真,能量管理 蓄电池充放电模型,电池-超级电容混合储能系统能量管理

超级电容matlab simulink储能模型仿真&#xff0c;能量管理 蓄电池充放电模型&#xff0c;电池-超级电容混合储能系统能量管理这是一个关于超级电容-蓄电池混合储能系统&#xff08;HESS&#xff09;能量管理策略的完整MATLAB/Simulink仿真方案。 一、系统架构与仿真模型 混合储…...

Graph Node高级配置:环境变量与配置文件详解

Graph Node高级配置&#xff1a;环境变量与配置文件详解 【免费下载链接】graph-node Graph Node indexes data from blockchains such as Ethereum and serves it over GraphQL 项目地址: https://gitcode.com/gh_mirrors/gr/graph-node Graph Node 作为区块链数据索引…...

告别重装!用Timeshift给你的Ubuntu系统做个‘时光机’,轻松备份与整盘迁移

用Timeshift打造Ubuntu系统的时光回溯神器&#xff1a;零门槛备份与迁移指南 每次系统崩溃后重装Ubuntu的痛苦&#xff0c;相信不少用户都深有体会——那些精心配置的开发环境、收藏多年的工作文档、调试许久的个性化设置&#xff0c;都可能在一瞬间化为乌有。对于习惯图形化操…...

保姆级教程:用Qt的QNetworkAccessManager实现网络延迟与带宽的简易测试工具(附完整源码)

从零构建Qt网络性能测试工具&#xff1a;延迟与带宽测量的实战指南 在开发网络应用时&#xff0c;我们常常需要了解当前网络环境对应用性能的影响。无论是评估服务器响应速度&#xff0c;还是测试用户在不同网络条件下的体验&#xff0c;一个轻量级的网络测试工具都能派上大用场…...

手把手教你搭建基于Matlab/Simulink的插电式混合动力汽车4驱PHEV模型

基于Matlab/simulink的插电式混合动力汽车建模仿真模型4驱PHEV&#xff08;比亚迪唐DM混动系统P2P4发动机——三擎四驱&#xff09;&#xff0c;包括整车HCU控制单元、发动机模型、驱动电机模型、ISG电机模型、AMT5档自动变速箱模型、驾驶员模型、电池能量管理控制模型等&#…...

树莓派无头模式终极指南:不接显示器,用SSH+VNC搞定所有开发调试

树莓派无头模式终极指南&#xff1a;不接显示器&#xff0c;用SSHVNC搞定所有开发调试 当你把树莓派塞进机器人底盘、挂在墙上作为智能家居中枢&#xff0c;或是藏在机柜里充当服务器时&#xff0c;最不想看到的就是拖着一堆显示器和线材。作为嵌入式开发老手&#xff0c;我经历…...

Agent-S实战指南:突破性智能体框架如何实现72.6%人类级计算机交互性能

Agent-S实战指南&#xff1a;突破性智能体框架如何实现72.6%人类级计算机交互性能 【免费下载链接】Agent-S Agent S: an open agentic framework that uses computers like a human 项目地址: https://gitcode.com/GitHub_Trending/ag/Agent-S 在人工智能与计算机交互的…...

基于STM32F103C8与CAN总线的步科步进电机PDO映射实战解析

1. STM32F103C8与步科步进电机的基础连接 第一次接触CAN总线控制步进电机时&#xff0c;最让我头疼的就是硬件连接部分。STM32F103C8的CAN接口引脚是固定的PA11(CAN_RX)和PA12(CAN_TX)&#xff0c;而步科驱动器的CAN接口通常标注为CANH和CANL。这里有个容易踩坑的地方&#xff…...