1.Nacos入门
-
到官网下载Nacos
-
在下载好的Nacos文件夹下的conf文件夹里找到application.properties文件,打开文件配置对应的端口号server.port=8848
-
在下载好的Nacos文件夹下的bin文件夹中使用终端打开执行命令startup.cmd -m standlone进行启动,如果是PowerShell终端,就输入.\startup.cmd -m standalone进行启动,默认用户名和密码都是nacos
-
打开对应的微服务项目,在父工程中添加spring-cloud-alibaba的管理依赖
-
<!--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>
-
在子工程中添加nacos的客户端依赖
-
<!--nacos客户端依赖包--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
在子工程中的appication.yml文件中配置信息
-
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务地址
2.服务多级存储模型
-
服务尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不访问时再去访问其他集群
-
spring: cloud: nacos: server-addr: localhost:8848 # nacos服务地址 discovery: cluster-name: SH #集群名称
-
配置完成后点击服务详情
-
-
3.负载均衡
-
默认是轮询的负载均衡规则
-
修改application.yml文件,修改负载均衡的规则,优先选择本集群,再进行随机选择
-
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
4.服务实例的权重设计
- Nacos控制台可以设置实例的权重值,0-1之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为0则完全不会被访问
- 当我们想对应用进行版本升级的时候,可以将一个实例的权重设置为0,然后进行升级,先给予0.001(较小的权重)用于测试升级版本的稳定性,再逐渐放大权重占比
5.环境隔离
- namespace用来做环境隔离
- 每个namespace都有唯一id
- 不同namespace下的服务不可见
实现流程
-
新建命名空间
-
-
在对应的application.yml文件中添加namespace
-
cloud: nacos: server-addr: localhost:8848 # nacos服务地址 discovery: cluster-name: HZ namespace:
6.nacos注册中心原理
-
服务提供者分为临时实例和非临时实例
-
临时实例采用心跳监测,检测不到,直接去除掉
-
非临时实例主动发请求,若服务提供者挂掉了,会视为不健康状态,会等待修复
-
nacos主动推送变更信息push,检测消费者
配置临时实例和非临时实例流程
- 在application.yml文件中添加ephemeral配置
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: HZ
namespace: 4a6fe0e3-8a0f-40a9-b55d-a59e0914d2af
ephemeral: false # 是否是非实例
7.Nacos配置管理
7.1添加配置
-
打开Nacos
-
-
右边加号进行添加配置
-
新建配置注意事项
- Data ID不能唯一,一般命名规则为 服务器实例名称+开发环境+后缀
- 配置格式,目前支持YAML和Properties,通常选择TAML,这个我们经常叫yml,但在第一条注意事项中后缀要写yaml
- 配置内容只需要写类似于开关的配置信息,例如:是否为临时实例等,像数据库的连接这些就没必要进行添加
-
7.2配置拉取
-
获取的步骤
-
-
引入Nacos的配置管理客户端依赖
-
<!--nacos的配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
建立bootstrap.yml文件
-
spring: application: name: userservice profiles: active: dev #环境 cloud: nacos: server-addr: localhost:8848 # nacos地址 config: file-extension: yaml # 文件后缀名
-
删除application.yml和bootstrap.yml相同的配置
-
测试
-
在Controller中添加代码获取配置
-
@Value("${pattern.dateformat}") private String dateformat; @GetMapping("now") public String now() { return LocalDateTime.now().format( DateTimeFormatter.ofPattern(dateformat, Locale.CHINA) ); }
-
启动后访问对应的地址
-
-
于我们在Nacos中添加的配置对应–成功
-
pattern: dateformat: yyyy-MM-dd HH:mm:ss
8.实现热更新
Nacos中的配置文件变更后,微服务无需重启就可以感知
-
方式一
-
在@Value注入的变量所在类上添加注解@RefreshScope
-
当我们修改配置的时候,查看控制会出现,检测到配置修改的日志
-
09-24 11:30:57:696 INFO 8564 --- [-localhost_8848] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848] [data-received] dataId=userservice-dev.yaml, group=DEFAULT_GROUP, tenant=null, md5=c6e896e251552a493dbf917a13552d76, content=pattern: dateformat: yyyy年MM月dd日 HH:mm:ss, type=yaml
-
方式二
-
新建立配置文件Config.PatternProperties并添加配置
-
package cn.itcast.user.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "pattern") public class PatternProperties { // 你定义prefix的值加上你设置的变量的值和Nacos中一样即可 private String dateformat; }
-
在Controller添加配置
-
// 注入 @Autowired private PatternProperties properties; @GetMapping("now") public String now() { return LocalDateTime.now().format( DateTimeFormatter.ofPattern(properties.getDateformat(), Locale.CHINA) ); }
-
更推荐使用第二种方式
9.多环境配置共享
试想一个问题:如果当我们想添加一个配置,所有配置文件中相同的,难道我们要都写一份吗?当我们想修改一个配置的时候,我们难道要将所有的配置文件都修改一遍吗?
答案当然是不用
我们可以配置环境共享文件
-
在Nacos中添加配置文件
-
-
在Config.PatternProperties中添加private String envShardValue;
-
在Controller中新添加接口
-
@Autowired private PatternProperties properties; @GetMapping("prop") private PatternProperties properties() { return properties; }
-
测试成功,拿到了共享配置中的配置
-
-
配置文件的优先级:服务名-profile.yaml > 服务名称.yaml > 本地配置