问题描述
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服务