文章目录
前言
版本选择:
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
的身影了!
从上方截图中可以发现Nacos
默认设置了一个命名空间为public
,默认分组为DEAULT_GROUP
那么,究竟什么是命名空间,什么是分组,它们有什么作用呢???请看下文
一、Nacos的命名空间
什么是命名空间
命名空间,即namespace,namespace是nacos针对于企业级开发设计用来针对于不同环境的区分,比如正在企业开发时有测试环境,生产环境,等其他环境,为了保证不同环境配置实现隔离,提出了namespace的概念!
nacos中存在一个默认的命名空间public
,所有配置以及服务注册,在没有指定命名空间时都会默认从public
这个命名空间拉取配置以及注册到该命名空间下的注册表中!!!
- 下图,便是
Nacos
默认的命名空间public
- 查看我们之前服务注册表,以及配置列表,发现其都在
public
这个命名空间之下
我们在开发中呢,则可以根据不同的需求,定义不同的命名空间,然后将我们的服务注册到不同的命名空间,以及从指定命名空间中拉取配置文件…
如何理解命名空间
其实很好理解:
为什么要使用命名空间?答:环境隔离
举个贴切的例子:
一个超市,内部有很多区域对吧!比如零售休闲区
、瓜果蔬菜区
、生鲜区
等等,顺着超市路标指引,我们如果买鱼,直接去生鲜区即可,我们买零食,直接去零食休闲区即可,买个东西无需在超市乱窜…这种区域划分呢,便是物以类聚,环境隔离的思想!!!
我们nacos
的namespace
思想就如同超市中不同大类型的划分区域,有了namespace
我们可以轻松实现环境隔离,比如dev
、test
说个目前实际开发多环境面临的问题:
我们公司由于客户的特殊性以及特殊需求,有了大地区供应商的概念,例如四川总运营商、山西总运营商等等,这些客户由于要求对于他们的个别服务需要独立部署!于是呢出现了某些请求不同不调用不同的网关,将请求转发路由到对应的服务… 这个时候呢,使用命名空间是极好的!!!
命名空间的使用
演示前,我们关闭掉所有的服务,删除所有的配置,一切从0开始!!
(1)创建命名空间
我们需要进入nacos
控制台命名空间菜单栏,然后根据需求,创建命名空间
例如,我这里创建一个名为:sichuan
的命名空间
命名空间ID,可以自定义,亦可不填使其按照自身规则生成
这样,命名空间便创建好了!!我们再进入服务列表或者配置列表,发现便会多一个sihchuan
的table
(2)在新建命名空间中添加配置文件
(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
效果:
同理,再注册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
启动后,项目已然注册到了sichuan
这个命名空间下
测试配置拉取情况:
测试通信:
我们调用app-login
的登录接口http://localhost:30020/login
,看是否可以从app-user
中获取到信息
如此,命名空间的作用便是完成了,我们可以根据不同的需求,创建不同的命名空间进行隔离,实际上命名空间更多的是是针对配置文件的隔离…
(4)测试跨命名空间服务通信
可能小伙伴有点迷惑,如果我app-login
在sichuan
命名空间下,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
启动后,服务列表查看
测试:
我们调用app-login
的登录接口http://localhost:30020/login
,看是否可以从app-user
中获取到信息
结果:
服务注册到不同的命名空间下,服务间无法通过OpenFeign
指定服务名进行负载通信!!!
命名空间使用注意事项
1.同名的命名空间只能创建一个!
2.微服务间如果没有注册到一个命名空间下,无法使用OpenFeign指定服务名负载通信(服务拉取的配置文件不同命名空间不影响)
即服务间如果需要通信,则需要保证其discovery要在一个命名空间下(实际上一般都不会更改服务注册的命名空间)
二、Nacos的分组
什么是分组
在Nacos
中,可以根据业务需求,对不同的服务以及配置进行分组,通过不同的字符串名(分组名)来表示不同的分组,Nacos
中 如果未显示的指明分组名,那么就会默认的划分在DEFAULT_GROUP
分组之中!
从下图可以看出,无论是服务列表,还是配置列表,当显示的指定组名时,默认都在DEFAULT_GROUP
这个组中!
如何理解分组
我们仍以超时来举例
前边已经划分了各个区域(namespace
)了,那还来个分组,是啥意思呢?
简单!零食区中,薯片是放一个柜的吧!!糖是放一个柜的吧!!鲫鱼与鲫鱼是在一起的吧!!猪排与猪排是在一起的吧! 这便是分组,实际上也是一个更细微的环境隔离机制罢了!!!
分组的使用
(1)配置文件创建分组
配置文件一旦创建,便无法更改分组以及dataId了,我们只能从新创建
指明分组为app
(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
测试配置拉取
app-user
服务已成功从命名空间sichuan
,分组app
,DataId:app-user-sichuan.yml
中拉取到了配置
测试通信
(3)测试跨组服务通信
我们在项目配置文件中,亦可指定服务注册的组…spring.cloud.nacos.discovery.group=xxxxxx
我们为app-user
指定分组为app
…app-user
分组保持不变(public
)
测试通信:
调用失败!!!
结果:当服务即使处于同一个命名空间,如果不在同一个分组,仍无法使用OpenFeign
进行负载调用通信
分组使用注意事项
1.Group+DataId
组合是唯一的,即统一分组下,不会出现多个相同DataId的配置
2.Group
间服务仍是隔离的,即服务注册到不同的分组时,无法使用OpenFeign指定服务名负载调用
1.Namespace+Group+DataId
组合是唯一的,即不同命名空间下可有相同分组以及相同DataId,但同一个命名空间下Group与DataId则是唯一的