目录

Nacos注册中心

流水不争先,争得是滔滔不绝

认识和安装Nacos

Nacos是阿里巴巴的产品,下载是Spring Cloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度极高。

1.下载安装包

Github的Release下载页:Releases · alibaba/nacos (github.com)

windows下载zip包就好:

https://s2.loli.net/2022/11/28/DbOyazGhdAcYPo7.png

2.解压

将这个压缩包解压到任意非中文目录下,目录说明:

  • bin:启动脚本
  • conf:配置文件

3.端口配置

Nacos的默认端口是8848,如果电脑上的其它进程占用了8848端口,先尝试关闭该进程。

如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:

https://s2.loli.net/2022/11/28/nQt1pxXTiUCG4Bk.png

修改端口号:

https://s2.loli.net/2022/11/28/mybalZGY84HqURM.png

4.启动

进入bin目录,在当前目录调出cmd,然后执行命令,使用单机模式启动:

1
startup.cmd -m standalone
小技巧

不想记这条命令,可以在bin目录里新建一个文本文件,把这条命令复制粘贴进去,然后修改后缀为.bat,如:

https://s2.loli.net/2022/11/28/Tr6LmhlpnOAKGBe.png

启动时直接双击这个bat脚本就好。

启动如下:

https://s2.loli.net/2022/11/28/xvLQMOXeSu1J9nV.png

打开浏览器,输入 http://localhost:8848/nacos 访问:

https://s2.loli.net/2022/11/28/Q9IembJ1jEDpHVf.png

默认的用户密码都是nacos,进入后如下:

https://s2.loli.net/2022/11/28/BqaUpo9Cf7iHTWn.png

服务注册到Nacos

Nacos是Spring Cloud Alibaba的组件,而Spring Cloud Alibaba也遵循Spring Cloud中定义的服务注册、服务发现规范。因此使用Nacos和Eureka,并没有太大差别。

主要差异在于:

  • 依赖不同
  • 服务地址不同

1、在父工程中添加spring-cloud-alibaba的管理依赖:

1
2
3
4
5
6
7
8
<!--nacos的管理依赖-->
<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>

2、注释掉原有的eureka依赖。

3、子工程中添加nacos的客户端依赖:

1
2
3
4
5
<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

4、修改application.yml文件,注释eureka地址,添加nacos地址:

1
2
3
4
5
6
7
8
9
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
#eureka相关配置一定要注释掉
#eureka:
#  client:
#    service-url:  #eureka地址信息
#      defaultZone: http://127.0.0.1:10010/eureka

5、启动nacos并测试:

https://s2.loli.net/2022/11/28/TkIiJcnvtoRhKuX.png

服务分级模型

一个服务可以有多个实例,比如之前的user-service,可以有:

  • localhost:8081
  • localhost:8082
  • localhost:8083
  • ……

假如把这些不同的实例部署到全国各地的不同机房,例如:

  • localhost:8081,在北京机房
  • localhost:8082,在上海机房
  • localhost:8083,在杭州机房
  • ……

Nacos将同一机房内的实际,划分为一个集群。

也就是说,user-service是服务,一个服务可以包含多个集群,每个集群中又可以有多个实例,形成分级模型,如图:

https://s2.loli.net/2022/11/28/4J9FDrbUH3cMElN.png

服务调用尽可能选择本地集群的服务,因为跨集群调用延迟较高。当本集群内不可访问时,才访问其它集群。

https://s2.loli.net/2022/11/28/DLPNj7Y2AVS36x8.png

如图,杭州机房内的order-service应该优先访问同机房的user-service,当同机房的user-service不可用时,再访问其他机房的user-service。

1.配置集群

修改user-service的application.yml文件,添加集群配置:

1
2
3
4
5
6
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: BJ  #指定集群名称,BJ代指北京,名称可以自定义

再复制一个user-service启动配置,添加熟悉指定集群名称:

1
2
#设置端口号为8083,集群名称SH指上海
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

https://s2.loli.net/2022/11/28/OtT7YrKhq6ibHkM.png

启动Nacos,然后启动user-service服务,效果:

https://s2.loli.net/2022/11/28/mpQ2VlNfEj6v8J1.png

2.同集群优先的负载均衡

默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例,默认情况下NacosRule是在同集群内随机挑选服务。

1.给order-service配置集群信息

修改order-service的application.yml文件,添加集群配置:

1
2
3
4
5
6
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: BJ  #集群名称

2.修改负载均衡规则

修改order-service的application.yml文件,修改负载均衡规则:

1
2
3
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

3.根据权重负载均衡

实际部署中会出现这样的场景:

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

但是默认情况下NacosRule是在同集群内随机挑选服务,不会考虑机器性能问题。

因此Nacos提供了权重配置来控制访问频率,权重越大则访问率越高

在Nacos控制台,找到user-service的实例列表,点击详情:

https://s2.loli.net/2022/11/28/8MbaoTLezpnvg6k.png

往下翻找到集群,可以看到默认权重是1,点击编辑修改权重:

https://s2.loli.net/2022/11/28/VApLoRKmdnBU5wa.png

修改权重值,0~1之间的数:

https://s2.loli.net/2022/11/28/V8v3Y7gpumbU4rc.png

注意
注意:如果权重修改为0,那么该实例永远不会被访问到!

环境隔离

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

  • namespace用来做环境隔离

  • nacos中可以有多个namespace

  • namespace下可以有group、service等

  • 每个namespace都有唯一id

  • 不同namespace下的服务相互不可见

https://s2.loli.net/2022/11/28/z9jVQZkD5N3axvX.png

1.创建Namespace

默认情况下,所有service、data、group都在同一个namespace,名为public:

https://s2.loli.net/2022/11/28/E2wiRfUjbFvsnpM.png

点击新增按钮,添加一个namespace:

https://s2.loli.net/2022/11/28/FuR9aMnijTVOE78.png

然后填写表单:

https://s2.loli.net/2022/11/28/4bTvqu3N9LGKWJh.png

点击确定后就能在页面看到新的namespace:

https://s2.loli.net/2022/11/28/hczyMQoUONegrsm.png

2.给微服务配置namespace

修改order-service的application.yml文件配置namespace:

1
2
3
4
5
6
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        namespace: bbfdd8d5-36c2-4cf2-837b-4e396ccedac6  #命名空间,填id

重启order-service后,访问控制台:

https://s2.loli.net/2022/11/28/pYqELWAvD9dfkhx.png

https://s2.loli.net/2022/11/28/qLXUGafjgtCu3Ib.png

此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:

https://s2.loli.net/2022/11/28/GurkjPQFCZeBx2v.png

Nacos与Eureka的区别

Nacos的服务实例分为两种类型:

  • 临时实例:如果实例宕机超过一定时间,就会从服务列表剔除,默认的类型。
  • 非临时实例:如果实例宕机,也不会从服务列表剔除,也可以加永久实例。

配置一个服务实例为永久实例:

1
2
3
4
5
6
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        ephemeral: false  #设置为非临时实例(永久实例)

Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:

https://s2.loli.net/2022/11/28/OraALMmJSDXypzH.png

  • Nacos与eureka的共同点
    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与eureka的区别
    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

配置管理

1.统一配置管理

随着微服务越来越多,在生产环境中可能会达到数百上千,此时逐个修改微服务配置就会很麻烦,很容易出错,而且修改配置后还要重启,在生产环境中服务重启带来的影响会很大。所以需要一种统一配置管理方案,可以集中管理所有实例的配置。

Nacos一方面可以将配置集中管理,另一方面可以在配置变更时,及时通知微服务,实现配置的热更新。

1.在Nacos中添加配置文件:

https://s2.loli.net/2022/11/28/mk1jyfuwFAP6EZz.png

2.填写弹出的表单,然后发布:

https://s2.loli.net/2022/11/28/sqLi1V5mFlGr2jX.png

注意: 项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

2.从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但是此时还没有读取application.yml,怎么知道nacos地址呢?

因此Spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

https://s2.loli.net/2022/11/28/n8CmkV3hOxolQeG.png

1.引入nacos-config依赖

首先,在user-service服务中,引入nacos-config的客户端依赖:

1
2
3
4
5
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.添加bootstrap.yaml

然后在user-service中添加一个bootstrap.yaml文件,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
spring:
  application:
    name: userservice  #服务名称
  profiles:
    active: dev  #开发环境
  cloud:
    nacos:
      server-addr: localhost:8848
      config:
        file-extension: yaml  #文件后缀名

这里会根据nacos地址,再根据服务名称+开发环境+文件后缀名,作为文件id,来读取配置userservice-dev.yaml

3.读取nacos配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    @Value("${pattern.dateformat}")
    private String dateformat;

    @GetMapping("now")
    public String now() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
}

再访问页面,就可以看到效果。

3.配置热部署

我们最终的目的,时修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。

要实现配置热更新,可以使用两种方式:

方式一:

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

1
2
3
4
5
6
7
8
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
    @Value("${pattern.dateformat}")
    private String dateformat;
}

方式二:

使用@ConfigurationProperties注解代替@Value注解。

在user-service服务中,添加一个类,读取pattern.

dateformat属性:

1
2
3
4
5
6
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

在UserController中使用这个类代替@Value:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private PatternProperties properties;

    @GetMapping("now")
    public String now() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
    }
}

4.多环境配置共享

微服务会从Nacos中读取的配置文件:

① [服务名]-[spring.profile.active].yaml,环境配置

② [服务名].yaml,默认配置,多环境共享

优先级:

https://s2.loli.net/2022/11/28/7buNz56tkFpHCGD.png

搭建集群

搭建集群的基本步骤:

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

1.初始化数据库

首先新建一个数据库,命名:nacos,然后导入SQL:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
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的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf,然后添加内容:

1
2
3
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847

然后修改application.properties文件,添加数据库配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
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

3.启动

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

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

nacos1:

1
server.port=8845

nacos2:

1
server.port=8846

nacos3:

1
server.port=8847

然后分别启动三个节点:

1
startup.cmd

4.nginx反向代理

修改nginx中的conf下的nginx.conf文件,配置放到http任意位置中,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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配置如下:

1
2
3
4
spring:
  cloud:
    nacos:
      server-addr: localhost:80  #Nacos地址