记录那些年 Nacos 的坑

  • 2021-11-14
  • Admin

27d2d291be79b537cfee0b45bd2c47ee.png

Nacos 旧史

201811月左右,Springcloud 联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cloud Alibaba,并发布了首个预览版本。随后,Spring Cloud 官方Twitter也发布了此消息。

随着这一消息发布,外面才知道 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

执行:

  1. Linux/Unix/Mac:sh startup.sh -m standalone
  2. Windows:cmd startup.cmd -m standalone

启动完成之后,访问:http://127.0.0.1:8848/nacos/,可以进入Nacos的服务管理页面,具体如下:

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

9a144fdb9c53c4bb8d07133e2053b73d.png
image.png

具体的配置如下:

1fce695b4f3eb15217fdaa75c3a64d7a.png
image.png

这里,我们可以设置配置的类型,比如:yaml、properties。默认的是后者,这里我们可以设置:

  1. spring:
  2.   application:
  3.     name: cas-server
  4.   cloud:
  5.     nacos:
  6.       server-addr: 127.0.0.1:8848
  7.       discovery:
  8.         enabled: true
  9.         namespace: a48cec97-fa0f-48e0-97c7-0aced5c7ecbe #默认public
  10.         #group: mine #${nacos.runtime-env}
  11.         heart-beat-interval: 10
  12.         heart-beat-timeout: 15
  13.       config:
  14.         enabled: true
  15.         #namespace: ${nacos.namespace}
  16.         file-extension: yaml #默认properties
  17.         #group: ${spring.application.name}
  18.         shared-configs:
  19.           - data-id: application-mysql.properties
  20.             refresh: false

不同 namespace 下的服务互调

在 Nacos 里,有几个概念,命令空间 namespace、分组 group 等。虽然这里的关键词跟 K8s 类似,但差别还是很大。这就是我今天想说的坑。这里我们默认配置了 properties。

在 Nacos 中,为了将不同的服务进行划分区域,这也引入了一些概念:namespace、group 我们先来设置一下 namespace,假如我们这里新建一个 namespace:

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

95bca1a687a91fd631fc2690466e492f.png我们可以看到cas-server服务在 namespace 名称为 new-NS 下。

下面,我们继续加入一个新服务,把这个新服务放在默认的 namespace 下,假设利用它来调用 cas-server 服务。

87f16f4ab8eee4e31a521a53b5a27734.png
image.png

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

curl -i -H "Accept: application/json" -H "Authorization:bearer fbbb08b5-fc9c-4bf9-a676-6a1d5d6a0dda" -X GET http://localhost:2001/api/user/get

此时可以看到日志:

0c663c3bab1d124a4f5c61af04d03133.png
image.png

这里由于被访问的服务是需要鉴权的,所以可以看到:这里的日志是去请求统一认证鉴权中心的check_token接口。由于这两个服务都被注册到 Nacos,这里直接通过域名来请求了。

但从日志中可以看到,抛出异常:java.lang.IllegalStateException: No instances available for cas-server,这是因为无法解析到这个域名对应的 ip。但从上面,我们可以看到明明有注册信息,为啥不能访问呢?

这就是 Nacos 现在呈现的第一个坑:无法在跨namespace 下访问其他服务。如果我们把cas-server也放在默认的 namespace 下呢?

bbaaf0267be51e011ed072e146eab04c.png
image.png

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

b2dd7fa4079b75e6b9425faa471ddb29.png
image.png

我们发现正常请求后,返回了信息,只不过返回的是400,这是由于我这个 token 失效了,无效的token,请重新认证访问

同 namespace 下不同组的服务互调

上面说到不同 namespace 下的服务互调的问题,接下来,我们看看同一 namespace 下不同分组的服务互调是咋样的呢?

同样的,我们假设把 cas-server 分配到一个新的 group:

  1. spring:
  2.   application:
  3.     name: cas-server
  4.   cloud:
  5.     nacos:
  6.       server-addr: 127.0.0.1:8848
  7.       discovery:
  8.         enabled: true
  9.         group: mine
  10.         heart-beat-interval: 10
  11.         heart-beat-timeout: 15

新服务rest-service还是放在默认分组DEFAULT_GROUP里:

371f64b68415ee605b94396a540aaca8.png
image.png

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

curl -i -H "Accept: application/json" -H "Authorization:bearer fbbb08b5-fc9c-4bf9-a676-6a1d5d6a0dda" -X GET http://localhost:2001/api/user/get

我们来看看日志:

9e00180a267b24731370c69bcaff7574.png
image.png

发现还是跟前面说的那种情况请求后一样,仍然抛出异常:java.lang.IllegalStateException: No instances available for cas-server

结论

在 Nacos 较高版本中验证这两种情况,同样得出相同的结论:同一namespace下的不同group的服务无法相互调用,不同namespace下的同group的服务无法相互调用

PS

在这里说出 Nacos 的坑,并不是在指责 Nacos 团队哈,只是希望官方尽快出新的 feature。

下面给大家介绍一本好书《深入了解分布式事务》,该书在当当网目前销售火热,有原理加实战,感兴趣可以点击下方链接购买。

开源项目

  实践项目代码开源:https://gitee.com/damon_one/microservice-k8s

欢迎大家star、fork,欢迎联系我,一起学习。

云原生社区合肥站

云原生社区合肥站正式启动啦,欢迎Base合肥、关注云原生、长期从事云原生的同志们踊跃加入,云原生社区合肥站会因为你们的加入而变得更加美好~

详情参见Issue:https://github.com/cloudnativeto/community/issues/107

欢迎关注个站

b165cfcf7672a36e88fe08999e2cf6f0.png

往期回顾

微服务自动化部署CI/CD

如何利用k8s拉取私有仓库镜像

个站建设基础教程

ArrayList、LinkedList 你真的了解吗?

大佬整理的mysql规范,分享给大家

如果张东升是个程序员

微服务架构设计之解耦合

浅谈负载均衡

Oauth2的认证实战-HA篇

Oauth2的授权码模式《上》

浅谈开发与研发之差异

浅谈 Java 集合 | 底层源码解析

基于 Sentinel 作熔断 | 文末赠资料

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

f3a8a49c1aa5b9a693bd3086f1f9b4f6.png

7e2f9cd7f46dc45382ff979fcd45f47c.png

57643cf66b7f6881cfabb47577e2bc35.png

关注公众号,回复入群,获取更多惊喜!公众号(程序猿Damon)里回复 ES、Flink、Java、Kafka、MQ、ML、监控、大数据、k8s 等关键字可以查看更多关键字对应的文章。

9bfc350ee31a37548f602f101819d454.gif

19a56a0857201945423b4b43eac99971.gif

点击 "damon8.cn" 获取更好的阅读体验!

❤️给个「在看」,是对我最大的支持❤️

原文:https://blog.csdn.net/wangsofa/article/details/121312974

联系站长

QQ:769220720