🔖 Eureka 可以做注册中心【https://github.com/Netflix/eureka】
🔖 但它的功能比较少,仅仅注册中心
🔖 nacos 也可做注册中心,且功能更加丰富【https://nacos.io/】
一、了解 Nacos
✏️ Nacos 是阿里巴巴的产品,也是 SpringCloud 中的一个组件
✏️ 相比 Eureka 而言,它的功能更加丰富,在国内受欢迎程度较高
✏️ Nacos 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
📝 Nacos 文档:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
二、安装 Nacos
(1) 下载和安装
✏️ 在 Nacos 官方网站下载好 Nacos 的安装包(Windows 版本和 Linux 版本)【下载地址:https://github.com/alibaba/nacos/tags】
✏️ 解压
解压后的目录结构:
双击
startup.cmd
会报错(进入该文件夹的 dos 窗口)
(2) 启动
🔖 windows 单击启动命令:startup.cmd -m standalone【-m
是 mode(模式)的意思】
🔖 默认账号和密码是 nacos
三、Nacos 注册中心
(1) 父工程添加管理依赖
🔖 父工程添加
spring-cloud-alibaba
的管理依赖
<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>
(2) nacos 客户端依赖和配置
🔖 nacos 和 eureka 不一起使用
🔖 微服务添加 nacos 客户端依赖
🔖 微服务添加 nacos 配置(在 yaml 文件中)
<!-- nacos 客户端依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
spring: cloud: nacos: server-addr: localhost:8848 # 配置 nacos 服务地址
🔋 之前使用 eureka 的时候还要手动创建一个 eureka 服务
🔋 所以存在 eureka 的服务端
🎄 nacos 本身就是一个服务,默认端口 8848
🎄 不用像 eureka 一样手动创建一个服务
四、Nacos 服务分级存储模型
🖼️ 服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
🖼️ 本地集群不可访问时,再去访问其它集群
Nacos 服务分级存储模型
⌚ 一级是服务(如 userservice)
⌚ 二级是集群(如把 userservice 的不同实例部署在杭州和上海集群)
⌚ 三级是实例(如杭州机房的某台服务器部署了 userservice 服务)
Nacos 服务的集群属性是什么?
Nacos 设置服务实例的集群属性?
spring: cloud: nacos: server-addr: localhost:8848 # nacos 的客户端依赖 discovery: cluster-name: RiBen # 设置集群属性
五、NacosRule 负载均衡
🖼️ 应尽可能调用本地集群的服务,当本地集群不能访问的时候再去访问其他集群的服务(跨集群调用延迟较高)
# 该微服务向 userservice 发送请求的时候优先访问同一集群的, 当同一集群没有的时候才访问其他集群的 userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule spring: application: name: orderservice cloud: nacos: server-addr: localhost:8848 # nacos 服务地址 discovery: cluster-name: GuiZhou
跨集群调用的警告:
03-07 23:04:15:004 WARN 10108 --- [nio-8080-exec-7] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = GuiZhou, instance = [Instance{instanceId='192.168.80.1#8082#RiBen#DEFAULT_GROUP@@userservice', ip='192.168.80.1', port=8082, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='RiBen', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}] 03-07 23:04:16:388 WARN 10108 --- [nio-8080-exec-8] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = GuiZhou, instance = [Instance{instanceId='192.168.80.1#8082#RiBen#DEFAULT_GROUP@@userservice', ip='192.168.80.1', port=8082, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='RiBen', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
🎁 NacosRule【
com.alibaba.cloud.nacos.ribbon.NacosRule
】负载均衡策略:🍍 ① 优先选择同集群的服务实例访问
🍍 ② 当本地集群找不到服务提供者的时候才会去其他集群找服务提供者(当跨集群访问的时候会报警告)
🍍 ③ 确定了可用实例列表后,再采用随机负载均衡策略挑选实例进行访问
六、Nacos 服务实例的权重设置
🍎 实际部署中会出现下面的场景:
🍎 服务器设备性能有差异。一些实例所在机器性能较好,一些实例所在机器性能较差。可通过设置实例权重让性能好的机器所在的服务实例承担更多的用户请求,性能差的机器所在实例承担的用户请求少一些
🍎 Nacos 提供了实例权重配置来控制访问频率,权重越大则访问频率越高
🍒 Nacos 控制台可以设置实例的权重值(0 ~ 1之间)
🍒 同集群内的多个实例,权重越高被访问的频率越高
🍒 权重设置为0时完全不会被访问
七、环境隔离 namespace
🍓 Nacos 中服务存储和数据存储的最外层都是一个名为 namespace 的东西,用来做最外层隔离
🍓 每个 namespace 都有唯一 id
🍓 服务设置 namespace 时要写 id 而不是名称
🍓 不同 namespace 下的服务互相不可见
🍓 可在 Nacos 控制台创建 namespace,用来隔离不同环境
spring: cloud: nacos: server-addr: localhost:8848 # nacos 服务地址 discovery: cluster-name: GuiZhou namespace: b37ab417-efc2-49e5-b47b-7b9171cd800d # 命名空间的 id
不同命名空间之间的服务互相不可见