Nacos 环境隔离中分Namespance、group、service的意义是什么?

在初学微服务,因为暂时是学生,接触不到企业微服务的相关经验,希望大佬们可以从企业实际开发过程去聊聊

阅读 2.8k
2 个回答

管理的颗粒度不同,从粗到细。

这玩意儿是随着需求自然而然产生的,你不用费劲去记它的概念,而是要试着从需求角度去理解它们。

你可以先抛开 Nacos 提供的这些模型和概念,现在就假设你自己有一些程序需要管理它们的配置文件,你会怎么去做?我们来试着总结一下可能的需求。

  1. 你有两个程序,我们称之为程序 A 和 B。其中每个程序都可能是分布式部署的,会有多个实例,比如 A1、A2……A9 和 B1、B2……B9。你会希望能有一个地方去统一管理 A 和 B 的配置文件,改了一处 A1-A9 就都跟着变,不用一个一个分别去改。而且最重要的是,改了 A 的配置文件、不会影响 B 的配置,也就是所谓的隔离。
  2. 你现在有了更多的程序,A、B、C、D……乃至 N。此时你发现它们虽然是独立的程序,但是其中某几个程序是互相有业务关联的,比如 A 是订单程序、B 是库存程序,它们会共享同一个 MQ 或者其他中间件。那么此时你会希望在上一条的基础之上,有一个地方可以共享其中一部分参数,这样就可以统一修改这些中间件配置了,但是还不影响你的 A、B 两个程序其他配置项的隔离。
  3. 项目正式上线了,可产品还得继续迭代,但迭代过程中不能直接拿着真实环境搞啊,万一出 BUG 影响用户了怎么办?于是你们分别搭建出了开发、测试、预生产、生产等等几个环境。随着工作越来越复杂,你开始变得手忙脚乱起来,改配置经常改错地方,本来要去改开发环境的、结果不小心点进预生产环境里了。于是你在想,有没有一个什么办法可以区分出这几个环境,打开开发环境的,下面展示出来的所有配置项就都是开发环境的,其他环境的一个都不要显示出来,不显示出来你就不会不小心点错了。甚至说生产环境的配置项,你连看都不想看到,都交给运维吧,这样改错了也不会是你的责任。

在 Nacos 里,应对上述三点需求的,就分别是 Service、Group、Namespace 了。

以上仅从配置项的角度出发,但实际 Nacos 不光是配置中心,还包括服务发现等能力,这里就不再展开了。道理是一样的,你可以自己试着从实际管理的需求出发去总结。

首先申明一下基本没接触过基于nacos微服务的开发,本身也不是属于开发岗,所以在运维的角度上解答这个问题。

在基于nacos的微服务项目里,程序启动时,就能从nacos拿到程序的配置信息。应用网关通过服务发现,可以找到已经注册的实例信息,通过这个信息可以把请求发送给对应的实例。

但是通常情况下,程序开发过程,都会有多个环境(常见的互联网行业中的公司是这样的),通常会有测试环境/开发环境/生产环境等等。

在上面这些环境中,会对应不同的代码分支,这些分支的代码应该在合并之后是一样的,这样就有个问题,如果代码一样,配置的命名空间一样,那么程序去nacos读取配置时,就会拿到一样的配置了,这样就可能都会去连接同一个数据库。不同的环境的程序,也会都注册到一起,就混乱了。

这个时候,命名空间namespace就派上用场了。比如说现在有3个命名空间, test \ dev \ release。

在启动的时候,配置一个环境变量env=dev。然后启动微服务的时候,程序去读取环境变量env,然后把这个env的值dev作为程序连接nacos时使用命名空间,这样,程序就能去dev命名空间下读取配置文件/注册服务了。

等到dev的代码合并到test环境上了,在test环境上,传递一个env=test的环境变量。这里程序还是一样的程序,但是程序读取到的env=test,程序就只会去test命名空间下读取配置/注册服务。

修改不同环境的配置/注册不同的服务,也不会影响到使用其他命名空间的环境,就是相当于一个逻辑的隔离措施。


group 是把配置文件分组,我是这样理解的。


service 就是服务名字。比如说一个项目有ABC三个服务,注册的时候,要告诉nacos,现在这个程序是什么服务。后面你需要去调用这个ABC三个服务中的任意一个服务的时候,才能知道哪个是哪个。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏