【SpringCloud】三、Nacos服务注册+配置管理+集群搭建

news2024/11/23 11:14:44

文章目录

  • 一、认识Nacos
    • 1、安装
    • 2、服务注册和发现
    • 3、服务分级存储模型
    • 4、负载均衡策略--NacosRule
    • 5、服务实例的权重设置
    • 5、环境隔离namespace
    • 6、Eureka和Nacos的区别
  • 二、Nacos配置管理
    • 1、统一配置管理
    • 2、微服务配置拉取
    • 3、配置热更新
    • 4、多环境配置共享
  • 三、Nacos集群搭建
    • 1、初始化数据库
    • 2、下载Nacos
    • 3、配置Nacos
    • 4、启动
    • 5、nginx反向代理

一、认识Nacos

1、安装

官网:https://nacos.io/zh-cn/

在这里插入图片描述

  • 下载
Github主页: https://github.com/alibaba/nacos
Github的Release下载页: https://github.com/alibaba/nacos/releases

在这里插入图片描述

  • 解压
# bin即启动脚本、可执行文件
# conf即配置文件,nacos默认端口8848

在这里插入图片描述

  • 启动

在这里插入图片描述

双击startup.cmd或者执行cmd命令:

//进入bin目录,打开cmd
// -m standalone即单机启动 
startup.cmd -m standalone
  • 启动成功

在这里插入图片描述

  • 登录

在这里插入图片描述

2、服务注册和发现

  • 在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:
<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的客户端依赖(此时user、order中的eureka可以注释掉了)
<!-- nacos客户端依赖-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 在order和user模块的application.yml文件中,注释eureka地址,添加nacos的地址
server:
  port: 8081
spring:
  application:
    name: userservice  # user服务的服务名称
  cloud:
    nacos:
      server-addr: localhost:8848  # nacos服务端地址
  • 重启order服务,查看nacos,可以看到注册成功

在这里插入图片描述

3、服务分级存储模型

一个服务可以部署多个实例,如果将这多个实例部署到同一个机房,万一这个机房出现意外,则整个集群宕掉。因此考虑将以机房划分集群,如上海集群、杭州集群…

在这里插入图片描述

可以看出,nacos的服务分级模型中,一级是服务、二级是集群、三级是实例。

引入集群的概念,其实是做个划分:服务调用尽可能选择本地集群的服务,跨集群调用延迟较高本地集群不可访问时,再去访问其它集群

在这里插入图片描述

配置集群属性:

点进去一个服务,可以看到它的集群是default,即默认,没有划分集群

在这里插入图片描述

想配置集群属性,可修改application文件

server:
  port: 8081
spring:
  application:
    name: userservice  # user服务的服务名称
  cloud:
    nacos:
      server-addr: localhost:8848  # nacos服务端地址
      discovery:   # 新加集群属性
        cluster-name: HZ # 配置集群名称,也就是机房位置

修改application的集群信息,启动一个userservice实例,再修改,再启动另一个实例:

在这里插入图片描述

刷新nacos,进入userservice服务,可以看到有两个集群,以及集群下的服务实例:

在这里插入图片描述

4、负载均衡策略–NacosRule

现在,user服务的实例被部署到了两个集群中:杭州集群和上海集群。接下来实验order调用user服务时,优先选择本地集群的服务。因此,先给order服务添加一个集群属性:

# 修改order服务的application文件
server:
  port: 8080
spring:
  application:
    name: orderservice  # order服务的服务名称
  cloud:
    nacos:
      server-addr: localhost:8848  # nacos服务端地址
      discovery:   # 新加集群属性
        cluster-name: HZ # 配置成杭州集群,也就是机房位置

重启order服务,查看nacos,发现order的实例已成功位于杭州集群:

在这里插入图片描述

此时,多次访问 http://localhost:8080/order/{orderId},发现控制台上三个服务实例均有日志输出,并没有按照集群来优先选择本地。

在这里插入图片描述

很明显,这是负载均衡默认的轮询机制。接下来修改默认机制:

在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务实例:
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则,这里之前学Eureka时配置的是随机

# 以上配置即:order调用userservice时,优先选择同集群的userservice实例

此时,再多次调用http://localhost:8080/order/{orderId},发现上海集群的8003实例中,控制台没有日志了。可见现在是优先杭州集群的实例。

在这里插入图片描述

此时,停掉杭州的两个实例:

在这里插入图片描述

再调用http://localhost:8080/order/{orderId},发现请求到了上海集群的userservice的8003实例上。且orderservice控制台输出警告信息A cross-cluster call occurs,即一个跨集群访问发生。

在这里插入图片描述

总结:NacosRule这种负载均衡策略下,优先本地集群的实例,本地的多个可用实例之间则又是随机的策略。

5、服务实例的权重设置

NacosRule目前的效果是集群优先,集群内部随机选择。但同一个集群里的机器,配置也不尽相同,难免有祖传服务器、老弱病残。想要能者多劳,就得设置权重。

在这里插入图片描述

在HZ集群中,修改其中一个实例权重为0.1,多次调用接口,发现权重越低,访问频率就越低。

在这里插入图片描述

权重直接降为0时,就不会有需求转发到这个实例。

利用这个权重,可以用于服务的升级—灰度发布,将一个服务实例权重改为0 ⇒ 升级 ⇒ 将权重略微调一点,放一部分请求进来,验证没问题以后再升级其他 ⇒ 实现了平滑升级。

5、环境隔离namespace

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

  • 新建命名空间

在这里插入图片描述

  • 起名

在这里插入图片描述

  • 在控制台看到这个命名空间的id:

在这里插入图片描述

  • 修改order-service的application.yml,添加namespace
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/heima?useSSL=false
    username: root
    password: 123
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: SH # 上海
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 #命名空间,填ID
  • 重启orderservice,查看nacos控制台

在这里插入图片描述

  • 此时调用order接口(中途调用user),报错:No instances available for userservice(二者属于不同的namespace,隔离了)

在这里插入图片描述

  • namespace用来做环境隔离的。
  • 不同的namespace,服务不可见。

6、Eureka和Nacos的区别

二者都是做服务注册和服务发现的:

共同点:

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

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

区别:

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

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

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

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

在这里插入图片描述Nacos中,对于临时实例(控制台临时实例值为true),和Eureka一样,采用心跳监测,向nacos注册中心汇报健康状态。而对非临时实例,则是nacos主动询问实例:“你没事吧”

在这里插入图片描述
另外,为了不给nacos造成压力,服务消费者每30秒拉取一次新的信息,并存入列表缓存,但如果两次拉取的期间有服务实例挂了,则信息更新不及时。和Eureka不同,Nacos会推送信息给服务消费者。

Eureka是pull,Nacos则是pull+注册中心主动push

服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例,默认为true,即临时工

临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会,会等着它重新启动起来。

二、Nacos配置管理

1、统一配置管理

当前测试的项目整体结构如下:

在这里插入图片描述

随着微服务数量的增多,更改一个配置,可能涉及到多个服务,一个个修改、一个个重启显然很low。

如何做到对多个微服务配置的统一修改?

如何做到修改配置后不用重启服务,修改就能生效,即配置更改热更新

想实现这两个效果,可以借助Naocs配置管理,将需要更改的一些开关配置,写在nacos中,Nocos中的配置和项目中的application.yaml文件中的配置加起来就是这个服务的全部配置。

  • 在Nacos点击添加配置信息

在这里插入图片描述

  • 填写信息,Data ID也即文件名

在这里插入图片描述

2、微服务配置拉取

没有nacos之前,微服务获取配置如图:

在这里插入图片描述

现在有一部分配置已经写在了nacos中,那微服务如何去拿到这些配置呢?

在这里插入图片描述

想读取nacos中的配置,那nacos的地址是多少,去这个nacos地址读取哪些文件?

目前,naocs的地址写在application.yaml中,但根据上面的读取顺序,先读取的是nacos配置,所以得将nacos的地址提前 ====> bootstrap.yaml文件

在这里插入图片描述

以上的具体实现步骤如下:
  • 引入Nacos的配置管理客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml
spring:
  application:
    name: userservice #服务名称
  profiles:
    active: dev  #开发环境,这里是dev
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config: 
        file-extension: yaml  #文件后缀名

# 到此,去哪儿读配置知道了:server-addr
# 读哪个文件,即name-{profiles.active}.{config.file-extension}文件
  • 接下来使用@value注解+dollar大括号来拿nacos配置
//验证是否拿到了nacos配置
...
public class userController{
	@Value("${pattern.dateformat}")
	private String dateformat;
	
	@GetMapping("/now")
	public String nowTime(){
		return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
	}
}
  • 调用接口,根据结果格式得知拉取naocs配置成功

在这里插入图片描述

Nacos做配置管理的步骤总结:
在这里插入图片描述

但到此仅实现了配置管理,还没有实现配置热更新。这也为什么工作中有时候更改nacos配置后,要重启服务对应的pod,才能配置生效的原因。

3、配置热更新

Nacos中的配置文件变更后,微服务无需重启就可以感知,即配置热更新。但想实现这个效果,仅凭上面将配置交给nacos管理是不够的。配置热更新的实现方式如下:

方式一:在@Value注入的变量所在类上添加注解@RefreshScope

在这里插入图片描述
此时,在控制台可以看到:

在这里插入图片描述

方式二:使用@ConfigurationProperties注解

//在config目录下加个新类
@Component  //做为一个Bean类管理,方便其他地方引用
@Data
@ConfigurationProperties(prefix ="pattern")   ## 这里写的是前缀名
public class PatternProperties {

	private String dateformat;   ## 前缀名和变量名拼接后和配置文件一致,就能完成属性的自动注入
	//以后有属性,继续往后面加
}

此时,UserController中注入这个Bean,并get属性值即可。改为:

...
//@RefreshScope
public class userController{
	//@Value("${pattern.dateformat}")
	//private String dateformat;
	
	@Autowired
	private PatternProperties properties;
	
	@GetMapping("/now")
	public String nowTime(){
		return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat));
	}
}

最后:

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

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

4、多环境配置共享

有的配置,在很多环境中都要用到,如果每个里面都写一份,冗余不说,后期有变更时,也只能一个个去改,不方便。

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

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

  • [spring.application.name].yaml,例如:userservice.yaml

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

接下来测试验证一下:

新加一个userservice.yaml文件

在这里插入图片描述

读nacos配置:

在这里插入图片描述

新加个接口,把配置返回在前端页面:

在这里插入图片描述

启动8081实例,其中该实例profiles值为dev。再编辑8082的配置,将profiles值改为test
.
在这里插入图片描述

调用接口,查看效果:

在这里插入图片描述
在这里插入图片描述
因此,得出实验结论:[spring.application.name].yaml这个文件一定会加载,可以被不同的环境共享。

这一点在控制台的启动日志也可以看出:

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

当多个地方都配置有同一个属性时,谁的生效由配置优先级决定:

服务名-profile.yaml > 服务名称.yaml > 本地配置

但可以开启配置,不让nacos的配置覆盖本地配置。

三、Nacos集群搭建

生产环境中,为了保证高可用,nacos采用集群,包含3个nacos节点(没有三台服务器,就用三个pod代替看看效果)。然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。

在这里插入图片描述
这里用一台服务器,但启用三个不同端口来模拟三节点:

在这里插入图片描述
搭建集群的基本步骤为:

  • 搭建数据库,初始化数据库表结构
  • 下载nacos安装包
  • 配置nacos
  • 启动nacos集群
  • nginx反向代理

1、初始化数据库

Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。官方推荐的最佳实践是使用带有主从的高可用数据库集群。

# 这里使用单节点数据库
# 创建数据库nacos,并执行以下SQL
create database nacos;
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');

在这里插入图片描述

2、下载Nacos

nacos在GitHub上有下载地址:https://github.com/alibaba/nacos/tags,可以选择任意版本下载。

3、配置Nacos

  • 将这个包解压到任意非中文目录下
bin:启动脚本
conf:配置文件
  • 进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf

在这里插入图片描述

  • 在cluster.conf中添加内容
# nacos节点信息
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
  • 修改application.properties文件,添加数据库配置
spring.datasource.platform=mysql  # 告诉Nacos我用MySQL

db.num=1 # 集群中我只有一台MySQL

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=123

4、启动

将上面的nacos目录复制三份:

在这里插入图片描述
分别修改三个文件夹中的application.properties:
nacos1:

server.port=8845

nacos2:

server.port=8846

nacos3:

server.port=8847

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

# 进入/bin/目录打开cmd
startup.cmd
# 此时startup.cmd不用再加-m参数,因为现在时集群,不是单机启动了

5、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;
    }
}
  • 启动nginx

在这里插入图片描述

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

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

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

到此,nacos集群搭建结束。

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

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

相关文章

【JavaSE】Java基础语法(十一):String、StringBuilder详解

文章目录 &#x1f378;1. String类&#x1f349;&#x1f349;1.1 String概述&#x1f349;&#x1f349;1.2 String类的构造方法&#x1f349;&#x1f349;1.3 创建字符串对象的区别对比&#x1f349;&#x1f349;1.4 字符串的比较1.4.1 字符串的比较 &#x1f349;&#x…

GitHub上标星75k+超牛的《Java面试突击离线版》够你润进去了

前言 不论是校招还是社招都避免不了各种面试。笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的&#xff0c;我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。 运筹帷幄之后&#xff0c;决胜千里之外!不打毫无准备的仗,我觉…

C# 栈(Stack)

目录 一、概述 二、基本的用法 1.入栈 2.出栈 Pop 方法 Peek 方法 3.判断元素是否存在 4.获取 Stack 的长度 5.遍历 Stack 6.清空容器 7.Stack 泛型类 三、结束 一、概述 栈表示对象的简单后进先出 (LIFO) 非泛型集合。 Stack 和 List 一样是一种储存容器&#x…

这种新的Facebook Messenger群发方式,让你的信息更有价值!

随着社交媒体的迅速发展&#xff0c;Facebook已成为人们分享信息、建立联系和开展业务的重要平台之一。在这个数字时代&#xff0c;如何有效地传达信息并与目标受众建立联系成为了关键的挑战。 而最近引入的Facebook Messenger群发方式为我们提供了一种全新的机会&#xff0c;…

【CloudCompare教程】008:基于点云的三维模型重建(泊松重建)

本文讲述基于点云的三维模型重建方法,PoissonRecon是“Poisson Surface Reconstruction”的缩写,它是由约翰霍普金斯大学的Misha Kazhdan47提出的三角形网格生成算法的简单接口。 文章目录 一、加载点云二、计算法向量三、泊松建模四、利用输出密度一、加载点云 加载兔子点云…

接口测试神器:ApiKit

想给大家分享一款技术人必备的接口测试神器&#xff1a;ApiKit&#xff0c;应该是我目前用过&#xff0c;算得上良心的接口工具 背景 作为互联网行业技术从业者&#xff0c;接口调试是必不可少的一项技能&#xff0c;通常我们都会选择使用 Postman 这类工具来进行接口调试&…

Kali-linux使用Aircrack-ng工具破解无线网络

Aircrack-ng是一款基于破解无线802.11协议的WEP及WPA-PSK加密的工具。该工具主要用了两种攻击方式进行WEP破解。一种是FMS攻击&#xff0c;该攻击方式是以发现该WEP漏洞的研究人员名字&#xff08;Scott Fluhrer、Itsik Mantin及Adi Shamir&#xff09;所命名&#xff1b;另一种…

播放量上百亿,易车新媒体矩阵到底做对了什么

消费者的媒介触点和整体决策链路在不断向线上偏移&#xff0c;有数据显示&#xff0c;超7成的车主对信息的获取渠道偏好为汽车垂直媒体。 在这个大背景下&#xff0c;谁能打造更专业的内容&#xff0c;能更快速且广泛地触达用户&#xff0c;谁才更有可能脱颖而出&#xff0c;汽…

如何快速搭建SpringBoot+Vue前后端分离的开发环境

唠嗑部分 今天我们来说一说&#xff0c;如何快速搭建SpringBootVue前后端分离的开发环境 需要前置环境nodejs&#xff0c;请自行安装(傻瓜式安装) SpringBoot采用2.4.2版本&#xff0c;Vue采用Vue2版本 言归正传 创建Vue项目 1、安装vue npm install -g vue/cli2、检查v…

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第一章——调试调优背景介绍

1.模型迁移、模型调试调优背景介绍 模型训练\推理过程中可能遇到的问题&#xff1a; • 代码编写错误&#xff0c;问题难以定位&#xff1b; • 模型结构错误&#xff1b; • 权重更新错误&#xff1b; • 损失函数设计错误&#xff1b; • 半精度下计算溢出&#xff1b; • L…

上线11年公众号广告大变天!最新政策解读|西瓜数据

昨晚&#xff0c;微信公众平台的一则公告&#xff0c;在圈内炸开锅了。 ▲ 图片来源&#xff1a;西瓜数据社群截图 公告称&#xff1a; 公众号运营者与第三方商业合作形式推销商品或者服务&#xff0c;如附加购物链接等购买方式的商业合作营销内容&#xff0c;在2023年6月30日…

迅为RK3568开发板Android 双屏/三屏同显

iTOP-RK3568 开发板支持以下屏幕 迅为 LVDS 7 寸屏幕 迅为 LVDS 10.1 寸 1024*600 屏幕 迅为 LVDS 10.1 寸 1280*800 屏幕 迅为 MIPI 7 寸屏幕 HDMI 屏幕&#xff08;通过 HDMI 线连接&#xff09; HDMI 屏幕&#xff08;通过 VGA 线连接&#xff09; 然后修改 Android1…

Linux系统提权

滥用的SUDO提权 执行流程&#xff1a;当前用户转换到root&#xff0c;然后以root身份执行命令&#xff0c;执行完成后&#xff0c;直接退回到当前用户 注意&#xff1a;执行sudo时输入的命令&#xff0c;是当前用户的密码&#xff0c;而非root密码 sudo配置文件&#xff1a;…

SpringBoot枚举入参实战

文章目录 前言一、什么是枚举&#xff1f;二、枚举的优点三、枚举的缺点四、使用步骤1.代码实现1.1.枚举1.2.实体1.3.控制层 2.Postman测试2.1.Get请求2.1.1.枚举参数2.1.2.对象枚举属性参数 2.2.Post请求2.2.1.枚举参数2.2.2.对象枚举属性参数 2.3.Put请求2.3.1.枚举参数2.3.2…

0基础学习VR全景平台篇第31章:场景功能-嵌入图片

大家好&#xff0c;欢迎收看蛙色平台免费教程&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 嵌入功能可对VR全景作品嵌入【图片】【视频】【文字】【标尺】四种不同类型内容&#xff0c;本次主要带来图片类型的介绍&#xff0c;满足场景营销、重点标注、幻灯片…

node.js+vue.js大学生在线选课系统的设计与实现93pul

本次设计任务是要设计一个选课系统的设计与实现&#xff0c;通过这个系统能够满足用户对选课信息的需求。系统的主要功能包括&#xff1a;个人中心、学生管理、教师管理、选课信息管理等功能。 管理员可以根据系统给定的账号进行登录&#xff0c;登录后可以进入选课系统的设计与…

操作系统第四章——文件管理(下)

竹本无心&#xff0c;却节外生枝&#xff0c;藕却有孔&#xff0c;但出淤泥而不染&#xff0c;人生如梦&#xff0c;却却不随人愿&#xff0c;万般皆是命&#xff0c;半点不由人 文章目录 4.1.5 逻辑结构VS物理结构4.1.6 文件的基本操作知识总览创建文件删除文件打开文件关闭文…

超融合产品集成 Kata 虚拟化容器技术的方案演进 | 龙蜥技术

编者按&#xff1a;超融合技术融合基础实施为企业用户提供虚拟化、容器等不同形态的服务。今天&#xff0c;浪潮数据超融合云原生工程师王永超带大家了解 Kata 虚拟化容器技术&#xff0c;及超融合产品为集成 Kata 容器而进行技术方案演进历程&#xff0c;也分享了超融合 Kata …

Pinctrl/Gpio简介(以应用层角度修改设备树)

1.先举个例子 1 、添加 pinctrl 节点 iomuxc 节点就是 I.MX6ULL 的 IOMUXC 外设对应的节点 imx6ull.dtsi iomuxc: iomuxc020e0000 {compatible "fsl,imx6ul-iomuxc";reg <0x020e0000 0x4000>; }imx6ull.dts 根节点下 gpioled {#address-cells <1>;…

深入业务场景的数据使用安全管控实践

《数据安全法》第三条对数据安全给出了明确的定义&#xff1a;“数据处理包括数据的收集、存储、使用、加工、传输、提供、公开等。数据安全是指通过采取必要措施&#xff0c;确保数据处于有效保护和合法利用的状态&#xff0c;以及具备保障持续安全状态的能力。” 数据随着业…