iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java怎么优雅的调用dubbo同时不使用其它jar包
  • 245
分享到

Java怎么优雅的调用dubbo同时不使用其它jar包

2023-07-05 04:07:17 245人浏览 独家记忆
摘要

本文小编为大家详细介绍“Java怎么优雅的调用dubbo同时不使用其它jar包”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么优雅的调用dubbo同时不使用其它jar包”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来

本文小编为大家详细介绍“Java怎么优雅的调用dubbo同时不使用其它jar包”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么优雅的调用dubbo同时不使用其它jar包”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    1、正常dubbo调用流程

    引入dubbo依赖

    引入他人提供的clinet依赖包;

    配置相同的注册中心,使用@Reference注解注入对应的service接口(注意是Reference是dubbo包下的,不是spring那个)

    2、如果想在不引用他人jar包的情况下如何调用呢

    dubbo泛化调用-dubbo原生支持的优雅方法

    使用场景:

    消费者不希望引入生产者提供的clinet依赖;

    例如:消费者是一个基础服务,需要调用很多生产者的dubbo方法,那他就要引入很多的jar包;

    消费者不使用java语言,而是使用其他的语言(例如:python);

    如何使用:

    需要知道对方方法的全路径名称(interfaceName)

    如果对方的dubbo有指定的版本号(version)和组(group)要指定一下,不然有很大可能会调用不通

    要知道对方的注册中心地址和连接方式(如果是在同一个zk注册中心就更好了)

    1.获取泛化对象

    private GenericService getGenericService(String interfaceName, String version, String group) {    ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();    // set application    ApplicationConfig applicationConfig = new ApplicationConfig();    applicationConfig.setId(APPLICATION_ID);    applicationConfig.setName(APPLICATION_ID);    reference.setApplication(applicationConfig);    // 通过ZooKeeper连接    ReGIStryConfig registryConfig = new RegistryConfig();    registryConfig.setAddress(zkAddress);    registryConfig.setProtocol(ZOOKEEPER);    registryConfig.setCheck(false);    reference.setRegistry(registryConfig);    // set timeout    reference.setTimeout(syncForwardTimeout);    // set retry times    reference.setRetries(syncRetries);    // set check    reference.setCheck(false);    // set generic    reference.setGeneric(true);    // set interface version    if (version != null && version.length() != 0) {        reference.setVersion(version);    }    // set interface name    reference.setInterface(interfaceName);    // set service id    reference.setId(interfaceName);    // set dubbo protocol    reference.setProtocol(DUBBO);    //    if (group != null && group.length() != 0) {        reference.setGroup(group);    }    // 从zookeeper获取缓存,从缓存中获取泛化    return ReferenceConfiGCache.getCache().get(reference);}

    2.泛化调用入参处理

    private ResponseDataDto<R> invoke(GenericService genericService, UpDataReqDto upDataReqDto, String method) {    String[] paramTypes = new String[1];    Object[] paramValues = new Object[1];    int i = 0;    paramTypes[i] = upDataReqDto.getClass().getTypeName();    paramValues[i] = upDataReqDto;    Object object = genericService.$invoke(method, paramTypes, paramValues);    return JSON.parseObject(jsON.toJSONString(object), new TypeReference<ResponseDataDto<R>>(){});}

    实现原理:

    泛化调用的实现主要涉及两个filter

    com.alibaba.dubbo.rpc.filter.GenericFilter

    com.alibaba.dubbo.rpc.filter.GenericImplFilter

    泛化调用的流程:

    调用 <-> GenericImplFilter <-> 网络(RPC) <-> GenericFilter <-> 服务实现

    泛化调用的核心源码:

    GenericImplFilter://判断是不是泛化调用if (isCallingGenericImpl(generic, invocation)) {    RpcInvocation invocation2 = new RpcInvocation(invocation);        invocation2.put(GENERIC_IMPL_MARKER, true);    String methodName = invocation2.getMethodName();    Class<?>[] parameterTypes = invocation2.getParameterTypes();    Object[] arguments = invocation2.getArguments();    String[] types = new String[parameterTypes.length];    for (int i = 0; i < parameterTypes.length; i++) {        types[i] = ReflectUtils.getName(parameterTypes[i]);    }    Object[] args;    if (ProtocolUtils.isBeanGenericSerialization(generic)) {        args = new Object[arguments.length];        for (int i = 0; i < arguments.length; i++) {            args[i] = JavaBeanSerializeUtil.serialize(arguments[i], JavaBeanAccessor.METHOD);        }    } else {        args = PojoUtils.generalize(arguments);    }    if (RpcUtils.isReturnTypeFuture(invocation)) {        invocation2.setMethodName($INVOKE_ASYNC);    } else {        invocation2.setMethodName($INVOKE);    }    invocation2.setParameterTypes(GENERIC_PARAMETER_TYPES);    invocation2.setParameterTypesDesc(GENERIC_PARAMETER_DESC);    invocation2.setArguments(new Object[]{methodName, types, args});    return invoker.invoke(invocation2);}// 普通服务进行通用调用else if (isMakingGenericCall(generic, invocation)) {    Object[] args = (Object[]) invocation.getArguments()[2];    if (ProtocolUtils.isJavaGenericSerialization(generic)) {        for (Object arg : args) {            if (byte[].class != arg.getClass()) {                error(generic, byte[].class.getName(), arg.getClass().getName());            }        }    } else if (ProtocolUtils.isBeanGenericSerialization(generic)) {        for (Object arg : args) {            if (!(arg instanceof JavaBeanDescriptor)) {                error(generic, JavaBeanDescriptor.class.getName(), arg.getClass().getName());            }        }    }    invocation.setAttachment(            GENERIC_KEY, invoker.getUrl().getParameter(GENERIC_KEY));}GenericFilter:if ((inv.getMethodName().equals($INVOKE) || inv.getMethodName().equals($INVOKE_ASYNC))    && inv.getArguments() != null    && inv.getArguments().length == 3    && !GenericService.class.isAssignableFrom(invoker.getInterface())){    .......泛化调用处理逻辑......    }

    读到这里,这篇“Java怎么优雅的调用dubbo同时不使用其它jar包”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Java怎么优雅的调用dubbo同时不使用其它jar包

    本文链接: https://www.lsjlt.com/news/349381.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java怎么优雅的调用dubbo同时不使用其它jar包
      本文小编为大家详细介绍“Java怎么优雅的调用dubbo同时不使用其它jar包”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么优雅的调用dubbo同时不使用其它jar包”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
      99+
      2023-07-05
    • 详解Java如何优雅的调用dubbo同时不使用其它jar包
      目录1、正常dubbo调用流程2、如果想在不引用他人jar包的情况下如何调用呢1.获取泛化对象2.泛化调用入参处理3、总结1、正常dubbo调用流程 引入dubbo依赖 引入他人提供...
      99+
      2023-02-20
      Java调用dubbo Java调用dubbo不使用jar
    • 不使用他人jar包情况下优雅的进行dubbo调用详解
      目录1、正常dubbo调用流程2、如果想在不引用他人jar包的情况下如何调用呢?dubbo泛化调用-dubbo原生支持的优雅方法使用场景:如何使用:实现原理:3、总结1、正常dubb...
      99+
      2024-04-02
    • 怎么在Java中利用反射调用jar包中的类
      怎么在Java中利用反射调用jar包中的类?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面讲展示的是从image.jar包中调用image.Buddy类的方法。public&...
      99+
      2023-06-14
    • Java怎么优雅的使用策略模式
      本篇内容介绍了“Java怎么优雅的使用策略模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是策略模式策略模式是一种行为型模式,它将对象...
      99+
      2023-07-05
    • 打包Java项目时,使用NPM和LeetCode有什么不同?
      在日常的开发过程中,我们经常需要将自己开发的Java项目打包成可执行的Jar包或War包。而在这个过程中,有两个常用的工具:NPM和LeetCode。它们有什么不同呢?本文将介绍它们的区别以及如何使用它们来打包Java项目。 一、NPM和...
      99+
      2023-07-30
      npm leetcode 打包
    • java同一个包下的类怎么互相调用
      在同一个包下的类可以直接互相调用,不需要使用任何关键字或语法来指明调用关系。只需在需要调用的方法前面加上类名即可。例如,假设有两个类...
      99+
      2023-08-20
      java
    • 实时打包Java应用程序: 使用API的优点是什么?
      Java应用程序开发是当今软件开发领域中最受欢迎的方式之一。然而,Java应用程序的打包和部署可能会成为一项繁琐的任务。传统的Java打包方法涉及到手动编写配置文件、创建JAR文件和打包应用程序,这可能会导致错误和浪费时间。幸运的是,Ja...
      99+
      2023-11-01
      实时 打包 api
    • 使用java怎么生成不同的随机数
      这期内容当中小编将会给大家带来有关使用java怎么生成不同的随机数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. ...
      99+
      2023-06-14
    • 使用java怎么指定不同长度的二维数组
      本篇文章给大家分享的是有关使用java怎么指定不同长度的二维数组,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序...
      99+
      2023-06-06
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作