文章目录
一、认识Nacos
1、安装
- 下载
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:8081spring:application:name: userservice # user服务的服务名称cloud:nacos:server-addr: localhost:8848# nacos服务端地址
- 重启order服务,查看nacos,可以看到注册成功
3、服务分级存储模型
一个服务可以部署多个实例,如果将这多个实例部署到同一个机房,万一这个机房出现意外,则整个集群宕掉。因此考虑将以机房划分集群,如上海集群、杭州集群…
可以看出,nacos的服务分级模型中,**
一级是服务、二级是集群、三级是实例。
**
引入集群的概念,其实是做个划分:服务调用尽可能选择本地集群的服务,跨集群调用延迟较高本地集群不可访问时,再去访问其它集群
配置集群属性:
点进去一个服务,可以看到它的集群是default,即默认,没有划分集群
想配置集群属性,可修改application文件
server:port:8081spring: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:8080spring: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:123driver-class-name: com.mysql.jdbc.Driver
cloud:nacos:server-addr: localhost:8848discovery: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 #开发环境,这里是devcloud:nacos:server-addr: localhost:8848# Nacos地址config:file-extension: yaml #文件后缀名# 到此,去哪儿读配置知道了:server-addr# 读哪个文件,即name-{profiles.active}.{config.file-extension}文件
- 接下来使用@value注解+dollar大括号来拿nacos配置
//验证是否拿到了nacos配置...publicclass userController{@Value("${pattern.dateformat}")privateString dateformat;@GetMapping("/now")publicStringnowTime(){returnLocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));}}
- 调用接口,根据结果格式得知拉取naocs配置成功
Nacos做配置管理的步骤总结:
但到此仅实现了配置管理,还没有实现配置热更新。这也为什么工作中有时候更改nacos配置后,要重启服务对应的pod,才能配置生效的原因。
3、配置热更新
Nacos中的配置文件变更后,
微服务无需重启就可以感知,即配置热更新。
但想实现这个效果,仅凭上面将配置交给nacos管理是不够的。配置热更新的实现方式如下:
方式一:在
@Value注入的变量所在类上添加注解@RefreshScope
此时,在控制台可以看到:
方式二:
使用@ConfigurationProperties注解
//在config目录下加个新类@Component//做为一个Bean类管理,方便其他地方引用@Data@ConfigurationProperties(prefix ="pattern") ## 这里写的是前缀名
publicclassPatternProperties{privateString dateformat; ## 前缀名和变量名拼接后和配置文件一致,就能完成属性的自动注入
//以后有属性,继续往后面加}
此时,UserController中注入这个Bean,并get属性值即可。改为:
...//@RefreshScopepublicclass userController{//@Value("${pattern.dateformat}")//private String dateformat;@AutowiredprivatePatternProperties properties;@GetMapping("/now")publicStringnowTime(){returnLocalDateTime.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,并执行以下SQLcreatedatabase nacos;CREATETABLE`config_info`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'id',`data_id`varchar(255)NOTNULLCOMMENT'data_id',`group_id`varchar(255)DEFAULTNULL,`content`longtextNOTNULLCOMMENT'content',`md5`varchar(32)DEFAULTNULLCOMMENT'md5',`gmt_create`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`gmt_modified`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'修改时间',`src_user`textCOMMENT'source user',`src_ip`varchar(50)DEFAULTNULLCOMMENT'source ip',`app_name`varchar(128)DEFAULTNULL,`tenant_id`varchar(128)DEFAULT''COMMENT'租户字段',`c_desc`varchar(256)DEFAULTNULL,`c_use`varchar(64)DEFAULTNULL,`effect`varchar(64)DEFAULTNULL,`type`varchar(64)DEFAULTNULL,`c_schema`text,PRIMARYKEY(`id`),UNIQUEKEY`uk_configinfo_datagrouptenant`(`data_id`,`group_id`,`tenant_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';/******************************************//* 数据库全名 = nacos_config *//* 表名称 = config_info_aggr *//******************************************/CREATETABLE`config_info_aggr`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'id',`data_id`varchar(255)NOTNULLCOMMENT'data_id',`group_id`varchar(255)NOTNULLCOMMENT'group_id',`datum_id`varchar(255)NOTNULLCOMMENT'datum_id',`content`longtextNOTNULLCOMMENT'内容',`gmt_modified`datetimeNOTNULLCOMMENT'修改时间',`app_name`varchar(128)DEFAULTNULL,`tenant_id`varchar(128)DEFAULT''COMMENT'租户字段',PRIMARYKEY(`id`),UNIQUEKEY`uk_configinfoaggr_datagrouptenantdatum`(`data_id`,`group_id`,`tenant_id`,`datum_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';/******************************************//* 数据库全名 = nacos_config *//* 表名称 = config_info_beta *//******************************************/CREATETABLE`config_info_beta`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'id',`data_id`varchar(255)NOTNULLCOMMENT'data_id',`group_id`varchar(128)NOTNULLCOMMENT'group_id',`app_name`varchar(128)DEFAULTNULLCOMMENT'app_name',`content`longtextNOTNULLCOMMENT'content',`beta_ips`varchar(1024)DEFAULTNULLCOMMENT'betaIps',`md5`varchar(32)DEFAULTNULLCOMMENT'md5',`gmt_create`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`gmt_modified`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'修改时间',`src_user`textCOMMENT'source user',`src_ip`varchar(50)DEFAULTNULLCOMMENT'source ip',`tenant_id`varchar(128)DEFAULT''COMMENT'租户字段',PRIMARYKEY(`id`),UNIQUEKEY`uk_configinfobeta_datagrouptenant`(`data_id`,`group_id`,`tenant_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';/******************************************//* 数据库全名 = nacos_config *//* 表名称 = config_info_tag *//******************************************/CREATETABLE`config_info_tag`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'id',`data_id`varchar(255)NOTNULLCOMMENT'data_id',`group_id`varchar(128)NOTNULLCOMMENT'group_id',`tenant_id`varchar(128)DEFAULT''COMMENT'tenant_id',`tag_id`varchar(128)NOTNULLCOMMENT'tag_id',`app_name`varchar(128)DEFAULTNULLCOMMENT'app_name',`content`longtextNOTNULLCOMMENT'content',`md5`varchar(32)DEFAULTNULLCOMMENT'md5',`gmt_create`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`gmt_modified`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'修改时间',`src_user`textCOMMENT'source user',`src_ip`varchar(50)DEFAULTNULLCOMMENT'source ip',PRIMARYKEY(`id`),UNIQUEKEY`uk_configinfotag_datagrouptenanttag`(`data_id`,`group_id`,`tenant_id`,`tag_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';/******************************************//* 数据库全名 = nacos_config *//* 表名称 = config_tags_relation *//******************************************/CREATETABLE`config_tags_relation`(`id`bigint(20)NOTNULLCOMMENT'id',`tag_name`varchar(128)NOTNULLCOMMENT'tag_name',`tag_type`varchar(64)DEFAULTNULLCOMMENT'tag_type',`data_id`varchar(255)NOTNULLCOMMENT'data_id',`group_id`varchar(128)NOTNULLCOMMENT'group_id',`tenant_id`varchar(128)DEFAULT''COMMENT'tenant_id',`nid`bigint(20)NOTNULLAUTO_INCREMENT,PRIMARYKEY(`nid`),UNIQUEKEY`uk_configtagrelation_configidtag`(`id`,`tag_name`,`tag_type`),KEY`idx_tenant_id`(`tenant_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';/******************************************//* 数据库全名 = nacos_config *//* 表名称 = group_capacity *//******************************************/CREATETABLE`group_capacity`(`id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`group_id`varchar(128)NOTNULLDEFAULT''COMMENT'Group ID,空字符表示整个集群',`quota`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'配额,0表示使用默认值',`usage`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'使用量',`max_size`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'聚合子配置最大个数,,0表示使用默认值',`max_aggr_size`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'最大变更历史数量',`gmt_create`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`gmt_modified`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'修改时间',PRIMARYKEY(`id`),UNIQUEKEY`uk_group_id`(`group_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';/******************************************//* 数据库全名 = nacos_config *//* 表名称 = his_config_info *//******************************************/CREATETABLE`his_config_info`(`id`bigint(64)unsignedNOTNULL,`nid`bigint(20)unsignedNOTNULLAUTO_INCREMENT,`data_id`varchar(255)NOTNULL,`group_id`varchar(128)NOTNULL,`app_name`varchar(128)DEFAULTNULLCOMMENT'app_name',`content`longtextNOTNULL,`md5`varchar(32)DEFAULTNULL,`gmt_create`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`gmt_modified`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`src_user`text,`src_ip`varchar(50)DEFAULTNULL,`op_type`char(10)DEFAULTNULL,`tenant_id`varchar(128)DEFAULT''COMMENT'租户字段',PRIMARYKEY(`nid`),KEY`idx_gmt_create`(`gmt_create`),KEY`idx_gmt_modified`(`gmt_modified`),KEY`idx_did`(`data_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';/******************************************//* 数据库全名 = nacos_config *//* 表名称 = tenant_capacity *//******************************************/CREATETABLE`tenant_capacity`(`id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`tenant_id`varchar(128)NOTNULLDEFAULT''COMMENT'Tenant ID',`quota`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'配额,0表示使用默认值',`usage`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'使用量',`max_size`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'聚合子配置最大个数',`max_aggr_size`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'最大变更历史数量',`gmt_create`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`gmt_modified`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'修改时间',PRIMARYKEY(`id`),UNIQUEKEY`uk_tenant_id`(`tenant_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';CREATETABLE`tenant_info`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'id',`kp`varchar(128)NOTNULLCOMMENT'kp',`tenant_id`varchar(128)default''COMMENT'tenant_id',`tenant_name`varchar(128)default''COMMENT'tenant_name',`tenant_desc`varchar(256)DEFAULTNULLCOMMENT'tenant_desc',`create_source`varchar(32)DEFAULTNULLCOMMENT'create_source',`gmt_create`bigint(20)NOTNULLCOMMENT'创建时间',`gmt_modified`bigint(20)NOTNULLCOMMENT'修改时间',PRIMARYKEY(`id`),UNIQUEKEY`uk_tenant_info_kptenantid`(`kp`,`tenant_id`),KEY`idx_tenant_id`(`tenant_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';CREATETABLE`users`(`username`varchar(50)NOTNULLPRIMARYKEY,`password`varchar(500)NOTNULL,`enabled`booleanNOTNULL);CREATETABLE`roles`(`username`varchar(50)NOTNULL,`role`varchar(50)NOTNULL,UNIQUEINDEX`idx_user_role`(`username`ASC,`role`ASC)USINGBTREE);CREATETABLE`permissions`(`role`varchar(50)NOTNULL,`resource`varchar(255)NOTNULL,`action`varchar(8)NOTNULL,UNIQUEINDEX`uk_role_permission`(`role`,`resource`,`action`)USINGBTREE);INSERTINTO users (username, password, enabled)VALUES('nacos','$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu',TRUE);INSERTINTO 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集群搭建结束。
版权归原作者 -代号9527 所有, 如有侵权,请联系我们删除。