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
。
我这里创建了一个名叫dev
的namespace
。
注意:
除了dev
还有一个public
保留空间,这是Nacos
默认的namespace
。
意思就是,在没有主动给服务设置命名空间的情况下,服务都放在public
命名空间下。
观察服务列表:
观察服务列表发现,这里已经可以看到public
和dev
两个命名空间了
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
流程图:
-
Nacos
与Eureka
的共同点- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
-
Nacos
与Eureka
的区别-
Nacos
支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式 -
临时实例心跳不正常会被剔除,非临时实例则不会被剔除
-
Nacos
支持服务列表变更的消息推送模式,服务列表更新更及时 -
Nacos
集群的一致性协议默认采用AP
方式,当集群中存在非临时实例时,采用CP
模式;Eureka
采用AP
方式,不支持切换
-
关于AP
和CP
的解释(拓展内容):
CAP
定理,又被称作布鲁尔定理。
它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
A :可用性
Availability
:每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据
C:可靠性
Consistency
: 等同于所有节点访问同一份最新的数据副本
P:分区容错性
Partition tolerance
:系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择)
因此分布式集群的一致性协议一般都采用CP
或者AP
AP
侧重可用性
CP
侧重可靠性,一致性
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116502.html