Dubbo配置参数详解-generic
Dubbo是一个由阿里开源的服务治理框架,笔者的公司重度使用Dubbo。Dubbo开源这么多年,配置项已经非常丰富,了解各个配置项的作用也变得非常重要,本系列将从源代码的角度分析Dubbo目前的最新版本(2.7.4)各个常用的配置项的具体含义以及是怎么起作用的。
画外音:目前Dubbo在开源中国举办的2019年度最受欢迎中国开源软件中排名第3名,支持Dubbo的朋友可以去投票哇。2019年度最受欢迎中国开源软件
generic有什么用?
Consumer端正常调用Dubbo服务时,一般都需要服务提供方提供一个jar包,只有在项目中引入该jar包,才能调用相关服务;能不能向http调用那样,我只需要知道我要调用的url就可以直接调用Dubbo服务?
有的,这就是generic做的事。
generic:通用服务调用,当我们已经知道我们要调用的服务的全限定名及方法,就不需要服务提供者的jar就能调用Dubbo服务了。
generic怎么配置?
generic要配合interfaceName参数一起使用,其中interfaceName是Dubbo服务的全限定名,比如:
@Reference(generic = true, interfaceName = "com.example.dubboprovider.service.HelloDubboService")
private GenericService genericService;
@RequestMapping("/generic")
public String generic() {
String say = (String) genericService.$invoke("hello", new String[0], new Object[0]);
return say;
}
generic在代码中是如何生效的?
当provider接收到请求时,会调用一系列的过滤器对请求进行处理,这其中就包含处理generic的过滤器:GenericFilter
该过滤器会判断调用的方法是否是$invoke,如果是则会通过反射调用正在的方法
@Activate(group = CommonConstants.PROVIDER, order = -20000)
public class GenericFilter extends ListenableFilter {
public GenericFilter() {
super.listener = new GenericListener();
}
@Override
public Result invoke(Invoker<?> invoker, Invocation inv) throws RpcException {
if ((inv.getMethodName().equals($INVOKE) || inv.getMethodName().equals($INVOKE_ASYNC))
&& inv.getArguments() != null
&& inv.getArguments().length == 3
&& !GenericService.class.isAssignableFrom(invoker.getInterface())) {
String name = ((String) inv.getArguments()[0]).trim();
String[] types = (String[]) inv.getArguments()[1];
Object[] args = (Object[]) inv.getArguments()[2];
try {
Method method = ReflectUtils.findMethodByMethodSignature(invoker.getInterface(), name, types);
Class<?>[] params = method.getParameterTypes();
if (args == null) {
args = new Object[params.length];
}
String generic = inv.getAttachment(GENERIC_KEY);
if (StringUtils.isBlank(generic)) {
generic = RpcContext.getContext().getAttachment(GENERIC_KEY);
}
//。。。。
}
}
}
}
总结:
笔者认为该参数最大的用武之地是作为网关使用,笔者所在公司的网关就提供了http转换成dubbo接口调用的功能,前端使用http调用,后端使用dubbo服务进行处理;网关提供一个接口配置页面,只需要业务方在页面配置url与dubbo接口的转换关系即可,网关不需要引用服务提供者的jar包,如果接口有变动,网关无需知道,只要业务方修改配置即可。
网友评论