1 Nacos注册中心
国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。
1.1 认识和安装Nacos
1.2 Windows安装
1.2.1下载安装包
在Nacos的GitHub页面,提供有下载链接,
可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
1.2.2 解压
将这个包解压到任意非中文目录下,如图:
目录说明:
- bin:启动脚本
- conf:配置文件
1.2.3 端口配置
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
修改其中的内容:
1.2.3 启动
- 启动非常简单,进入bin目录,结构如下:
- 然后执行命令即可:
- windows命令:以单服务器模式启动
startup.cmd -m standalone
3 执行后的效果如图:
4. 建议创建一个快捷方式,以后方便运行
1.2.5 访问
在浏览器输入地址:http://127.0.0.1:8848/nacos即可:
默认的账号和密码都是nacos,进入后:
1.3 服务注册到Nacos
Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。
主要差异在于:
- 依赖不同
- 服务地址不同
1.3.1 引入依赖
在cloud-demo父工程的pom文件中的<dependencyManagement>
中引入SpringCloudAlibaba的依赖:
<!-- 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>
然后在子工程user-service和order-service中的pom文件中引入nacos-discovery依赖:
<!-- nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
注意:子工程不要忘了注释掉eureka的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1.3.2 配置Nacos地址
在user-service和order-service的application.yml中添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848
注意:不要忘了注释掉eureka的地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
1.3.3 重启
重启微服务后,登录nacos管理页面,可以看到微服务信息:
1.4 服务分级储存模型
一个服务可以有多个实例,例如我们的user-service,可以有:
- 192.168.159.1:8081
- 192.168.159.1:8082
- 192.168.159.1:8083
假如这些实例分布于全国各地的不同机房,例如:
- 192.168.159.1:8081,在上海机房
- 192.168.159.1:8082,在上海机房
- 192.168.159.1:8083,在杭州机房
Nacos就将同一机房内的实例 划分为一个集群。
也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:
微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如
杭州机房内的order-service应该优先访问同机房的user-service。
1.4.1 给user-service配置集群
修改user-service的application.yml文件,添加集群配置:
8081和8082在HZ集群,8083在SH集群
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名称
重启两个userservice实例,点详情
在服务详情中查看集群
将8083的配置设置集群为SH,添加属性:
-Dserver.port=8083
-Dspring.cloud.nacos.discovery.cluster-name=SH
配置如图所示:
启动UserApplication8083,后再次查看nacos详情:
1.4.2 同集群优先的负载均衡
默认的ZoneAvoidanceRule
并不能实现根据同集群优先来实现负载均衡。
因此Nacos中提供了一个NacosRule
的实现,可以优先从同集群中挑选实例。
1)给order-service配置集群信息
修改order-service的application.yml文件,添加集群配置,放在HZ这个集群中
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名称
2)修改负载均衡规则:修改order-service的application.yml文件,修改负载均衡规则:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
-
重启OrderApplication,访问浏览器,刷新多次,发现所有的请求都在8081和8082这两个服务器。
注:在本地集群中服务器的选择采用的是随机的负载均衡方式
- 将8081和8082的服务器关闭,这时同一个集群中所有的服务器都关了,只能访问其它集群了。
5 再访问会发现访问8083,同时OrderApplication控制台会有警告信息,说是出现了跨集群访问
1.5 权重配置
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在的机器设备性能较好,一部分较差,我们希望性能较好的机器承担更多的用户请求,但是默认情况下NacosRule实在同集群随机挑选,不会考虑机器性能,因此Nacos提供了权重设置,来控制访问的频率,权重越大访问的频率越高。
- 再次启动8081和8082服务器
- 在nacos控制台,找到userservice的实例列表,点击编辑,即可修改权重:
- 在弹出的编辑窗口,修改权重:
-
再次访问,会发现8081被访问到的次数少得多,大约只有8082的五分之一。
注:userservice微服务器重启以后,权重会还原
-
如果将8081权重修改为0,则该实例永远不会被访问。
应用场景:当系统升级时,可以将用户清除,升级之后再放入少量用户测试访问
1.6 环境隔离
Nacos既是注册中心,又是数据中心。为了便于管理,Nacos提供了namespace来实现环境隔离功能。用于进行租户级别的隔离,我们最常用的就是不同环境比如测试环境,线上环境进行隔离。
- nacos中可以有多个namespace
- namespace下可以有group等。业务相关性比较强的可以放在一组,比如:支付和订单
- 不同namespace之间相互隔离,即不同namespace的服务互相不可见
1.创建namespace
应用场景:基于不同的开发环境变化做隔离操作
默认情况下,所有service、group都在同一个namespace,名为public:
- 我们可以点击页面新增按钮,添加一个namespace:
- 然后,填写数据:
- 能在页面看到一个新的namespace:
2.给微服务配置namespace
- 给微服务配置namespace只能通过修改配置来实现。
例如,修改order-service的application.yml文件:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
- 重启order-service后,查看管理页面,可以看到在public下没有orderservice服务
-
点旁边的dev可以看到另一个空间的服务只有orderservice:
-
此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错
-
修改user-service中的application.yml,把它的namespace也设置成同一个命名空间
spring: application: name: userservice cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9
-
重启UserApplication8081的服务,查看nacos的服务列表
-
再次访问可以正常访问
二、Nacos配置管理
1.统一配置管理
1.1.1.在nacos中添加配置文件
如何在nacos中管理配置呢?
然后在弹出的表单中,填写配置信息:
注:这里扩展名使用yaml
配置内容如下:
pattern:
dateformat: yyyy-MM-dd HH:mm.ss
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。通常是一些偶尔会变动的参数。
1.1.2.从微服务拉取配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此Spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
1)在user-service服务中,引入nacos-config的客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2)添加bootstrap.yaml
然后,在user-service中添加一个bootstrap.yaml文件,内容如下:
- 服务名为userservice,注:名字中间没有短横。
- 指定激活的配置dev
- 指定spring.cloud.nacos.server-addr的服务地址:localhost:8848
- 指定spring.cloud.nacos.config.file-extension配置文件的扩展名为yaml
spring:
application:
name: userservice # 服务名称,注:要与文件名一致
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作为文件id,来读取配置。
本例中,就是去读取userservice-dev.yaml
:
-
去掉application.yml中相关重复的配置
application: name: userservice cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ namespace: a8ace27d-a737-4122-9f3f-92f5ee795b62
4)读取nacos配置
在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:
完整代码:
package cn.itcast.user.web;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
访问不同的服务页面,可以看到效果:
2.配置热更新
我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
要实现配置热更新,可以使用两种方式:
2.1 方式一
在@Value()所在类上面添加@RefreshScope
步骤
1 在UserController上添加@RefreshScope注解,这注解会重新加载在实例对象,并且使用新配置
2 重新启动UserController,让新代码起作用
3 编辑Nacos配置
4 在浏览器查看新配置
2.2 方式二
使用@ConfigurationProperties 代替@RefreshScope和@Value
1 去掉UserController上面的@RefreshScope和@Value
2 创建Pattrenproperties配置类
在配置类添加@Component
添加@CongurationProperties(prefix=" pattern")
添加String dateformat属性
3 在UserController使用这个类
4. 完整代码:
package cn.itcast.user.web;
import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PatternProperties patternProperties;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
}
}
- 重启UserApplication微服务
- 编辑Nacos配置
- 效果
3.配置共享
1. 共享配置的说明
应用场景:某个配置在开发,测试,生产环境中的配置是一样的,就可以使用共享配置
其实微服务启动时,会去nacos读取多个配置文件,例如:
-
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml -
[spring.application.name].yaml
,例如:userservice.yaml
而[spring.application.name].yaml
不包含环境,因此可以被多个环境共享。
2. 测试配置共享
-
我们在nacos中添加一个userservice.yaml文件:
pattern: envSharedValue: 大家都可以用哦
2.这是有两个配置文件
3 在PatternProperties配置类添加String envSharedValue属性
4 在UserController重新写一个方法
5 运行两个UserAppcliation,使用不同的profiles
6 重新启动UserController
7 查看浏览器效果
3. 配置共享的优先级
1. 优先级说明
当nacos、服务本地同时出现相同属性时,优先级有高低之分:
服务器控制台显示:
Located property source: [BootstrapPropertySource {name='bootstrapProperties-userservice-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-userservice.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-userservice,DEFAULT_GROUP'}]
2. 演示
-
在PatternProperties中添加新的username属性
@Component @ConfigurationProperties(prefix = "pattern") @Data public class PatternProperties { private String dateformat; private String envSharedValue; private String username; }
-
在application.yml中添加新的username属性,查看浏览器运行效果
pattern: username: 孙悟空
-
在userservice.yaml中添加新的username属性,查看浏览器运行效果
-
在userservice-dev.xml中添加新的username属性,查看浏览器运行效果
4.配置Nacos集群
1.集群结构图
官方给出的Nacos集群图:
SLB:负载均衡器,负责将我们的请求分发到不同的nacos节点
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
我们计划的集群结构:
三个nacos节点的地址:
节点 | 换成实际服务器的IP地址 | port |
---|---|---|
nacos1 | 192.168.159.1 | 8845 |
nacos2 | 192.168.159.1 | 8846 |
nacos3 | 192.168.159.1 | 8847 |
2.搭建集群
搭建集群的基本步骤:
- 搭建数据库,初始化数据库表结构
- 下载nacos安装包
- 配置nacos
- 启动nacos集群
- nginx反向代理
2.1.初始化数据库
Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。
官方推荐的最佳实践是使用带有主从的高可用数据库集群,主从模式的高可用数据库可以参考黑马程序员的课程。这里我们以单点的数据库为例来讲解。
首先新建一个数据库,命名为nacos_config。这个表结构已经由官方提供了。
注:要使用mysql5.7以上的版本,5.5运行不了。
CREATE DATABASE IF NOT EXISTS nacos;
USE 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_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_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_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_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 */
/* 表名称 = 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 */
/* 表名称 = 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 */
/* 表名称 = 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.2.配置Nacos
- 创建一个目录名为:nacos-cluster
- 进入目录nacos-cluster目录,重新解压安装一份新的nacos
- 进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf
- 然后添加内容,注意:此处的IP是你自己机器的IP地址,不要写成127.0.0.1(或localhost),否则会导致微服务注册失败
192.168.159.1:8845
192.168.159.1:8846
192.168.159.1:8847
在cmd下使用ipconfig来查看自己的IP地址(建议选择虚拟机网卡的ip,VMnet8)
- 然后修改application.properties文件,修改数据库配置。
# 由于nacos会动态读取当前电脑上任意网卡的ip导致集群环境失败,所以写死当前ip
nacos.inetutils.ip-address=192.168.90.105
# mysql的数据库集群
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
这里的数据库地址、用户名、密码请根据实际情况配置。
2.3.启动
将nacos改名成nacos1,并且复制两份,分别命名为:nacos2、nacos3
然后分别修改三个文件夹中的application.properties,大约在21行
nacos1:
server.port=8845
nacos2:
server.port=8846
nacos3:
server.port=8847
修改内存使用使用,nacos默认内存使用2个G,修改为1个G,修改nacos/bin目录的startup.cmd
然后打开三个cmd窗口,分别启动三个nacos节点,不需要带参数,默认是集群启动方式,也可以双击运行
startup.cmd
看到以下提示表示启动成功
INFO Nacos started successfully in cluster mode. use external storage
2.5.nginx反向代理
-
下载nginx安装包:
-
解压到任意非中文目录下:
-
修改conf/nginx.conf文件,配置如下
这里使用127.0.0.1不影响
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元素的内部位置都可以,不用删除以前的server配置
-
在命令行下输入:start nginx.exe启动nginx服务器,也可以双击运行,运行后查看任务管理器
-
在浏览器访问:http://localhost/nacos即可。
-
查看
集群管理->节点列表
2.6. Java代码的修改
- 修改userservice服务的bootstrap.yaml文件配置如下:
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址
-
重新启动UserApplication微服务
-
在nacos管理页面创建新的配置管理:userservice.yaml文件
-
浏览器上访问
-
就会在mysql的nacos库的config_info表中出现上面的配置信息
最终调用逻辑图