# 《RPC手撸专栏》第108章:服务容错失效问题修复

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客1:https://binghe001.github.io (opens new window)
博客2:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~

目前,我们自己手写的RPC框架已经完成了整体设计、服务提供者的实现、服务消费者的实现、注册中心的实现、负载均衡的实现、SPI扩展序列化机制、SPI扩展动态代理机制、SPI扩展反射机制、SPI扩展负载均衡策略、SPI扩展增强型负载均衡策略、SPI扩展实现注册中心、心跳机制、增强型心跳机制、重试机制、整合Spring、整合SpringBoot、整合Docker、整合SpringCloud Alibaba、结果缓存、路由控制、延迟连接、并发控制、流控分析、连接控制、SPI扩展连接淘汰策略和数据缓冲等篇章。

# 一、前言

在测试服务容错功能时,竟然发现服务容错功能失效了!

在前面的章节中,测试服务容错功能时,当服务提供者调用真实方法时,采用jdk、cglib、javassist和bytebuddy反射机制调用真实方法时,都能正常进行容错处理。但是当服务提供者调用真实方法时,采用asm反射机制调用真实方法时,却无法正常完成容错处理,这到底是怎么回事呢?

# 二、问题重现

重现下遇到的问题呗?

# 1.修改服务提供者

修改bhrpc-demo-native-provider工程下的io.binghe.rpc.demo.provider.ProviderNativeDemo#startRpcSingleServer()方法,将调用真实方法的反射类型reflectType参数修改成asm,如下所示。

@Test
public void startRpcSingleServer(){
    RpcSingleServer singleServer = new RpcSingleServer("127.0.0.1:27880", "127.0.0.1:27880","127.0.0.1:2181", "zookeeper", "random","io.binghe.rpc.demo", "asm", 3000, 6000, true, 30000, 16, 16, "print", 1, "refuse", true, 2);
    singleServer.startNettyServer();
}
1
2
3
4
5

# 2.启动服务提供者

运行bhrpc-demo-native-provider工程下的io.binghe.rpc.demo.provider.ProviderNativeDemo#startRpcSingleServer()方法,输出的信息如下所示。

22:48:09,547  INFO BaseServer:168 - Server started on 127.0.0.1:27880
1

可以看到,服务提供者成功连接到Zookeeper,并且启动后监听的IP地址为127.0.0.1,端口为27880。

# 3.启动服务消费者

运行bhrpc-demo-native-consumer工程下的io.binghe.demo.consumer.ConsumerNativeDemo#testInterfaceRpc()方法,如下所示。

22:48:20,211  INFO ConsumerNativeDemo:48 - 返回的结果数据===>>> null
1

可以看到,服务消费者打印的返回结果竟然为null,并没有调用服务容错类的方法。

# 4.查看服务提供者日志

查看服务提供者日志,如下所示。

java.lang.reflect.InvocationTargetException
//###########省略其他代码############
Caused by: io.binghe.rpc.common.exception.RpcException: rpc provider throws exception
	at io.binghe.rpc.demo.provider.impl.ProviderDemoServiceImpl.hello(ProviderDemoServiceImpl.java:36)
	... 23 more
1
2
3
4
5

可以看到,服务提供者抛出了异常,但是,RPC框架并没有执行服务容错处理。这到底是怎么回事呢?

# 三、目标

目标很明确:当服务提供者采用asm反射机制调用真实方法时,需要支持容错处理!

在服务提供者采用asm反射机制调用真实方法时,由于某种原因,RPC框架并没有执行容错处理逻辑,本章,我们的目标就是需要RPC框架在服务提供者采用asm反射机制调用真实方法时,支持容错处理。

# 四、实现

说了这么多,改怎么实现呢?

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码