Dubbo配置参数详解-generic

2020-01-07  本文已影响0人  codeimport

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包,如果接口有变动,网关无需知道,只要业务方修改配置即可。

上一篇下一篇

猜你喜欢

热点阅读