Nacos注册功能

  • Nacos参考文档:https://nacos.io/zh-cn/docs/quick-start.html
  • Nacos是SpringCloudAlibaba推出的一个注册中心,个人认为其功能十分强大。与Eureka不同的是,Nacos并不需要独立的创建一个服务,其本身就是一个Springboot服务,直接下载安装解压就可以了

 1.依赖引入

<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>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

 2. 配置编写

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848 //Nacos默认端口为8848,此处为Nacos的服务地址

完成上面两步,启动项目,打开nacos的可视化页面(ip+端口/nacos;例如localhost:8848/nacos;账号密码默认为nacos)就可以发现相关服务已经注册到Nacos中了 


分级存储模型

一个服务可以有多个实例,例如我们的用户功能,有三个实例,且分布在不同的机房:

  • 127.0.0.1:8081,在上海机房
  • 127.0.0.1:8082,在上海机房
  • 127.0.0.1:8083,在杭州机房

Nacos就将同一机房内的实例,划分为一个集群

微服务互相访问时,应该尽可能访问同集群实例(需要配置负载均衡规则NacosRule),因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:杭州机房内的 order-service 应该优先访问同机房的 user-service。

配置集群

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称 HZ杭州

假设配置了两个HZ集群,一个SH集群,查看 nacos 控制台:

 NacosRule负载设置

Ribbon的默认实现 ZoneAvoidanceRule 并不能实现根据同集群优先来实现负载均衡,我们把规则改成 NacosRule 即可。例如:我们是用订单服务 调用 用户服务,那我们只需在订单服务中配置规则。配置成功后,订单服务会优先调用同集群的服务,当同集群中没有该服务时,会在控制台弹出相关警告,并访问其他集群的服务

第一种方式:

@Bean
public IRule iRule(){
    //默认为轮询规则,这里自定义为随机规则
    return new NacosRule();
}

第二种方式:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则 

权重配置

实际部署中会出现这样的场景:

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。但默认情况下 NacosRule 是同集群内随机挑选,不会考虑机器的性能问题。

因此,Nacos 提供了权重配置来控制访问频率0~1 之间,权重越大则访问频率越高,权重修改为 0,则该实例永远不会被访问。

在 Nacos 控制台,找到 相关的实例列表,点击编辑,即可修改权重。

在弹出的编辑窗口,修改权重

另外,在服务升级的时候,有一种较好的方案:我们也可以通过调整权重来进行平滑升级

例如:userservice服务有三个实例分别为userservice1、userservice2、userservice3。当服务需要升级时,可以先将uservice1的权重调节为 0,让用户先流向 userservice2、userservice3,成功升级 userservice1后,再把权重从 0 调到 0.1,让一部分用户先体验,当用户体验稳定后,就可以往上调权重了。

环境隔离(为了做数据和服务的管理提出的概念)

Nacos 提供了 namespace 来实现环境隔离功能。

  • Nacos 中可以有多个 namespace
  • namespace 下可以有 group、service 等
  • 不同 namespace 之间相互隔离,例如不同 namespace 的服务互相不可见

创建namespace 

默认情况下,所有 service、data、group 都在同一个 namespace,名为 public(保留空间):

我们可以点击页面新增按钮,添加一个 namespace:

然后,填写表单:

就能在页面看到一个新的 namespace:

配置namespace

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间ID

重启 order-service 后,访问控制台。

public

dev

 此时访问 order-service,因为 namespace 不同,会导致找不到 userservice,控制台会报错:

临时实例与非临时实例

Nacos 的服务实例分为两种类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

配置一个服务实例为永久实例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos于Eureka对比

共同点:

  1. 都支持服务注册和服务拉取
  2. 都支持服务提供者心跳方式做健康检测

不同点:

  1. Nacos支持服务端主动检测提供者状态,临时实例采用心跳模式,非临时实例采用主动检测模式
  2. 临时实例心跳不正常会被Nacos从服务列表中剔除,非临时实例则不会被剔除
  3. Nacos支持服务列表变更的消息推送模式,服务列表更新更及时;Eureka只支持定时拉取
  4. Nacos集群默认采用AP方式,当集群中存在非临时实例时采用CP模式;Eureka采用AP模式 

 注:本文参考于微服务技术栈 - 乐心湖's Blog | 技术小白的技术博客


版权声明:本文为weixin_44141870原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。