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

news2024/12/28 18:43:27

文章目录

    • 一、统一配置管理
    • 二、微服务配置拉取
    • 三、配置热更新
    • 四、多环境共享配置
    • 五、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端口与要比主端口多1000
        server 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.coloradmin.cn/o/1352213.html

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

相关文章

虎克:开发小程序要多少钱一个,非专业开发如何做自己的小程序

小程序开发费用主要取决于小程序的功能复杂度和开发周期。一般来说&#xff0c;小程序开发费用可以分为两类&#xff1a;模板开发和定制开发。 模板开发&#xff1a;模板开发是指使用现成的模板进行开发&#xff0c;价格相对较低&#xff0c;一般在几千元左右。优点是价格便宜&…

SpringSecurity-2.7中跨域问题

SpringSecurity-2.7中跨域问题 访问测试 起因 写这篇的起因是会了解到 SSM(CrosOrigin)解决跨域,但是会在加入SpringSecurity配置后,这个跨域解决方案就失效了,而/login这个请求上是无法添加这个注解或者通过配置(WebMvcConfig)去解决跨域,所以只能使用SpringSecurity提供的.c…

【接口自动化】写接口自动化case要注意的点!

可能有人会说&#xff0c;写接口的自动化CASE多简单了&#xff0c;写个参数发送请求完事了&#xff0c;还要注意啥&#xff1f; 没错&#xff0c;相比起UI自动化的case&#xff0c;你要去写各种定位器&#xff0c;接口自动化的case写起来确实容易多了。这也是接口自动化的一个…

APM32 移植 RTX5

打开APM32的 一个官方例子或者模板工程, MKD格式 更改工程属性,将编译器换为V6: 然后勾选 Use MicroLIB; 接着: 接着: 接着确认 然后编译,会报260个错误: 然后 打开工程树中 下面的文件: 如果用的是M4内核,添加下面的定义:

2SK3019 中低压MOSFET 60V 100mA 双N通道 SOT-723封装

2SK3019小电流双N通道MOSFET&#xff0c;电压60V电流100mA&#xff0c;采用SOT-723封装形式。适用于低RDS (on)的高密度电池设计&#xff0c;压控小信号开关&#xff0c;坚固可靠&#xff0c;ESD保护。可应用便携式设备的负载开关&#xff0c;电池开关上。

探索 CodeWave低代码技术的魅力与应用

目录 前言1 低代码平台2 CodeWave简介3 CodeWave 的独特之处3.1 高保真还原交互视觉需求3.2 擅长复杂应用开发3.3 支持应用导出&独立部署3.4 金融级安全要求3.5 可集成性高3.6 可拓展性强 4 平台架构和核心功能4.1 数据模型设计4.2 页面设计4.3 逻辑设计4.4 流程设计4.5 接…

【STM32F103】TIM定时器PWM

定时器分类 STM32F1中除了互联型产品&#xff08;STM32F103C8T6为64KB Flash 中容量产品&#xff09;&#xff0c;其余有8个定时器。 可以8个定时器分为高级&#xff0c;通用&#xff0c;基本三种。 高级定时器有两个&#xff0c;分别是TIM1和TIM8。 通用定时器有四个&…

SD-WAN:提升连锁零售企业异地组网稳定性

连锁零售企业往往拥有众多分布在不同地区的分支机构和零售店&#xff0c;为保证企业高效运转&#xff0c;各地区之间的网络连接必须稳定可靠。但基于各地网络基础设施的不同和网络延迟、带宽等限制&#xff0c;异地组网往往并不稳定。在这背景下&#xff0c;SD-WAN成为连锁零售…

频谱论文:空间频率插值的无线电地图 Space-Frequency-Interpolated Radio Map

#频谱# K. Sato, K. Suto, K. Inage, K. Adachi and T. Fujii, "Space-Frequency-Interpolated Radio Map," in IEEE Transactions on Vehicular Technology, vol. 70, no. 1, pp. 714-725, Jan. 2021, doi: 10.1109/TVT.2021.3049894. 东京理科大学&#xff0…

MBP的新拉力=800MT+凯越525+泛美?

MBP国内新兴品牌&#xff0c;可能部分车友了解&#xff0c;之前专门做欧洲市场的&#xff0c;米兰车展的时候它带来一款比较有意思的车型&#xff0c;型号:T502X&#xff0c;这个502和贝纳利的502关系不大。 据了解&#xff0c;车辆是由高金代工生产的&#xff0c;发动机就是高…

闲置树莓派(linux单片机)做NAS的最简单方案

闲置的树莓派其实可以做nas服务器使用。树莓派单片机5V2A&#xff0c;功耗大概10W。外置移动硬盘盒子12V2A 功耗大概24W。全加起来&#xff0c;功耗一小时30W&#xff0c;一天3角左右的运行成本&#xff0c;速率也可以&#xff0c;非常划算。&#xff08;其他任何Linux单片机原…

2024年个人工作计划怎么写?新年待办计划这样写更方便

元旦的钟声还在耳边回响&#xff0c;2024年的新篇章已经开启。面对新的一年&#xff0c;我深知一个清晰、实用的个人工作计划是多么重要。它不仅是指引我前进的灯塔&#xff0c;更是我实现目标、提升效率的秘密武器。 但如何制定这样一个计划呢&#xff1f;在过去&#xff0c;…

边框渐变色+圆角

这两个同时写&#xff0c;圆角不会生效 li {width: 282px;height: 96px;margin-right: 20px;box-sizing: border-box;border: 1px solid transparent;background-image: linear-gradient(#fff, #fff),linear-gradient(to right, #8efd9f, #07cbfb);background-origin: border-b…

【C语言】作用域 和 生命周期

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

Sectigo企业的通配符证书续费

首先&#xff0c;我们要知道SSL证书是有期限的&#xff0c;通常SSL证书的有效期为一年&#xff0c;在SSL证书到期之前我们需要对其进行续费&#xff0c;从而延续SSL证书对网站的保护。Sectigo是中多的CA认证机构之一&#xff0c;申请速度快、性价比高&#xff0c;很多子域名站点…

如何用python新建一个文件,python怎么新建一个文件

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;如何通过python新建一个文件中的文件&#xff0c;如何通过python新建一个文件夹并命名&#xff0c;现在让我们一起来看看吧&#xff01; 文章目录 前言 1. 使用内置的open函数2. 使用with关键字3. 使用os模块总结零基础…

值得推荐的 5 个前端性能测试工具

前言 PageSpeed Insights 谷歌开发的一个免费的网页分析工具&#xff0c;在地址栏中输入被分析的网站url地址&#xff0c;点击分析&#xff0c; 可模拟移动设备访问页面结果分析 桌面设备访问页面结果分析 前端开发工程师&#xff0c;可以根据这个报告进行页面优化 Lighthous…

HTML语义化的理解

HTML语义化是指在编写HTML代码时&#xff0c;合理地选择适当的标签和属性来描述页面的结构和内容&#xff0c;使得代码更具有可读性、可维护性和可访问性。 可读性&#xff1a;通过使用语义化的标签&#xff0c;可以清晰地表达页面的结构和内容&#xff0c;使得代码更易于阅读和…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop的任务队列中添加新任务

任务队列是一个链表&#xff0c;每个节点包含channel类型、文件描述符和操作类型。在添加节点时&#xff0c;需要考虑线程同步&#xff0c;并确保节点被正确地添加到链表中。节点的操作可以写到另一个函数中&#xff0c;以便于程序的维护。在添加任务节点时&#xff0c;需要加互…

快速打通 Vue 3(三):Vue3 中的 watch 监听器与新特性

很激动进入了 Vue 3 的学习&#xff0c;作为一个已经上线了三年多的框架&#xff0c;很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue&#xff08;一&#xff09;&#xff1a;Vue 入…