Dubbo过滤器

pom.xml

1
2
3
4
5
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.22</version>
</dependency>

简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Slf4j
@Activate(
group = {"provider"},
order = 10010
)
public class DubboInvokeProxy implements Filter {

private Instance currentInstance;
public InvokeServiceFilter() {
ExtensionFactory beanFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension();
JedisCluster jedisCluster = beanFactory.getExtension(JedisCluster.class, "jedisCluster");
MongoTemplate mongoTemplate = beanFactory.getExtension(MongoTemplate.class, "mongoTemplate");
cacheStores.put(Cache.NosqlType.REDIS, new RedisCacheStore(jedisCluster));
cacheStores.put(Cache.NosqlType.MONGODB, new MongoCacheStore(mongoTemplate));
}

@SneakyThrows
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
if (!invoker.getInterface().isAssignableFrom(DataService.class)) {
return invoker.invoke(invocation);
}
Class<?> cls = invoker.getInterface();
Method method = invoker.getInterface().getMethod(invocation.getMethodName(),
invocation.getParameterTypes());
Class<?>[] parameterTypes = invocation.getParameterTypes();
Object[] arguments = invocation.getArguments();

if (method.isAnnotationPresent(Cacheable.class)) {
Method cacheMethod = org.springframework.util.ReflectionUtils.findMethod(CacheStore.class, method.getName(), parameterTypes);
Object value = org.springframework.util.ReflectionUtils.invokeMethod(cacheMethod, cacheStore, arguments);
return AsyncRpcResult.newDefaultAsyncResult(value, invocation);
}

return invoker.invoke(invocation);
}

}

参考https://gentryhuang.com/posts/c5f1bd62/