Nacos2.1.1常用特性以及和Eureka的区别

导读:本篇文章讲解 Nacos2.1.1常用特性以及和Eureka的区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Nacos2.1.1常用特性以及和Eureka的区别

一、服务分级存储模型

1.1 概述

一个服务可以有多个实例,比如对于一个服务userService,它又三个实例:

127.0.0.0:80	位于广州	
127.0.0.0:81	位于广州
127.0.0.0:82	位于杭州

Nacos就可以把一个地区中的实例,划分为一个集群。

因此userService作为服务,一个服务可以有多个集群,每个集群下又有多个服务的实例。

由此形成Nacos分级模型:

在这里插入图片描述

当微服务互相访问时,要尽可能访问同集群实例,因为本地访问速度更快。

当本地集群内不可用时,再去访问其它集群。

1.2 在一个服务实例的application.yml配置集群的方式

在服务提供者端配置:

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        cluster-name: GZ 	# 设置当前服务实例的集群名称为广州

通过上面的配置,cluster-name相同的服务,就属于相同集群中的服务。

注意点是:

  • ​ 这个集群就是Nacos中对服务分级的一种概念,并不是微服务中传统集群概念。

1.3 负载均衡策略–同集群优先的配置

在服务消费者端配置(假设使用的是Ribbon作为负载均衡器):

userservice:
  ribbon:
   # 负载均衡规则--同集群优先--由nacos中的NacosRule类来作为负载均衡的实现
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

二、服务的权重配置

场景:

微服务架构通常会涉及到多态服务器,因此有时可能会面临这样的问题:

各台服务器之间的性能有较大差异,有些服务器新,性能较好,而有些是祖传设备,性能较差。

让性能较差的服务器承担和性能较好的服务器相同的请求压力,显然是不合理的。

并且默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。

解决方案:

使用Nacos提供的权重配置来控制访问频率。

让性能好的服务器承担更多的请求压力,而性能较差的服务器,承担更少的请求压力。

在这里插入图片描述

在这里插入图片描述

注意点:如果权重修改为0,那么该实例永远不会被访问。

利用这一点可以悄无声息的实现服务的更新。

因为在项目部署起来后,为了不影响用户的使用,直接把服务停机再去做版本升级是不行的。

但是可以把要升级的服务中的一部分实例,访问权重先调整为0,让后等这部分服务不承担请求后。

对它们停机升级。升级完成后重启服务。

再把新部署的服务权重从0.1开始,慢慢增加新部署的服务实例的权重,观察是否出现问题。

如果没什么问题,就可以把权重恢复成关机之前的样子。再按相同的方式更新其它服务实例。

从而实现优雅的平滑升级。并且也不需要大半夜加班去搞,白天就可以完成。从而保护程序员的身体。

作用小结:

1.可以充分利用服务器的资源
2.在有服务集群的环境下,可以在不停止服务的情况下,平实现滑升级

三、服务环境隔离

场景:

当多个不同的项目组共用一个Nacos或者一个Nacos集群时。

如果凑巧;两个项目组都有一个服务叫做userService。问题就来了。

这样可能会导致自己的项目模块调用到别的项目组中的userService,造成项目异常。

上面这个问题,只是需要基于业务环境去划分服务。

可能还会需要依据生产环境,开发环境等去划分和管理服务。

解决方案:

可以使用Nacos提供的namespace来实现环境隔离。

相关结构如下:

  • Nacos中可以有多个namespace
  • namespace下可以有group(组)、service(具体服务)等。
  • 不同namespace之间相互隔离,不同namespace中的服务互相不可见。

对于group,可以把同一个namespace下的相关比较密切的服务放到同一个组下面。

3.1 如何创建一个namespace

在这里插入图片描述

进入Nacos首页,点击右上角新建命名空间。即可创建一个namespace

我这里创建了一个名叫devnamespace

注意:

除了dev还有一个public保留空间,这是Nacos默认的namespace

意思就是,在没有主动给服务设置命名空间的情况下,服务都放在public命名空间下。

观察服务列表:

在这里插入图片描述

观察服务列表发现,这里已经可以看到publicdev两个命名空间了

3.2 给微服务配置namespace

给微服务配置namespace是不能在Nacos控制台实现的,只能修改application.yml配置来实现。

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        # 当前服务的命名空间配置,填写命名空间的ID,这里我天dev的命名空间ID
        namespace: 	37d65310-0575-4062-ae64-82692a4b82c7

配置成功后,重启服务。

Nacos即可看到当前服务跑到了dev命名空间下,public命名空间下就找不到这个服务了。

从此这个服务和public命名空间下的服务就是两个世界的人了。

谁也无法影响到对方。

四、Nacos的临时实例和非临时实例

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

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,是默认的实例类型。

  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

在服务的application.yml配置一个服务实例为永久实例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false 	# 设置为当前服务为Nacos非临时实例

五、拓展Nacos与Eureka的区别

Eureka流程图:
在这里插入图片描述

Nacos流程图:
在这里插入图片描述

  • NacosEureka的共同点

    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • NacosEureka的区别

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式

    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除

    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

    • Nacos集群的一致性协议默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式,不支持切换

关于APCP的解释(拓展内容):

CAP定理,又被称作布鲁尔定理。

它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

A :可用性

  • Availability:每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据

C:可靠性

  • Consistency: 等同于所有节点访问同一份最新的数据副本

P:分区容错性

  • Partition tolerance:系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择)

因此分布式集群的一致性协议一般都采用CP或者AP

AP侧重可用性

CP侧重可靠性,一致性

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116502.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!