Nacos新手详细知识大全

news2024/10/7 16:25:29
官网: Spring Cloud Alibaba

一、Nacos快速入门

1.1 服务注册到Nacos

1.1.1 配置

**引入com.alibaba.cloud,**以后的版本就不用操心了

<!-- com.alibaba.cloud-->
            <!-- com.alibaba.cloud-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

nacos的管理依赖

<!--nacos的管理依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

注释掉order-service和user-service中原有的eureka依赖

添加nacos客户端依赖

在user-service及order-service中添加

服务注册发现的客户端依赖,一个启动器starter

<!-- nacos客户端依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址

spring:
  application:
    name: orderservice
  cloud:
    nacos:
    #nacos服务端地址,默认就是8848
    server-addr: localhost:8848

启动

我们点击服务对应的“详情”,可以准确的看到IP和端口号

二、服务多级存储模型

2.1 服务多级存储模型

多级:

  • 一级服务(userservice)

  • 二级集群(HZ或SH)

  • 三级实例(例如杭州机房的某台部署了user vice的服务器)

假如我们将服务的实例都部署到一个机房,若出现意外,那我们的服务将会挂掉

我们会将一个服务的多个实例部署到多个机房,这样某个机房挂掉之后还能继续使用,如此做法叫做容灾

而我们nacos服务分级存储模型就引入了这样一个机房的概念,把同在一个机房的多个实例称为一个集群

服务调用尽可能选择本地集群服务,跨集群调用延迟较高

本地集群不可访问,再去访问其它集群

nacos引入集群这个概念,就是为了防止出现跨集群调用

我们可以看一下我们刚刚发布的“orderservice”是一个什么集群

由下图可看出是一个DEFAULT集群,默认集群也就是没有集群

2.2 配置实例集群属性

**修改application.yml,添加如下内容,**比之前多了discovery

spring:
  applicaiton: 
    name: userservice  
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos 服务端地址
      discovery:
        cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州

启动两个userservice,那这两个userservice就是杭州集群了

那如果我想将同样的服务在再配置到上海集群呢?

复制一个user-service服务,将cluster-name修改为cluster-name: SH,然后进行启动

注意!!!这个时候不要再启动UserApplication和UserApplication2,否则将两个服务一会去SH集群

如下图所示,HZ集群,SH集群

三、NacosRule负载均衡

3.1 初了解

我们要达到的效果:order-service远程调用user-service的时候优先调用本地集群

我们还要给order-service配置一个集群属性,相当于将order-service加入到杭州集群,我们要看一看是否会先调用本地集群

此时order-service与8081、8082在相同的集群

spring:
  application:
    name: orderservice
  cloud:
  	nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ #集群名称

当我们多次访问之后,发现8081、8082、8083都会被访问,并没有优先选择同集群的8081、8082。依旧是轮询

3.2 修改负载均衡规则

在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务

#要做配置的微服务名称
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

我们在order-service配置文件中修改之后再访问,发现8081,8082会有响应,而8083没有响应

假如我们把8081,8082都停掉(本地集群已经没有服务了)只留下在上海的8083,此时再发请求,依然会有响应, 原因是8083接收的请求并处理的

3.3 NacosRule负载均衡策略

  • 优先选择同集群服务实例列表

  • 本地集群找不到提供者,才去其他集群寻找,并且会报警告

  • 确定了可用实例列表后,再采用随即负载均衡挑选实例

四、服务实例的权重设置

场景:

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求

Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高权重设置为0则完全不会被访问

作用:

我们将8081,8082,8083其中的某一个停掉,用户也不会有感知。我们可以将停掉的进行版本升级,升级完成之后再进行重启(重启的时候权重不会调的很高),让少数的用户访问,以此来做测试,如果没什么问题就可以扩大权重,顺滑升级,不用半夜加班处理

4.1 修改权重

权重值为0~1,权重越大则访问频率越高,权重设置为0则完全不会被访问

我在这里修改权重的时候出现了一个错误:
caused: errCode: 500, errMsg: do metadata operation failed ;caused: com.alibaba.nacos.consistency.exception.ConsistencyException: The Raft Group [naming_instance_metadata] did not find the Leader node;caused: The Raft Group [naming_instance_metadata] did not find the Leader node;
经过查找, https://www.cnblogs.com/whl-jx911/p/16736625.html这篇文章可以充分的结局上面的问题
找到nacos根目录下的data文件,删除里面的protocol文件夹
原因:Nacos 采用 raft 算法来计算 Leader,并且会记录上次启动的集群地址,所以当我们自己的服务器 IP 改变时(网络环境不稳定,如WIFI, IP 地址也经常变化),导致 raft 记录的集群地址失效,导致选 Leader 出现问题。
原因:有小伙伴,部署的nacos包,是本机运行过的,直接扔到服务器了(带着data目录),所以ip 与服务器ip不一致,导致了以上问题。

成功后如下图所示:此时8082被访问到的概率就是8081的十分之一

五、namespace命名空间环境隔离

nacos不仅是一个注册中心,也是一个数据中心

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离(对服务做隔离)

将来不同命名空间的服务是不能互相访问的

同个命名空间中的多个东西还可以分组Group

5.1 创建命名空间

下面是圈起来的地方是命名空间的ID

5.2 修改application.yaml添加namespace

修改order-service的application.yml,添加namespace:

spring:
  application:
    name: orderservice
      cloud:
        nacos:
          server-addr: localhost:8848
          discovery:
            cluster-name: HZ #集群名称
            namespace: 1ebcface-cc3a-4e77-96d8-2f3f0500c317 #命名空间   dev环境

命名空间ID可以从下面进行复制

5.3 环境隔离的效果

配置完成之后重启order-service,目前只有order-service在dev环境,其他都没有修改

我们看到下图中public命名空间中已经没有了orderservice服务了

但是我们查看dev服务,发现里面有orderservice服务

如果此时我们再用8080向其他三个userservice发起请求,则会报错

不同环境空间下的服务不能互相访问

不同环境空间下的服务不能互相访问

5.4 总结

  • 每个namespace都有唯一id

  • 服务设置namespace时要写id而不是名称

  • 不同namespace下的服务互相不可见,访问不到的

六、Nacos和Eureka对比

6.1 相同部分

对于Nacos,

我们的服务提供者在启动时,都会把自己的信息提交给注册中心,而注册中心就会把这些信息保留下来

对于服务的消费者就可以找注册中心要这个服务信息,成为服务拉取或服务发现。服务消费者并不是每次发起请求都会去注册中心拉取。而是在拉取时将拉取到的服务信息缓存到列表中,接下来的一段时间就都可以不用拉取,而是直接使用列表中的缓存即可(这个列表会每隔30秒重新拉取并缓存)

消费者拿到服务列表之后,再经过负载均衡挑选一个发起远程调用

以上Nacos和Eureka是相同的

6.2 服务提供者不同的部分

它们两者的差别在于服务提供者的健康检测,nacos会把我们的服务提供者划分为临时实例和非临时实例、、

默认情况下所有的实例都是临时实例,临时实例和非临时实例在做健康检测的时候时不一样的

**临时实例:**临时的,将来我们可以人为的将他停掉所以在nacos做检查的时候采用的时心跳检测(与Eureka的心跳检测完全一致,每隔一段时间发一个请求到nacos,有一天不跳了,nacos就会将他从服务列表中剔除)

**非临时实例:**不会要求心跳检测,是由nacos主动发请求询问,并且nacos不会把非临时实例从列表中剔除,仅仅标记为不健康并且等着他恢复健康

6 3 服务消费者不同的部分

服务消费者也与Eureka有所差别

如果服务提供者在定时拉取服务之前已经挂掉了,那服务消费者在这一段时间内没有更新服务列表缓存(更新不够及时),岂不是一直调用的挂掉的服务?

答案并不是这个样子的

Eureka采用的时pull,Nacos采用的时pull+push

nacos做了一个消息推送,当nacos发现有服务挂掉,会立即发消息推送给服务消费者,服务消费者会迅速更新

6.4 图示

6.5 设置临时实例和非临时实例

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

6.6 总结

6.6.1 相同

  • 都支持服务注册和服务拉取

  • 都支持服务提供者心跳方式做健康检测

6.6.2 不同

  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式(推荐使用临时实例)

  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除

  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

七、配置管理

**实现配置热更新:**一般我们更改配置文件后需要再启动工程才能得以使用,但是一般工程启动时间较长,这样做的话效率很低(还有就是一个配置文件的内容好几个微服务都相同),如今我们可以利用Nacos实现配置统一管理,这些配置就会立马能够生效

配置管理服务: 会记录微服务中一些核心的配置放到上面去,微服务启动的时候就会读取配置管理服务上的配置,再与本地的配置结合,就可以完整的使用。我们之后修改配置就直接再配置管理中修改,配置管理发现配置改动后会立刻通知响应的微服务,微服务可以实现配置热更新并不需要重启服务

配置管理与注册中心都是由Nacos实现的

7.1 新建配置

创建的时候DataID要唯一,不能冲突,为了保证不冲突,我们可以用微服务名(微服务名不冲突)

DataId一般格式: 微服务名称-profile.yaml

profile指的是当前项目的运行环境,如dev,test,prod,根据自己的需求定即可

Group:分组,确定这个配置在哪个组里面

配置格式:一般选择YAML

配置内容:不需要把所有的配置都复制到这里来,我们只需要一些开关类型的数据、模板类的数据,简单的来说就是需要热更新配置的

如下图所示,创建配置成功,也完成了配置统一管理

7.2 微服务拉取配置

我们的项目会把nacos配置文件中的配置与本地配置做一个合并,再去做后面的动作

所以我们要先读取nacos配置文件,那怎么先读取nacos配置文件呢?

创建bootstrap.yml配置文件,优先级比application.yml配置文件高,会优先读取

7.2.1 Nacos的配置管理客户端依赖

优先级比application.yml配置文件高,会优先读取

nacos-config表示管理配置 如果是nacos-discovery则表示服务发现

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

7.2.2 resource目录下添加bootstrap.yml文件

在user-service工程的resource目录下添加bootstrap.yml

name、active、file-extension决定了我们的DataID

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

7.2.3 读取配置

//  从nacos远程获取配置
    @Value("${pattern.dateformat}")
    private String dateformat;

    @GetMapping("/now")
    public String now() {
//      LocalDateTime工具类
//      LocalDateTime.now()获取当前时间
//      format(DateTimeFormatter.ofPattern(dateformat)格式化
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }

7.3 总结

将配置交给Nacos管理的步骤

  • 在Nacos中添加配置文件

  • 在微服务中引入nacos的config依赖

  • 在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件

八、实现配置热更新

配置热更新就是我们的最终目标

8.1 方式一:注解@RefreshScope

在@Value注入的变量所在类上添加注解@RefreshScope

@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
}

我们先更改一下配置

将新的配置发布之后,我们不用重启微服务就可以读取到上面的新配置并且控制台还会有提示

8.2 方式二:@ConfigurationProperties注解

推荐使用@ConfigurationProperties注解,完成配置自动加载

新建一个类专门完成属性的加载

@Data
@Component   //注册成一个bean
//prefix 前缀   只要前缀名和属性名拼接(即pattern.dateformat)能和nacos配置管理中的配置(pattern.dateformat)对应即可
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
//  希望dateformat属性和配置文件一致
    private String dateformat;
}
    @Autowired
    private PatternProperties properties;

    @GetMapping("/now")
    public String now() {
//      LocalDateTime工具类
//      LocalDateTime.now()获取当前时间
//      format(DateTimeFormatter.ofPattern(dateformat)格式化
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
    }

8.3 总结

Nacos配置更改后,微服务可以实现热更新,方式:

  • 通过@Value注解注入,结合@RefreshScope来刷新

  • 通过@ConfigurationProperties注入,自动刷新

注意事项:

  • 不是所有的配置都适合放到配置中心,维护起来比较麻烦

  • 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

九、多环境配置共享

某一个配置属性,在开发、生产、测试等环境下的值时一样的,如果在每个配置文件中都写一份,就会有些浪费,而且改的时候都要改

为了针对这种情况,我们希望配置一次之后,不管环境怎么改变,这个配置都能够被加载,这就是多环境共享的一个需求了。

微服务启动时会从nacos读取多个配置文件:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml

  • [spring.application.name].yaml,例如:userservice.yaml,服务名直接跟上后缀,把环境省略掉,和环境并没有关系

对于第二种,无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件

9.1创建多环境配置

9.2 修改共享配置文件的属性

比之前多了envSharedValue

@Data
@Component   //注册成一个bean
//prefix 前缀   只要前缀名和属性名拼接(即pattern.dateformat)能和nacos配置管理中的配置(pattern.dateformat)对应即可
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
//  希望dateformat属性和配置文件一致
    private String dateformat;

//  再读一个环境共享属性
    private String envSharedValue;

}
    @GetMapping("prop")
    public PatternProperties properties(){
//       直接将这个返回,那页面就能看到这个类中的所有东西了
         return  properties;
    }

配置完成后重启userapplication,并且其在dev环境

此时userservice(8081)工程能读到dev环境下的配置(userservice-dev.yaml),也能读取到共享配置文件的内容(userservice.yaml)

为了做对比,我们再启动一个userservice服务(8082),并且设置成test环境

也可以采用下面这个方式,推荐,因为上面那个方式修改之后还要改回来

9.3 验证结果

我们发现8081端口都可以读取到

而8082端口只能读取到环境共享属性值

dev环境8081,test环境8082都能拿到userservice.yaml文件的配置,证明此文件是被不同环境共享的

9.4 配置文件优先级问题

[服务名]-[环境].yaml >[服务名].yaml > 本地配置

本地配置的优先级最低,nacos中环境配置最高

9.5 多服务共享配置

不同微服务之间可以共享配置文件,通过下面的两种方式来指定:

9.5.1 方式1

spring:
  application:
    name: userservice # 服务名称
   profiles:
     active: dev # 环境,
   cloud:
     nacos:      
       server-addr: localhost:8848 # Nacos地址      
       config:         
         file-extension: yaml # 文件后缀名        
         shared-configs: # 多微服务间共享的配置列表          
           - dataId: common.yaml # 要共享的配置文件id

9.5.2 方式2

spring:
  application:
    name: userservice # 服务名称
   profiles:
     active: dev # 环境,
   cloud:
     nacos:      
       server-addr: localhost:8848 # Nacos地址      
       config:         
         file-extension: yaml # 文件后缀名        
         extends-configs: # 多微服务间共享的配置列表
            - dataId: extend.yaml # 要共享的配置文件id

十、Nacos集群搭建

10.1 集群结构图

官方给出的Nacos集群图:

SLB:负载均衡器,将请求分发到不同的Nacos节点,就形成一个集群结构了

三台Nacos节点要实现数据的共享(整个MySQL集群,让多个nacos都去访问集群完成数据的读写)

10.2 搭建集群

三个nacos节点的地址:

节点

ip

port

nacos1

192.168.150.1

8845

nacos2

192.168.150.1

8846

nacos3

192.168.150.1

8847

搭建集群的基本步骤:

  • 搭建数据库,初始化数据库表结构

  • 下载nacos安装包

  • 配置nacos

  • 启动nacos集群

  • nginx反向代理

10.2.1 初始化数据库

Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。

官方推荐的最佳实践是使用带有主从的高可用数据库集群,主从模式的高可用数据库可以参考传智教育的后续高手课程。

这里我们以单点的数据库为例来讲解。

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

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,
  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 '租户字段',
  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(64) 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 '租户字段',
  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');

10.2.2 配置Nacos

我们三个Nacos就要有三次配置

目录说明:

  • bin:启动脚本

  • conf:配置文件

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

添加内容,其实配置集群中每一个节点的信息

127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847

然后修改application.properties文件

将下面两个注释打开,db.num代表着数据库的数量

找到数据库的配置并更改成下面的数据库配置(根据实际情况进行修改)

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

10.2.3 启动

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

然后分别修改三个文件夹中的application.properties,

nacos1:

server.port=8845

nacos2:

server.port=8846

nacos3:

server.port=8847

然后分别启动三个nacos节点:

startup.cmd

10.2.4 nginx反向代理

将nginx下载并解压

修改conf/nginx.conf文件,配置如下:

upstream nacos-cluster {
    server 127.0.0.1:8845;
	server 127.0.0.1:8846;
	server 127.0.0.1:8847;
}

server {
    listen       80;
    server_name  localhost;

    location /nacos {
        proxy_pass http://nacos-cluster;
    }
}

而后在浏览器访问:http://localhost/nacos即可。

代码中application.yml文件配置如下:

spring:
  cloud:
    nacos:
      server-addr: localhost:80 # Nacos地址

此时下面的nacos地址也变成了80,而不是之前的8848

10.2.5 优化

  • 实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置.

  • Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离

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

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

相关文章

SpringCloud之 LoadBalancer负载均衡

文章目录LoadBalancer 负载均衡一、LoadBalanced 负载均衡二、自定义负载均衡三、OpenFeign 实现负载均衡①添加依赖②启动类添加 EnableFeignClients③创建客户端接口 UserClient④service业务中调用客户端接口提示&#xff1a;以下是本篇文章正文内容&#xff0c;SpringCloud…

pv和pvc

一、PV和PVC详解当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就…

【Python】torch.einsum()解析

【Python】torch.einsum()解析 文章目录【Python】torch.einsum()解析1. 介绍2. 示例2.1 Pytorch矩阵乘法2.2 Numpy高阶张量3. 参考1. 介绍 爱因斯坦简记法&#xff1a;是一种由爱因斯坦提出的&#xff0c;对向量、矩阵、张量的求和运算 ∑\sum∑ 的求和简记法。在该简记法当中…

链表面试题

链表面试题1. 删除链表中等于给定值 val 的所有结点。2. 反转一个单链表。3. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。4. 输入一个链表&#xff0c;输出该链表中倒数第k个结点。5. 将两个有…

延时任务的四种实现方式

什么是延迟任务&#xff1f;顾明思议&#xff0c;我们把需要延迟执行的任务叫做延迟任务。延迟任务的使用场景有以下这些&#xff1a;红包 24 小时未被查收&#xff0c;需要延迟执退还业务&#xff1b;每个月账单日&#xff0c;需要给用户发送当月的对账单&#xff1b;订单下单…

计算机网络之MAC和IP地址

MAC地址 在局域网中&#xff0c;硬件地址&#xff0c;又称为物理地址或MAC地址。 目前现在的局域网中实际上使用的都是6字节的MAC地址&#xff0c;所以每一个以太网设备都具有唯一的MAC地址。 MAC地址的格式 假设传输使用的是IP数据&#xff0c;V2的MAC帧较为简单&#xff…

Sonar:VSCode配置SonarLint/SonarLint连接SonarQube

需求描述 公司为项目代码配置了Sonar检测&#xff0c;希望在VSCode中开发项目时能够同步检测结果。 注意事项 SonarQube版本必须为7.9&#xff0c;否则SonarLint无法连接&#xff08;GitHub-SonarLint-Wiki第一行就有说明&#xff09;&#xff01;&#xff01;&#xff01;S…

【前端】一个更底层库-React基础知识点第2篇

目录属性状态PROPSPROP VALIDATIONSTATEFORMCONTROLLED COMPONENTSMIXINCOMPONENT APICOMPONENT LIFECYCLETOP API上一篇文章也是React基础知识点&#xff0c;了解到了React是什么&#xff1f;为什么要使用React&#xff1f;还知道了JSX概述&#xff0c;JSX嵌入变量&#xff0c…

python Django中的cookies和session会话保持技术

cookies和session都是为了保持会话状态而诞生的两个存储技术会话定义&#xff1a; 从打开浏览器访问一个网站&#xff0c;到关闭浏览器结束此次访问&#xff0c;称之为一次会话HTTP协议是无状态的&#xff0c;导致会话状态难以保持Cookies-定义 cookies是保存在客户端浏览器上的…

超简单的卷积和加法融合

神经网络的优化除了之前提到的一些硬件优化手段(AI硬件加速拾遗)之外&#xff0c;还有很多图层方面的优化手段。大家好啊&#xff0c;我是董董灿。 而且图层方面的优化&#xff0c;有时效果更佳。往往一个有效的优化&#xff0c;甚至可以“消除”掉一个算子的存在。 这里的“…

Vue组件-$refs、$nextTick和name属性的使用

Vue组件-$refs和$nextTick使用一、获取DOM二、$refs获取组件对象三、$nextTick异步更新DOM四、组件name属性的使用一、获取DOM 通过id或ref属性获取原生DOM 在mounted生命周期 – 2种方式获取原生DOM标签 目标标签 – 添加id / ref恰当时机, 通过id / 通过ref属性 获取目标标签…

Ubuntu系统新硬盘挂载

Ubuntu系统新硬盘挂载 服务器通常会面临存储不足的问题&#xff0c;大部分服务器都是ubuntu系统&#xff0c;该篇博客浅浅记载一下在ubuntu系统上挂载新硬盘的步骤。本篇博文仅仅记载简单挂载一块新的硬盘&#xff0c;而没有对硬盘进行分区啥的。如果需要更加完善的教程&#…

【C++】平衡二叉搜索(AVL)树的模拟实现

一、 AVL树的概念 map、multimap、set、multiset 在其文档介绍中可以发现&#xff0c;这几个容器有个共同点是&#xff1a;其底层都是按照二叉搜索树来实现的&#xff0c;但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索树…

Java文档搜索引擎总结

Java文档搜索引擎总结项目介绍项目使用的技术栈前端页面展示后端逻辑部分索引部分搜索模块部分Web模块部分项目介绍 Java文档搜索引擎项目是一个SSM项目&#xff0c;该项目的前端界面部分是由搜索页面和展示页面组成&#xff0c;后端部分索引模块&#xff08;ScanAnalysis、in…

UNET 对 CARVANA 数据集的分割

目录 1. 介绍 2. UNET 网络 3. dataset 数据加载 4. utils 工具模块 4.1 get_loaders 函数 4.2 check_accuracy 函数 4.3 save_predictions_as_imgs 函数 4.4 完整代码 5. train 函数 5.1 关于导入的库文件 5.2 设置超参数 5.3 train_fn 训练一个epoch函数 5.4 m…

Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?

目录专栏导读一、同样是缓存&#xff0c;用map不行吗&#xff1f;二、Redis为什么是单线程的&#xff1f;三、Redis真的是单线程的吗&#xff1f;四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…

【Java基础】30分钟Git 从入门到精通

一、 版本控制工具1、什么是版本控制系统&#xff1f;版本控制系统&#xff08;Version Control System&#xff09;:是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件&#xff0c;而且可以对…

主成分分析(PCA)方法 和协方差 相关系数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1.主成分分析&#xff08;PCA&#xff09;方法2.算法步骤前言 主成分分析&#xff08;Principal Components Analysis&#xff0c;PCA&#xff09;是一种数据降…

Android工厂模式

工厂模式分为三种 :简单工厂模式 、工厂方法模式 、抽象工厂模式 。 目录 简单工厂模式 UML图 实现 使用场景&#xff1a; 优点 &#xff1a; 缺点&#xff1a; 工厂方法模式 UML图 实现 使用场景&#xff1a; 优点&#xff1a; 缺点&#xff1a; 抽象工厂模式 UM…

SpringCloud-负载均衡-Ribbon

文章目录1. 作用&#xff1a;负载均衡2. 应用实战2.1 provider-a代码2.2 provider-b代码2.3 consumer代码2.4 api工具向consumer发送请求查看对provider的调用情况3. ribbon总结3.1 Ribbon 源码核心3.2 如何实现负载均衡的呢&#xff1f;1. 作用&#xff1a;负载均衡 2. 应用实…