Nacos
链接:https://pan.baidu.com/s/1Ct6upj-kpLuVwyNpk_3KMw
提取码:yyac
目录
一.Nacos
1.1认识Nacos
1.2安装Nacos
1.2.1下载安装包
1.2.2解压到任意非中文目录
1.2.3介绍
1.2.4启动
1.2.5访问
1.3服务注册到Nacos
1.3.1在cloud-demo父工程中添加spring-cloud-alibaba的管理依赖
1.3.2注释掉order-service和user-service中原有的eureka依赖
1.3.3添加nacos的客户端依赖
1.3.4服务注册到Nacos
1.3.5启动测试
1.3.6小结
1.4Nacos服务分级存储模型
1.4.1服务跨集群调用问题
1.4.2服务集群属性
1.4.3根据集群负载均衡
1.5环境隔离 namespace
1.6临时实例和非临时实例
1.6.1Eureka和Nacos共同点与区别
1.7配置管理
1.7.1统一配置管理
1.8多环境配置共享
一.Nacos
1.1认识Nacos
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
1.2安装Nacos
本次我们在windows环境下采取单机安装的方法
1.2.1下载安装包
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: GitHub主页:https://github.com/alibaba/nacos GitHub的Release下载页:https://github.com/alibaba/nacos/releases或者可以在文章顶部我给的链接中下载Nacos
1.2.2解压到任意非中文目录
目录说明: - bin:启动脚本 - conf:配置文件
1.2.3介绍
Nacos的默认端口是8848,注意不要被占用了,如果占用了,可以到nacos的conf目录下application.properties修改端口
1.2.4启动
启动比较简单,进入bin目录下,运行命令
startup.cmd -m standalone #单机启动
1.2.5访问
浏览器输入 http://localhost:8848/nacos
默认用户名密码都为nacos
1.3服务注册到Nacos
书接上文=》【SpringCloud复习巩固】微服务+Eureka+Ribbon_九洲带鱼的博客-CSDN博客
1.3.1在cloud-demo父工程中添加spring-cloud-alibaba的管理依赖
注意是在【dependencyManagement】标签下,如果爆红,可以拖到【denpendencies】下先加载一次再放到【dependencyManagement】标签下
<!--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>
1.3.2注释掉order-service和user-service中原有的eureka依赖
注意yaml中有关eureka的配置也注释掉
1.3.3添加nacos的客户端依赖
<!--nacos客户端依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
1.3.4服务注册到Nacos
修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址
spring: cloud: nacos: server-addr: localhost:8848 #nacos服务地址
1.3.5启动测试
1.3.6小结
Nacos服务搭建:下载安装包、解压、在bin目录下运行指令:startup.cmd -m standalone
Nacos服务注册或发现
引入nacos.discovery依赖、配置nacos地址spring.cloud.nacos.server-addr
1.4Nacos服务分级存储模型
示例图(提供个思路):
1.4.1服务跨集群调用问题
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
本地集群不可访问时,再去访问其它集群
1.4.2服务集群属性
①修改application.yml,添加如下内容(我修改了orderservice来做测试):
spring: cloud: nacos: server-addr: localhost:8848 #nacos服务地址 discovery: cluster-name: HZ #配置集群名称,也就是机房位置,例如HZ就是杭州
②重启,访问,查看Nacos控制台
③小结
Nacos服务分级存储模型
一级是服务,例如userservice
二级是集群,例如杭州或上海
三级是实例,例如杭州机房的某台部署了userservice的服务器
如何设置实例的集群属性
修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即
1.4.3根据集群负载均衡
1.使用NacosRule
①启动多个userservice实例,这些实例都设置集群属性到一个地方,例如HZ
②然后在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则
NacosRule负载均衡策略
优先选择同集群服务实例列表
本地集群找不到提供者,才去其它集群寻找,并且会报警告
确定了可用实例列表后,再采用随机负载均衡挑选实例
2.根据权重负载均衡
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
①在Nacos控制台可以设置实例的权重值,首先选中实例后面的编辑按钮
②将权重设置为0.1,测试可以发现8081被访问到的频率大大降低
③小结
实例的权重控制
Nacos控制台可以设置实例的权重值,0~1之间
同集群内的多个实例,权重越高被访问的频率越高
权重设置为0则完全不会被访问
1.5环境隔离 namespace
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
在Nacos控制台可以创建namespace,用来隔离不同环境
保存后会在控制台看到这个命名空间的id:
修改order-service的application.yml,添加namespace,如下图,添加这行即可更改命名空间:
重启order-service,再访问nacos就可看到多了一个命名空间,但这时访问orderservice的接口,会报错,提示找不到userservice,因为二者不在同一个命名空间
Nacos环境隔离
每个namespace都有唯一id
服务设置namespace时要写id而不是名称
不同namespace下的服务互相不可见
1.6临时实例和非临时实例
服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:
spring: cloud: nacos: server-addr: localhost:8848 #nacos服务地址 discovery: cluster-name: HZ # namespace: 210153fd-98d3-4f0d-8d81-1d9cf9d80633 #dev环境 ephemeral: false #是否是临时实例
临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
1.6.1Eureka和Nacos共同点与区别
Nacos与eureka的共同点
都支持服务注册和服务拉取
都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别
Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
临时实例心跳不正常会被剔除,非临时实例则不会被剔除
Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
1.7配置管理
1.7.1统一配置管理
①进入Nacos控制台添加配置信息
步骤图:
②在userservice中引入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 cloud: nacos: server-addr: localhost:8848 #nacos地址 config: file-extension: yaml
对应的,把之前application.yaml中重复的信息删除
④我们在user-service中将pattern.dateformat这个属性注入到UserController中做测试:
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope #热更新
public class UserController {
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("/now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
⑤重启userservice,访问http://localhost:8081/user/now 看是否生效
看到配置生效
⑥小结
将配置交给Nacos管理的步骤
在Nacos中添加配置文件
在微服务中引入nacos的config依赖
在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件
⑦自动刷新(热更新)
上面我们在controller上添加了@RefreshScope
其实一共有两种方法可以完成配置
方式一:在@Value注入的变量所在类上添加注解@RefreshScope
方式二:使用@ConfigurationProperties注解
第二种方式,需要新建一个类来进行接收
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
private String envSharedValue;
}
然后注入到controller里进行使用
@Slf4j
@RestController
@RequestMapping("/user")
//@RefreshScope
public class UserController {
@Autowired
private PatternProperties patternProperties;
@GetMapping("/now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
}
@GetMapping("/prop")
public PatternProperties properties(){
return patternProperties;
}
配置完成以后,我们修改nacos里的配置文件,发布,然后无需重启访问看效果
注意事项:
不是所有的配置都适合放到配置中心,维护起来比较麻烦
建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
1.8多环境配置共享
微服务启动时会从nacos读取多个配置文件:
[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
[spring.application.name].yaml,例如:userservice.yaml
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
①在Nacos控制台新建一个userservice.yaml
②访问http://localhost:8081/user/prop看效果
优先级
③小结
微服务会从nacos读取的配置文件:
[服务名]-[spring.profile.active].yaml,环境配置
[服务名].yaml,默认配置,多环境共享
优先级:
[服务名]-[环境].yaml >[服务名].yaml > 本地配置
集群管理以及配置文件等的持久化下节再讲