前言

版本选择:

spring-boot:2.3.2.RELEASE

spring-cloud:Hoxton.SR8

spring-cloud-alibaba:2.2.3.RELEASE

博客前瞻:

springcloud-alibaba-nacos(1)nacos组件功能介绍与下载安装

springcloud-alibaba-nacos(2)nacos启动,解决启动报错问题

springcloud-alibaba-nacos(3)nacos数据持久化到数据库

springcloud-alibaba-nacos(4)nacos作为注册中心

springcloud-alibaba-nacos(5)nacos作为配置中心


在前边注册中心以及配置中心使用篇,我截图中已然出现了命名空间namespace以及分组group的身影了!

image-20201219154421264

image-20201219154440268

从上方截图中可以发现Nacos默认设置了一个命名空间为public,默认分组为DEAULT_GROUP

那么,究竟什么是命名空间,什么是分组,它们有什么作用呢???请看下文


一、Nacos的命名空间

什么是命名空间

命名空间,即namespace,namespace是nacos针对于企业级开发设计用来针对于不同环境的区分,比如正在企业开发时有测试环境,生产环境,等其他环境,为了保证不同环境配置实现隔离,提出了namespace的概念!

nacos中存在一个默认的命名空间public,所有配置以及服务注册,在没有指定命名空间时都会默认从public这个命名空间拉取配置以及注册到该命名空间下的注册表中!!!

  • 下图,便是Nacos默认的命名空间public

image-20201219165158533

  • 查看我们之前服务注册表,以及配置列表,发现其都在public这个命名空间之下

image-20201219165451895

image-20201219165505192

我们在开发中呢,则可以根据不同的需求,定义不同的命名空间,然后将我们的服务注册到不同的命名空间,以及从指定命名空间中拉取配置文件…


如何理解命名空间

其实很好理解:

为什么要使用命名空间?答:环境隔离

举个贴切的例子:

​ 一个超市,内部有很多区域对吧!比如零售休闲区瓜果蔬菜区生鲜区等等,顺着超市路标指引,我们如果买鱼,直接去生鲜区即可,我们买零食,直接去零食休闲区即可,买个东西无需在超市乱窜…这种区域划分呢,便是物以类聚,环境隔离的思想!!!

​ 我们nacosnamespace思想就如同超市中不同大类型的划分区域,有了namespace我们可以轻松实现环境隔离,比如devtest

说个目前实际开发多环境面临的问题:

​ 我们公司由于客户的特殊性以及特殊需求,有了大地区供应商的概念,例如四川总运营商、山西总运营商等等,这些客户由于要求对于他们的个别服务需要独立部署!于是呢出现了某些请求不同不调用不同的网关,将请求转发路由到对应的服务… 这个时候呢,使用命名空间是极好的!!!

命名空间的使用

演示前,我们关闭掉所有的服务,删除所有的配置,一切从0开始!!

image-20201219172431405

image-20201219172524318

(1)创建命名空间

我们需要进入nacos控制台命名空间菜单栏,然后根据需求,创建命名空间

例如,我这里创建一个名为:sichuan的命名空间

image-20201219172725581

image-20201219172842657

命名空间ID,可以自定义,亦可不填使其按照自身规则生成

image-20201219172935241

这样,命名空间便创建好了!!我们再进入服务列表或者配置列表,发现便会多一个sihchuan的table

image-20201219173336302

(2)在新建命名空间中添加配置文件

image-20201219173739305

image-20201219174200784

(3)项目中配置命名空间

命名空间一旦创建,则可指定项目启动时是否从该命名空间拉取配置,以及是否注册到该命名空间…

我这下边,即指定了注册中心命名空间也指定了配置中心命名空间,那么其便会注册到sichuan1以及从sichuan中拉取配置…

server:
  port: 30020
spring:
  application:
    #指定当前服务名字
    name: app-login
  cloud:
    nacos:
      #指定nacos服务端的位置 默认为localhost:8848
      server-addr: xxxxx:8848
      discovery:
        #服务注册到哪个命名空间
        namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4
      config:
        #服务从哪个哪个命名空间拉取配置
        namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4
        #服务端配置文件后缀
        file-extension: yml

注意:配置文件中的namespace 后的值是命名空间ID

效果:

image-20201219175019985

同理,再注册app-user服务到sichuan以及从sichuan中拉取配置

server:
  port: 40020
spring:
  profiles:
    active: sichuan
  application:
    #指定当前服务名字
    name: app-user
  cloud:
    nacos:
      #指定nacos服务端的位置(当前仅是作为一个变量罢了)  默认为localhost:8848
      server-addr: xxxxx:8848
      discovery:
        #服务注册到哪个命名空间
        namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4
      # nacos注册中心服务端位置定义好了上方的的server-addr 后下方配置可省略
      # server-addr: ${spring.cloud.nacos.server-addr}
      config:
        #nacos配置中心服务端位置,定义好了上方的的server-addr 后下方配置可省略
        # server-addr: ${spring.cloud.nacos.server-addr}
        # 自己项目的远端配置文件类型
        file-extension: yml
        #服务从哪个哪个命名空间拉取配置
        namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4

image-20201219175427882

启动后,项目已然注册到了sichuan这个命名空间下

image-20201219175536681

测试配置拉取情况:

image-20201219175936390

测试通信:

我们调用app-login的登录接口http://localhost:30020/login,看是否可以从app-user中获取到信息

image-20201219181436758

如此,命名空间的作用便是完成了,我们可以根据不同的需求,创建不同的命名空间进行隔离,实际上命名空间更多的是是针对配置文件的隔离…

(4)测试跨命名空间服务通信

​ 可能小伙伴有点迷惑,如果我app-loginsichuan命名空间下,app-user在未指定注册中心命名空间,即使用默认public命名空间,他们是否是根据命名空间注册到了两张表呢?他们是否可以通信呢??我们来测试一下!!

app-login保持不动,仍在sichua命名空间下,我们将app-user服务的配置中取消sichuan命名空间,然后从起服务测试通信!!

我们更改app-user配置文件至如下

注释掉discovery下的namespace配置

server:
  port: 40020
spring:
  application:
    #指定当前服务名字
    name: app-user
  cloud:
    nacos:
      #指定nacos服务端的位置(当前仅是作为一个变量罢了)  默认为localhost:8848
      server-addr: xxx:8848
      #discovery:
        #服务注册到哪个命名空间
        #namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4
      # nacos注册中心服务端位置定义好了上方的的server-addr 后下方配置可省略
      # server-addr: ${spring.cloud.nacos.server-addr}
      config:
        file-extension: yml
        #服务从哪个哪个命名空间拉取配置
        #namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4

启动后,服务列表查看

image-20201219180905162

测试:

我们调用app-login的登录接口http://localhost:30020/login,看是否可以从app-user中获取到信息

image-20201219181115933

结果:

服务注册到不同的命名空间下,服务间无法通过OpenFeign指定服务名进行负载通信!!!

命名空间使用注意事项

1.同名的命名空间只能创建一个!

2.微服务间如果没有注册到一个命名空间下,无法使用OpenFeign指定服务名负载通信(服务拉取的配置文件不同命名空间不影响)

即服务间如果需要通信,则需要保证其discovery要在一个命名空间下(实际上一般都不会更改服务注册的命名空间)

image-20201219182159301


二、Nacos的分组

什么是分组

Nacos中,可以根据业务需求,对不同的服务以及配置进行分组,通过不同的字符串名(分组名)来表示不同的分组,Nacos中 如果未显示的指明分组名,那么就会默认的划分在DEFAULT_GROUP分组之中!

从下图可以看出,无论是服务列表,还是配置列表,当显示的指定组名时,默认都在DEFAULT_GROUP这个组中!

image-20201219183611761

image-20201219183626839

如何理解分组

我们仍以超时来举例

前边已经划分了各个区域(namespace)了,那还来个分组,是啥意思呢?

简单!零食区中,薯片是放一个柜的吧!!糖是放一个柜的吧!!鲫鱼与鲫鱼是在一起的吧!!猪排与猪排是在一起的吧! 这便是分组,实际上也是一个更细微的环境隔离机制罢了!!!

分组的使用

(1)配置文件创建分组

配置文件一旦创建,便无法更改分组以及dataId了,我们只能从新创建

image-20201219185802382

指明分组为app

image-20201219190239280

(2)项目中配置分组

app-login项目 bootstrap.yml

#server:
#  port: 30020
spring:
  application:
    #指定当前服务名字
    name: app-login
  cloud:
    nacos:
      #指定nacos服务端的位置(当前仅是作为一个变量罢了)  默认为localhost:8848
      server-addr: xxxx:8848
      discovery:
        #服务注册到哪个命名空间
        namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4
      config:
        #服务从哪个哪个命名空间拉取配置
        namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4
        #服务端配置文件后缀
        file-extension: yml
        #配置文件所在分组
        group: app

app-user项目 bootstrap.yml

server:
  port: 40020
spring:
  profiles:
    active: sichuan
  application:
    name: app-user
  cloud:	
    nacos:
      server-addr: xxx:8848
      discovery:
        #服务注册到哪个命名空间
        namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4
      config:
        file-extension: yml
        #服务从哪个哪个命名空间拉取配置
        namespace: 2b410080-13d5-4899-a74e-03f8a348ffb4
        #自己定义的分组
        group: app

测试配置拉取

image-20201219191057586

app-user服务已成功从命名空间sichuan,分组app,DataId:app-user-sichuan.yml中拉取到了配置

测试通信

(3)测试跨组服务通信

我们在项目配置文件中,亦可指定服务注册的组…spring.cloud.nacos.discovery.group=xxxxxx

我们为app-user指定分组为appapp-user分组保持不变(public

image-20201219191652590

image-20201219191854982

测试通信:

image-20201219192115662

调用失败!!!

结果:当服务即使处于同一个命名空间,如果不在同一个分组,仍无法使用OpenFeign进行负载调用通信

分组使用注意事项

1.Group+DataId组合是唯一的,即统一分组下,不会出现多个相同DataId的配置

2.Group间服务仍是隔离的,即服务注册到不同的分组时,无法使用OpenFeign指定服务名负载调用

1.Namespace+Group+DataId组合是唯一的,即不同命名空间下可有相同分组以及相同DataId,但同一个命名空间下Group与DataId则是唯一的

三、项目源码

spring-cloud-alibaba-nacos

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐