91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么優雅的調用dubbo同時不使用其它jar包

發布時間:2023-02-25 13:56:21 來源:億速云 閱讀:90 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Java怎么優雅的調用dubbo同時不使用其它jar包”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java怎么優雅的調用dubbo同時不使用其它jar包”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    1、正常dubbo調用流程

    引入dubbo依賴

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

    配置相同的注冊中心,使用@Reference注解注入對應的service接口(注意是Reference是dubbo包下的,不是spring那個)

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

    dubbo泛化調用-dubbo原生支持的優雅方法

    使用場景:

    消費者不希望引入生產者提供的clinet依賴;

    例如:消費者是一個基礎服務,需要調用很多生產者的dubbo方法,那他就要引入很多的jar包;

    消費者不使用java語言,而是使用其他的語言(例如:Python);

    如何使用:

    1.需要知道對方方法的全路徑名稱(interfaceName)

    2.如果對方的dubbo有指定的版本號(version)和組(group)要指定一下,不然有很大可能會調用不通

    3.要知道對方的注冊中心地址和連接方式(如果是在同一個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);
        /**
         * Mark this invocation as a generic impl call, this value will be removed automatically before passing on the wire.
         * See {@link RpcUtils#sieveUnnecessaryAttachments(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包”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    吴川市| 喀喇沁旗| 西平县| 乐清市| 清新县| 平凉市| 穆棱市| 迭部县| 托克逊县| 灵川县| 南漳县| 准格尔旗| 乌拉特前旗| 古浪县| 平潭县| 合阳县| 信宜市| 岚皋县| 望奎县| 屏边| 合山市| 麟游县| 彰武县| 青浦区| 北京市| 新沂市| 平果县| 丹棱县| 攀枝花市| 沙田区| 辽宁省| 东城区| 石景山区| 彰化县| 千阳县| 临澧县| 嵊州市| 泽州县| 尼玛县| 项城市| 迁安市|