在Nacos中,数据模型的相关概念包括namespace、group、services和dataId。
这些概念在Nacos中的组织结构和管理方式,可以帮助用户更好地进行配置管理和服务注册与发现。
在Nacos中,默认情况下,所有的服务(services)、配置(data)和分组(group)都在同一个Namespace中,该Namespace的名称为public。这意味着默认情况下,所有的服务和配置都在同一个命名空间下进行管理和隔离。
找到命名空间菜单:
命名空间不填默认会自动生成,填写完,点击确定按钮。
可以看到,页面里已经创建好了一个新的namespace。
这里可以先看下这篇文章:Spring Cloud Alibaba 整合 Nacos 实战
5.3.1 消费者 consumer 默认处于public命名空间:
5.3.2 provider修改yml配置:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: c431c2a3-91bc-40ed-a99c-6fe856ac1e7d
5.3.3 启动provider 对应namespace如下:
5.3.4 consumer向provider发起调用:
控制台报错如下:
因为namespace不同,会导致consumer找不到provider
在分布式系统中,实例之间的关系可以分为以下几个级别:
每个实例都属于同一个服务,即 consumer 服务。
多个实例可以组成一个集群。
例如consumer-1、consumer-2和consumer-3 可以组成一个consumer-service集群。
127.0.0.1:8101 # 北京机房
127.0.0.1:8102 # 上海机房
127.0.0.1:8103 # 上海机房
如果实例分布在不同的区域或数据中心,可以将它们划分为不同的区域级别。
例如,consumer-1和 consumer-2 部署在北京机房,而consumer-3 部署在上海。
服务分级模型如下:
在微服务相互访问时,最好优先访问同一集群的实例,因为本地访问速度更快。仅当本集群不可用时,才考虑访问其他集群的实例。
例如:北京机房的consumer服务应该优先调用北京同机房的provider服务,在调不通的情况下才应该去访问上海机房的provider服务。
接下来,给consumer配置不通集群
在Nacos中,可以通过配置 cluster-name 属性 来指定集群的名称。可以将同一机房内的实例都配置相同的集群名称,这样它们就会被认为是同一个集群的成员。
修改yml如下:
spring:
application:
name: consumer #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
cluster-name: SH
此时启动,三个consumer对应实例,打开nacos控制台的服务列表:
点击详情,可以看到consumer有两台在上海集群,一台在北京:
Nacos中的服务权重功能可以帮助解决一些问题,包括服务升级和服务选择。
当系统需要进行服务升级或者版本迭代时,可以通过设置服务的权重来实现平滑的升级过程。例如,如果要升级一个服务的新版本,可以先将新版本的实例的权重设置为较低的值,然后逐步提高权重,同时降低旧版本实例的权重,实现新旧版本的平滑过渡。
通过设置不同实例的权重,可以实现对不同实例的选择和分配。例如,可以将某些性能更好或者资源更充足的实例设置较高的权重,从而使得请求更有可能被路由到这些实例上。这样可以实现负载均衡和资源优化,提高系统的性能和可用性。
通过Nacos的权重功能,可以灵活地控制和调整服务的权重,以满足不同场景和需求。这为服务的管理和运维提供了更多的控制和灵活性。
在nacos控制台,找到 consumer 服务的实例列表,点击编辑,即可修改权重:
通过consumer 调用 provider 则该实例永远不会被访问,报错如下:
权重为 0 表示该实例的服务不可用或不参与负载均衡,因此请求不会被路由到该实例上。
默认nacos就是临时实例,临时实例是指在服务注册后,当实例下线或者断开连接时,Nacos会立即将其从服务列表中删除。
这意味着临时实例在下线后不会被其他服务调用。
与之相对的是持久化实例,持久化实例在下线后仍然会保留在服务列表中,其他服务仍然可以调用它。
在Nacos中,可以通过配置来指定实例是临时实例还是持久化实例。
修改yml文件中ephemeral属性为false :
spring:
cloud:
nacos:
discovery:
ephemeral: false
观察consumer的临时实例 已经变为了 false