文章讨论了Nacos在作为注册中心和配置中心时的使用情况。作者指出在gPRC服务发现方面,无论是Nacos的2.x版本还是1.x版本都不支持。但在配置中心方面,获取配置和更新配置都没有问题。作者列出了自己的环境包括java17、springboot2.6.x、springcloud2021.0.x、grpc-spring-boot-starter3.0。在测试过程中,作者遇到了一个问题,即在调用gRPC客户端的xxxBlockingStub时出现空指针异常。作者测试了Nacos注册中心,发现Nacos2.0新增了用于gRPC通信的端口,并通过调整配置成功解决了问题。此外,在Nacos控制台中观察到serviceB中并没有gRPC服务的元数据。作者还提到了关于gRPC整合springboot的依赖版本问题,并通过调整依赖版本成功解决了问题。通过测试发现,调整依赖版本后,serviceB的gRPC服务已经成功注册。
问题描述
Nacos作为注册中心:gPRC服务发现是不支持的,不管是2.x
还是1.x
都没用。
Nacos作为配置中心:获取配置和更新配置都没有问题。
我的环境
- java17
- springboot2.6.x
- springcloud2021.0.x
- grpc-spring-boot-starter3.0
测试过程
场景:在用serviceA
通过gRPC组件调用serviceB
,一直出现的是serviceA
中调用gRPC客户端的xxxBlockingStub
空指针。
测试Nacos注册中心
这里通过反复查看官方文档找到一些可用的信息:
Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
端口 与主端口的偏移量 描述
9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
9849 1001 服务端gRPC请求服务端端口,用于服务间同步等
Nacos2.0增加了9848,9849端口来进行GRPC通信,这两个端口在Nacos2.0内部是通过8848+1000以及8848+1001这种偏移量方式计算出来的,不需要用户额外在配置文件中配置。
我的Nacos是开启了这两个端口的,但从官网给出的图,我好像大致能感受到两个服务间是如何使用Nacos进行gRPC通信的了。以下是个人看法:在我的场景中,serviceA
在nacos中查找gPRC服务的时候会去注册中心监听gRPC客户端请求的端口查找已经注册的gRPC服务(可能是个表,也可能是个集合),如果找到,就通过对应gRPC服务注册的地址去指定服务(serviceB)调用gRPC服务,这些gRPC服务从哪来,那应该就是在注册服务的使用,在监听gRPC注册的端口对这些服务进行记录了。
测试服务端gPRC是否注册
在Nacos控制台serviceB
中并没有gPRC服务的元数据。
测试依赖兼容性
关于gRPC整合springboot的依赖并不是官方给的,这里我从grpc-spring这里找到了关于gRPC整合spring系列各个版本之间依赖的对应关系,通过调整依赖版本,将grpc-spring-boot-starter3.0换为grpc-spring-boot-starter2.14成功解决问题。
在控制台查看到serviceB
的gRPC服务