微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试

背景

微服务nacos注册中心,服务调用dubbo注册方式spring和nacos各有优缺点
其中nacos配置方式可以注册维度查询细粒度到接口,但是nacos中心上下线和权重功能失效

 

微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第1张图片

 

其中spring-cloud配置方式nacos中心上下线和权重功能正常,但是注册维度查询只能到服务级别,具体接口是否注册成功确无法查询

微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第2张图片

 #其中前缀spring-cloud说明:挂载到 Spring Cloud注册中心

dubbo.registry.address 注册中心地址

微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第3张图片
nacos+duboo官网

 

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请求异常。

所以,为避免出现以上问题,要求消费端必须订阅生产者应用。

微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第4张图片

 

压测灰度生产者注册地址变更,全过程无异常

上下线功能验证

上下线功能验证
序号 预制 描述 测试结果 备注
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的权重,需要额外扩展

微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第5张图片

 

一、Dubbo 负载RPC调用源码

AbstractClusterInvoker

@Override

public Result invoke(final Invocation invocation) throws RpcException {

checkWhetherDestroyed();

// binding attachments into invocation.

Map contextAttachments = RpcContext.getContext().getObjectAttachments();

if (contextAttachments != null && contextAttachments.size() != 0) {

((RpcInvocation) invocation).addObjectAttachments(contextAttachments);

}

List<Invoker> invokers = list(invocation);

LoadBalance loadbalance = initLoadBalance(invokers, invocation);

RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation);

return doInvoke(invocation, invokers, loadbalance);

}

微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第6张图片

 

微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第7张图片

 微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第8张图片

 微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第9张图片

 微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第10张图片

 微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第11张图片

  可以实现权重重写,但是目前还未能拿到nacos配置的权重

二、dubbo-admin客户端(需要nacos注册方式)

微服务sprigcloudAlibaba+dubbo+nacos注册配置rpc调用问题调试_第12张图片

自己尝试不太好用,放弃调了

遗留问题:两种方案都未实现dubbo RPC调用负载权重动态配置问题

 

你可能感兴趣的:(系统架构,微服务,rpc,java)