微服务nacos注册中心,服务调用dubbo注册方式spring和nacos各有优缺点
其中nacos配置方式可以注册维度查询细粒度到接口,但是nacos中心上下线和权重功能失效
其中spring-cloud配置方式nacos中心上下线和权重功能正常,但是注册维度查询只能到服务级别,具体接口是否注册成功确无法查询
#其中前缀spring-cloud说明:挂载到 Spring Cloud注册中心
dubbo.registry.address 注册中心地址
https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html
spring-cloud-alibaba-dubbo官网
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_dubbo
由于原有nacos配置的上下线和权重功能失效,现在改为spring-cloud配置,但是几次变更存在服务RPC调用服务异常问题,进行调试确认问题,制定可行性方案
服务调用订阅问题 | ||||
序号 | 预制 | 描述 | 测试结果 | 备注 |
1 | provider和consumer都为nacos | 订阅 | 调用正常 | |
2 | 不订阅 | 调用正常 | ||
3 | provider为nacos,consumer为spring-cloud | 订阅 | 调用正常 | |
4 | 不订阅 | 调用异常 | ||
5 | provider为spring-cloud,consumer为spring-cloud | 订阅 | 调用正常 | |
6 | 不订阅 | 调用异常 | ||
7 | provider为spring-cloud,consumer为nacos | 订阅 | 调用正常 | |
8 | 不订阅 | 调用异常 | ||
9 | 压测consumer为nacos,provider从nacos灰度到spring-cloud | 压测模拟 | 调用正常,全过程无异常 | |
10 | 压测consumer为spring-cloud,provider从nacos灰度到spring-cloud | 压测模拟 | 调用正常,全过程无异常 |
当消费者consumer和生产者provider中有一个使用spring-cloud注册中心地址,当消费者未订阅生产者时,会存在PRC请求异常。
所以,为避免出现以上问题,要求消费端必须订阅生产者应用。
压测灰度生产者注册地址变更,全过程无异常
上下线功能验证 | ||||
序号 | 预制 | 描述 | 测试结果 | 备注 |
1 | provider和consumer都为nacos | 上下线功能 | 未起作用 | |
2 | provider为nacos,consumer为spring-cloud | 上下线功能 | 未起作用 | |
3 | provider为spring-cloud,consumer为spring-cloud | 上下线功能 | 生效 | |
4 | provider为spring-cloud,consumer为nacos | 上下线功能 | 生效 |
当生产者注册中心连接方式为spring-cloud时,nacos控制台的上下线功能生效。
权重功能验证 | ||||
序号 | 预制 | 描述 | 测试结果 | 备注 |
1 | provider和consumer都为nacos | 权重功能 | 未生效,轮询 | |
2 | provider为nacos,consumer为spring-cloud | 权重功能 | 未生效,轮询 | |
3 | provider为spring-cloud,consumer为spring-cloud | 权重功能 | 未生效,轮询 | |
4 | provider为spring-cloud,consumer为nacos | 权重功能 | 未生效,轮询 |
Ribbon
内置的负载均衡规则并不支持 Nacos
的权重,需要额外扩展
一、Dubbo 负载RPC调用源码
AbstractClusterInvoker
@Override
public Result invoke(final Invocation invocation) throws RpcException {
checkWhetherDestroyed();
// binding attachments into invocation.
Map
if (contextAttachments != null && contextAttachments.size() != 0) {
((RpcInvocation) invocation).addObjectAttachments(contextAttachments);
}
List<Invoker
LoadBalance loadbalance = initLoadBalance(invokers, invocation);
RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation);
return doInvoke(invocation, invokers, loadbalance);
}
可以实现权重重写,但是目前还未能拿到nacos配置的权重
二、dubbo-admin客户端(需要nacos注册方式)
自己尝试不太好用,放弃调了
遗留问题:两种方案都未实现dubbo RPC调用负载权重动态配置问题