HM-SpringCloud微服务系列1.6【Nacos注册中心】
1 认识和安装nacos
1-1 nacos介绍
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
官网:https://nacos.io/zh-cn/index.html
源码:https://github.com/alibaba/nacos/
SC: https://spring.io/projects/spring-cloud-alibaba
1-2 下载安装
安装包下载https://github.com/alibaba/nacos/releases
解压到任意非中文目录下即可
1-3 端口配置
1-4 启动
win环境下的nacos单机启动命令:startup.cmd -m standalone
(后续可能涉及集群启动)
1-5 访问
2 服务注册到nacos
Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。
主要差异在于:
- 依赖不同
- 服务地址不同
2-1 引入依赖
2-1-1 父工程
在cloud-demo父工程的pom文件中的
中引入SpringCloudAlibaba的依赖:
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.6.RELEASE
pom
import
2-1-2 客户端
然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
记得注释掉eureka依赖
2-2 配置nacos地址
在user-service和order-service的application.yml中添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848
记得注释掉eureka配置
2-3 启动微服务&登录nacos
注意:要
startup.cmd -m standalone
开启nacos服务,不然启动微服务时报错
启动成功后清空UserApplication和UserApplication服务的控制台日志信息
依次访问
http://localhost:8080/order/101
http://localhost:8080/order/102
http://localhost:8080/order/103
http://localhost:8080/order/104
3 服务分级存储模型
3-1 模型&调度问题
3-2 服务集群属性
给user-service配置集群,模拟跨集群部署微服务
首先再次复制一个user-service服务(将UserApplication复制为UserApplication3),并配置属性:
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
3-3 同集群优先的负载均衡(根据集群负载均衡,集群负载均衡策略)
默认的ZoneAvoidanceRule
并不能实现根据同集群优先来实现负载均衡。
因此Nacos中提供了一个NacosRule
的实现,可以优先从同集群中挑选实例。
1)给order-service配置集群信息
修改order-service的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名称
此时,8080和8081 8082都在杭州集群,8083则在上海集群
清空UserApplication & UserApplication2 & UserApplication3的控制台日志信息
依次访问
http://localhost:8080/order/101
http://localhost:8080/order/102
http://localhost:8080/order/103
可以看出OrderService在发起远程调用时并没有有限考虑同集群的实例(实际上依然采用的是之前设置的随机策略,默认是轮询负载均衡策略)
2)修改负载均衡规则
修改order-service的application.yml文件,修改负载均衡规则:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
清空UserApplication & UserApplication2 & UserApplication3的控制台日志信息
依次访问
http://localhost:8080/order/101
http://localhost:8080/order/102
http://localhost:8080/order/103
http://localhost:8080/order/104
可以看出,8080-OrderService优先调用了同集群的实例(8081-UserApplication和8082-UserApplication2),且8081和8082之间是被随机调用的
停掉UserApplication & UserApplication2
依次访问订单101 102 103
老师演示:
本地实测:
警告信息:跨集群调用
想访问clusterName = HZ集群,实际访问clusterName='SH'集群
01-10 15:08:37:506 WARN 10592 --- [nio-8080-exec-3] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = HZ, instance = [Instance{instanceId='192.168.2.104#8083#SH#DEFAULT_GROUP@@userservice', ip='192.168.2.104', port=8083, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
4 权重配置(根据权重负载均衡)
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。
因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
启动UserApplication & UserApplication2
在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:
在弹出的编辑窗口,修改权重:
注意:如果权重修改为0,则该实例永远不会被访问
此处假设8081是一台老机器性能较差,8082则是新机器性能较强,将8081的权重调低点(0.1,即8082:8081=10:1)
清空UserApplication & UserApplication2 & UserApplication3的控制台日志信息
浏览器访问101订单11次(后10次刷新即可)
将8081的权重调低至0
清空UserApplication & UserApplication2 & UserApplication3的控制台日志信息
浏览器访问101订单11次(可以发现8080一直都是在调用8082,8081一次也没被调用)
权重应用:系统版本升级可以实现平滑升级,用户体验友好,不影响系统正常使用;也可以做一部分用户内测等
5 环境隔离
环境隔离实质就是服务隔离
5-1 课件
5-2 实操
清空OrderApplication的控制台服务启动日志信息
访问http://localhost:8080/order/101
可以看出,环境隔离生效了
6 Nacos与Eureka的区别
6-1 nacos注册中心原理
Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:
6-2 临时实例与非临时实例
Nacos的服务实例分为两种类型:
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
默认&常用:临时实例
idea停止OrderApplication服务
idea启动OrderApplication服务
6-3 Nacos与Eureka的异同
- Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
- Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式