记录那些年 Nacos 的坑
Nacos 旧史
随着这一消息发布,外面才知道 Nacos 的诞生。毕竟是大厂的 KPI 产物,我们来尝尝鲜。
一、环境准备
Spring Boot: 2.3.12
Spring Cloud: Hoxton.SR12
Spring Cloud Alibaba: 2.2.6.RELEASE
Maven: 3.5.4
Java 1.8 +
Oauth2 (Spring Security 5.3.9)
安装 Nacos
下载 Nacos 地址:https://github.com/alibaba/nacos/releases
版本:v1.2.1
执行:
启动完成之后,访问:http://127.0.0.1:8848/nacos/,可以进入 Nacos 的服务管理页面,具体如下:

在上面,我们可以看到启动的服务列表信息,同时,我们也可以去配置此服务的相关配置:

具体的配置如下:

这里,我们可以设置配置的类型,比如:yaml、properties。默认的是后者,这里我们可以设置:
不同 namespace 下的服务互调
在 Nacos 里,有几个概念,命令空间 namespace、分组 group 等。虽然这里的关键词跟 K8s 类似,但差别还是很大。这就是我今天想说的坑。这里我们默认配置了 properties。
在 Nacos 中,为了将不同的服务进行划分区域,这也引入了一些概念:namespace、group 我们先来设置一下 namespace,假如我们这里新建一个 namespace:

那么在注册服务时,我们把这个服务放在了这个 new-NS
下,启动该服务,我们来看信息:

我们可以看到cas-server
服务在 namespace 名称为 new-NS 下。
下面,我们继续加入一个新服务,把这个新服务放在默认的 namespace 下,假设利用它来调用 cas-server 服务。

接下来,我们通过命令调用服务:
此时可以看到日志:

这里由于被访问的服务是需要鉴权的,所以可以看到:这里的日志是去请求统一认证鉴权中心的check_token
接口。由于这两个服务都被注册到 Nacos,这里直接通过域名来请求了。
但从日志中可以看到,抛出异常:java.lang.IllegalStateException: No instances available for cas-server
,这是因为无法解析到这个域名对应的 ip。但从上面,我们可以看到明明有注册信息,为啥不能访问呢?
这就是 Nacos 现在呈现的第一个坑:无法在跨namespace 下访问其他服务
。如果我们把cas-server
也放在默认的 namespace 下呢?

再次,我们通过命令调用服务,会发现可以正常请求了:

我们发现正常请求后,返回了信息,只不过返回的是400
,这是由于我这个 token 失效了,无效的token,请重新认证访问
。
同 namespace 下不同组的服务互调
上面说到不同 namespace 下的服务互调的问题,接下来,我们看看同一 namespace 下不同分组的服务互调是咋样的呢?
同样的,我们假设把 cas-server 分配到一个新的 group:
新服务rest-service
还是放在默认分组DEFAULT_GROUP
里:

接下来,我们通过命令调用服务:
我们来看看日志:

发现还是跟前面说的那种情况请求后一样,仍然抛出异常:java.lang.IllegalStateException: No instances available for cas-server
。
结论
在 Nacos 较高版本中验证这两种情况,同样得出相同的结论:同一namespace下的不同group的服务无法相互调用,不同namespace下的同group的服务无法相互调用
。
PS
在这里说出 Nacos 的坑,并不是在指责 Nacos 团队哈,只是希望官方尽快出新的 feature。
版权声明: 本文为 InfoQ 作者【Xiao8】的原创文章。
原文链接:【http://xie.infoq.cn/article/badf21ff5edf3654f019eda24】。文章转载请联系作者。
评论