美文网首页
Dubbo配置参数详解-generic

Dubbo配置参数详解-generic

作者: codeimport | 来源:发表于2020-01-07 15:51 被阅读0次

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

    相关文章

      网友评论

          本文标题:Dubbo配置参数详解-generic

          本文链接:https://www.haomeiwen.com/subject/igwkactx.html