什么是泛化调用?怎么实现Dubbo的泛化调用?代码怎么写?如果有疑问,请进!!

手写RPC框架之泛化调用 什么是泛化调用泛化调用就是在不依赖服务方接口jar包的情况下进行调用,包括对调用方法的泛化、参数的泛化和返回值的泛化。泛化调用的使用场景常规的PRC调用都是客户端依赖服务端提供的接口jar包,然后利用动态代理技术,像调用本地方法一样调用远程方法,但是有些场景下客户端无法依赖jar包,也要调用远程方法,这时就需要用到泛化调用了。 阅读详情

最近无意中了解了泛化调用,起初云里雾里的,后面跟着官方的示例走了一遍,通过思考知道它是什么了。

什么是泛化调用?

它主要应对一种场景的,我要调用某些服务的某些接口,但是我并不知道有哪些系统,所以也就没有办法通过Jar包方式依赖,这种解决方案呢,除了HTTP呢,也可以RPC,但是前提呢就需要被调用的某些服务通过某种方式主动注册到注册中心,也就是服务提供者,而这边呢从注册中心拿到注册的信息以及接口信息(相当于消费端),拿到以后可以使用Dubbo泛化调用方式(也可以用其他方式)来调用服务端的接口。 

通俗来讲就是你需要启动你的服务注册中心(本节用zookeeper),然后你需要将服务放入到注册中心中,消费端(网关、测试平台等情形)使用时则去注册中心找到信息,通过Dubbo泛化调用GenericService.$invoke()调用到对应的服务接口中。

我们会讲下代码,不过首先要安装zookeper,本地版本有可以跳过,注意代码里的版本和你安装的版本,如果差太多,启动服务会连不上zookeper。

 2.安装zookerper

Windows安装Zookeeper,链接如下,我下载安装的是3.6.4的 apache-zookeeper-3.6.4-bin.tar.gz 包

https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/

 下载后解压压缩包,然后添加data文件

接着进入conf文件, 讲zoo_sample.cfg复制一份,然后将复制的那份更改为zoo.cfg文件

然后编辑 zoo.cfg文件,将dataDir属性更改为我们的data目录地址

然后配置环境变量,点击环境变量,点击新建,名字为:ZOOKEEPER_HOME,然后填写我们的目的路径

然后点击path进去编辑 ,把ZOOKEEPER_HOME写上,按如下的就可以啦,退出时全部选确定。

 然后打开cmd,输入zkserver,就启动成功啦,端口号是2181

3.代码

大家可以借鉴dubbo官网的搭建方式,链接如下,还是很详细的。

https://cn.dubbo.apache.org/zh-cn/overview/quickstart/java/spring-boot/

 你按官方文档安装你就会有如下的代码结构。

dubbo-springboot-demo-provider:为服务提供者

dubbo-springboot-demo-interface:服务接口,共享的接口

dubbo-springboot-demo-consumer:服务消费者

3.1 dubbo-springboot-demo-interface

咱们先来说下服务共享者,很简单,我们只定义了一个接口叫DemoService,并定义了方法sayHello

/**
 * @Author df
 * @Description: TODO
 * @Date 2024/3/5 10:47
 */
public interface DemoService {
    String sayHello(String name);
}

它的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbo-spring-boot-demo</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-spring-boot-demo-interface</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
</project>

3.2 dubbo-springboot-demo-provider

然后服务提供者,类DemoServiceImpl,实现DemoService,也就是说它依赖dubbo-springboot-demo-interface的jar。

/**
 * @Author df
 * @Description: TODO
 * @Date 2024/3/5 10:56
 */
@DubboService
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

服务提供者还要提供启动服务的入口,所以需要下面这个代码,因为只有启动代码,才能把自己的接口注册到服务中心里。

/**
 * @Author df
 * @Description: TODO
 * @Date 2024/3/5 11:26
 */
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

 它的application.yml文件

dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://169.254.165.11:2181

它的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbo-spring-boot-demo</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-spring-boot-demo-provider</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>dubbo-spring-boot-demo-interface</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-reload4j</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- spring boot starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>dubbo-spring-boot-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

</project>

3.3 dubbo-springboot-demo-consume

在消费者中我们定义了Task类,实现CommandLineRunner,代表项目启动执行一次run方法,然后我们取DemoService,当然这里要用 @DubboReference,拿到以后直接调用方法就ok了。

在定义一个循环线程一直执行方法拿到结果打印来做测试。


/**
 * @Author df
 * @Description: TODO
 * @Date 2024/3/5 11:44
 */
@Component
public class Task implements CommandLineRunner {

    @DubboReference
    private DemoService demoService;

    // 消费者调用RPC生产者消息
    // CommandLineRunner在程序启动后执行run方法,
    @Override
    public void run(String... args) throws Exception {
        String result = demoService.sayHello("world");
        System.out.println("two-Receive result ======> " + result);

       new Thread(()-> {
           while (true) {
                try {
                    Thread.sleep(1000);
                    System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Thread.currentThread().interrupt();
                }
            }
        }).start();
    }
}

消费者也需要启动程序,所以我们也加一个程序的启动入口。

/**
 * @Author df
 * @Description: TODO
 * @Date 2024/3/5 11:27
 */
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

消费者的 application.yml,也是需要将自己本身服务注册到服务中心。

dubbo:
  application:
    name: dubbo-springboot-demo-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://${zookeeper.address:127.0.0.1}:2181

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbo-spring-boot-demo</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-spring-boot-demo-consumer</artifactId>


    <dependencies>

        <dependency>
            <groupId>org.example</groupId>
            <artifactId>dubbo-spring-boot-demo-interface</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-reload4j</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- spring boot starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

    </dependencies>

</project>

他们的父类pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>dubbo-spring-boot-demo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>dubbo-spring-boot-demo-interface</module>
        <module>dubbo-spring-boot-demo-provider</module>
        <module>dubbo-spring-boot-demo-consumer</module>
    </modules>

    <properties>
        <dubbo.version>3.0.8</dubbo.version>
        <spring-boot.version>2.7.7</spring-boot.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Dubbo -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

先启动服务提供接口,打印如下控制台信息,代表我们已经连上zookeper了,等待消费者消费呢。

我们在启动消费者的服务,消费者就调用到我们对应的方法啦。

 我们现在之所以能调用到对应的服务是因为我们消费方依赖了共用接口,如果我们现在不依赖了,就没有办法用上面的方式了,就需要用到GenericService,我们来实现下。

我们在创建一个FHTask类,代码如下, 通过@DubboReference将接口信息传入,再通过genericService.$invoke将方法和参数类型和参数传入,最后会调用到最终的实现类,拿到结果打印下就OK。

/**
 * @Author df
 * @Description: TODO
 * @Date 2024/3/5 11:44
 */
@Order(1)
@Component
public class FHTask implements CommandLineRunner {

    // 泛化调用,不主动获取没有依赖情况下
    @DubboReference(interfaceName = "org.apache.dubbo.springboot.demo.DemoService")
    GenericService genericService;

    // 消费者调用RPC生产者消息
    // CommandLineRunner在程序启动后执行run方法,
    @Override
    public void run(String... args) throws Exception {
        // 拿到接口关键信息,重新构建个请求
        Object result = genericService.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"fh-Invoke"});
        System.out.println("Receive result ======> " + result);
    }
}

 由于没有了interface的依赖,所以需要将Task注释掉,代码如下,

@Order(2)
@Component
public class Task implements CommandLineRunner {

    //@DubboReference
    //private DemoService demoService;

    // 消费者调用RPC生产者消息
    // CommandLineRunner在程序启动后执行run方法,
    @Override
    public void run(String... args) throws Exception {
       // String result = demoService.sayHello("world");
        //System.out.println("two-Receive result ======> " + result);

//        new Thread(()-> {
//            while (true) {
//                try {
//                    Thread.sleep(1000);
//                    System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                    Thread.currentThread().interrupt();
//                }
//            }
//        }).start();
    }
}

启动服务者和消费者,也还是调用到具体的方法啦。

 它主要是根据注册的接口信息,以及方法,参数等信息去注册中心找到对应匹配的实现类,进行调用方法,这样我们自己就不用写复杂的业务代码就能实现了没有依赖情况代码功能的调用使用。

一看就会!Dubbo 泛化调用简明教程——含不同类型入参处理 Dubbo 泛化调用入门教程,案例详细,简洁易懂! 阅读详情

相关推荐

gRPC 中泛化调用服务接口

gRPC 中泛化调用服务接口 gRPC 没有直接支持泛化调用,protobuf 可以不依赖于生成的代码实现调用,所以可以通过反射接口间接实现泛化调用 要求 Server 端提供 grpc.reflection.v1alpha.ServerReflection 服务,用于获取服务的描述文件 大致的流程是: 根据方法名称,调用服务端反射服务的方法,获取方法所在 proto 文件的描述 根据 proto 描述文件,获取文件描述、服务描述,用于重新构建要被调用方法的方法描述 MethodDescriptor 根据

啦啦啦啦 la 4110

RPC泛化调用普及&应用(看完还不懂的可以用钱砸死我)

一、概念镇场子,场景知其然 1.什么是泛化调用? 泛化调用是指在调用方没有服务方提供的API(SDK)的情况下,对服务方进行调用,并且可以拿到调用结果。 2.什么时候会用到泛化调用? 测试集成平台 我们要搭建一个统一的测试平台,可以让各个业务方在测试平台中通过输入接口、分组名、方法名以及参数值,在线测试自己发布的RPC服务。这时我们就有一个问题要解决,我们搭建统一的测试平台实际上是作为各个RPC服务的调用端,而在RPC框架的使用中,调用端是需要依赖服务提供方提供的接口API的,而统一测试平台不可能依赖所有服

风雨一更 1万+

Dubbo泛化调用入门到精通

Dubbo 泛化调用、阿里的好舒服的泛化调用都是类似的功能。最近给同事排查一个dubbo-admin 控制台调用报错的问题的小研究,为此还给社区提了一个issue,具体可以查看链接 dubbo-admin 泛型参数测试 ClassNotFoundException 看了最新版本好像自动去掉了出现泛型<这样的信息通通干掉,不过没有发布release版本。 参考文档:使用泛化调用 1、泛化调用 1.1 概念 泛化接口调用方式主要用于客户端没有 API 接口(泛化调用是指不需要依赖服务的二方包)及.

汪小哥 7458

Dubbo接口的泛化调用

Dubbo接口的泛化调用

mianhuabushitang的博客 6294

基于SpringBoot的Dubbo泛化调用的实现

Dubbo的泛化调用不需要引入调用方的接口,只需要指定接口的全类名,就可以调用服务,一般用于框架集成。接下来就基于SpringBoot实现了Dubbo的泛化调用。 1、服务端定义 1.1 服务定义及实现 package com.smart.springboot.api; public interface HelloServiceFacade { void ...

u014046563的专栏 2353

Dubbo3泛化调用实战指南

Dubbo3的泛化调用机制支持客户端无需依赖服务接口即可发起远程调用,适用于动态场景。客户端通过GenericService接口或XML配置实现方法动态调用,需指定完整参数类型。服务端需实现GenericService接口处理泛化请求,并通过Spring或API方式暴露服务。典型应用包括网关转发、跨语言调用(需Triple协议)和测试调试。需注意参数需全限定名、存在额外序列化开销及返回值需手动转换。Dubbo3保持对Dubbo2的兼容性,推荐使用Triple协议提升

HTTP404_CN的博客 1697

超越接口:探索Dubbo的泛化调用机制

本文将深入探讨 Dubbo 中的泛化调用(Generic Invocation)功能,这是 Dubbo 框架中一个强大且灵活的特性。我们将介绍泛化调用的基本概念和工作原理,并提供实际示例,演示如何在 Dubbo 微服务架构中灵活地使用泛化调用实现动态 RPC 调用。无论您是 Dubbo 的新手还是经验丰富的用户,本文都将为您揭示如何利用泛化调用提高微服务架构的灵活性和可扩展性。

todoitbo的博客 12万+

dubbo springboot+dubbo泛化的使用,以及开发时直连本地的dubbo服务(dubbo指定点对点调用服务)

一般情况我们使用dubbo通过rpc调用dubbo提供方的服务,首先要在消费者的项目中引入接口提供者的jar包(provider端暴露的接口和方法),然后使用jar包里面的类和方法,两端才能正常通信调用。但是如果要调N个不同服务提供者的接口,就要引入N个jar包,这时候消费者项目有N多个dubbo提供者的jar,项目耦合度就会很大。我们可以用dubbo的泛化实现调用dubbo服务,泛化调用不需要引入provider提供的jar即可实现远程调用,降低耦合。区别就在于参数和返回值中所有的POJO都用Map表示。

新林的博客 4570

Dubbo笔记 ⑱ :泛化调用 & 泛化实现

一、前言 二、泛化调用 1. 泛化调用 2. 泛化实现 泛化调用分两种情况 消费端非泛化,服务端泛化 消费端泛化,服务端不泛化 消费、服务都泛化 三、源码实现 1.1 GenericImplInvokerFilter /** * GenericImplInvokerFilter */ @Activate(group = Constants.CONSUMER, value = Constants.GENERIC_KEY, order = 20000) public class GenericImpl

猫吻鱼的博客 7027

unity中判断是否联网,判断网络状态的两种方式

unity中判断是否联网,判断网络状态的两种方式

wla2996gpy032的博客 1876

SRAM compiler中Power Gating与Retention的实战配置指南

本文深入解析了在SRAM compiler中配置Power Gating(电源门控)与Retention(数据保持)功能的实战指南。针对低功耗芯片设计,文章详细阐述了如何根据应用场景(如移动AP、IoT设备)权衡开关类型、尺寸、唤醒时序以及保持电压,以实现静态功耗优化与数据可靠性的最佳平衡,并强调了后端实现与签核检查的关键要点。

weixin_29204121的博客 296

Dubbo泛化调用原理及使用

Dubbo 泛化调用是一种在分布式服务框架 Dubbo 中实现的服务调用机制,它允许服务消费者在没有服务提供者接口定义的情况下进行服务调用。透传式调用,发起方只是想调用提供者拿到结果,没有过多的业务逻辑诉求,即使有,也是拿到结果后再继续做分发处理。代理服务,所有的请求都会经过代理服务器,而代理服务器不会感知任何业务逻辑,只是一个通道,接收数据 -> 发起调用 -> 返回结果,调用流程非常简单纯粹。前端网关。

qq_29388687的博客 2447

大话西游2经典单机版V8:一键架设+GM全功能+仙玉自由修改

本文详细介绍大话西游2经典单机版V8的一键架设教程和GM全功能使用指南,包括仙玉自由修改技巧。该版本无需虚拟机,解压即玩,完美还原官服经典玩法,支持离线运行,是老玩家重温经典和新玩家体验游戏的理想选择。

weixin_27303545的博客 1133

dubbo的调用原理及泛化调用

简单介绍 dubbo是阿里开源出来的一个rpc框架,主要是用于微服务分布式项目的远程调用,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现,下面是调用的原理图: dubbo框架的整体设计: 图例说明: 1,图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。 2,图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Confi

♾️ 5744

深入浅出横向联邦学习、纵向联邦学习、联邦迁移学习

深入浅出解析横向联邦学习(Horizontal Federated Learning)、纵向联邦学习(Vertical Federated Learning)和联邦迁移学习(Federated Transfer Learning)有多个机构(比如几家不同的银行,或者几家医院)都拥有一些数据,他们希望联合起来训练一个更强大的机器学习模型,但出于隐私保护或法规要求,他们不能直接把数据共享出来。联邦学习就是为了解决这个问题而提出的。它的核心思想是“数据不动模型动”,即数据保留在本地,参与方共同训练模型。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2465

5个必知的脑网络图论指标:从聚类系数到小世界特性(附BCT工具包使用指南)

本文深度解析脑网络图论分析中五个核心指标:聚类系数、特征路径长度、全局效率、局部效率及节点效率,并详解其计算与解读。结合Brain Connectivity Toolbox工具包,提供从实战计算、常见报错解决到小世界特性统计检验的完整指南,帮助研究者跨越理论与实操鸿沟,让连接矩阵数据真正服务于神经科学研究。

blue42的博客 925

Dubbo 的泛化调用

在分布式系统中,有时我们需要调用一些未知的服务接口,这些接口可能在编译时并不存在,或者由于版本问题而发生变化。为了应对这种情况,Apache Dubbo 提供了泛化调用(Generic Invocation)功能,使得开发者可以在无需依赖具体服务接口的情况下进行服务调用。本文将详细介绍 Dubbo 的泛化调用,包括其原理、实现方式和应用场景。

FireFox1997 1361

Oracle 查看 rman 备份情况 SQL 语句

每天一个 DBA 小知识,助你更进一步!

LuciferLiu_DBA 3119

dubbo泛化调用

dubbo泛化调用

qq_36042938的博客 4025

【面试系列】软件架构师 高频面试题及详细解答

本文介绍了软件架构师岗位的初级、中级和高级面试题及详细解答,涵盖了系统设计、面向对象设计、分布式系统、云计算技术、性能优化等关键领域。通过这些问题和解答,候选人可以深入理解软件架构师的核心职责和技能要求。此外,文章总结了在面试中需要掌握的常考知识点,包括架构模式、分布式系统管理、安全性、数据管理和DevOps实践。通过掌握这些知识点,软件架构师能够有效设计和指导复杂系统的结构,确保系统的可扩展性、性能和维护性。

在路上的专栏 850

构建栅格地图matlab代码

1 使用MATLAB实现地图栅格化 效果图如下所示 图1 ...

qq_59747472的博客 4518

Dubbo泛化调用

dubbo消费端,一般必须依赖服务端提供的api包,服务端api包一旦升级,消费端也要跟着升级(依赖的情况下),不像spring cloud一样,采用rest协议,对服务端的api依赖几乎可以没有,不过dubbo也有rest协议扩展,见当当网dubbox,也有jsonrpc协议的扩展,见https://github.com/apache/incubator-dubbo-rpc-jsonrpc...

数据与算法架构提升之路专栏 3374

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

dubbo泛化调用原理

泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过GenericService调用所有服务实现。 截图为qunar的dubbo服务测试框架, 只需将参数按照指定的格式填入, 就可以直接调用相应的dubbo接口. 使用 泛化调用需要接口声明为泛化, 可以在声明接口的时候指定, <d...

qq_39235296的博客 3849

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Dubbo的RPC泛化调用

Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下,对服务方进行调用并获取结果的技术。主要用于实现一个通用的远程服务Mock框架,通过实现GenericService接口来处理所有服务请求。

猪猪 1532

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Dubbo框架的第三道泛化调用

今天,我们从Web服务器一段常见的代码调用开始,用反射调用和泛化调用两种调用方案做了不同尝试,核心仍然是希望简化开发人员代码编写,提升功能通用性。反射调用方案,只需要通过接口对象、方法名、入参对象就可以完成远程调用,但仍然无法规避多个URL、多个控制器方法、多个下游接口字段等的定义。接着在Spring官方文档的指导下,我们根据占位符的概念,重新设计URL格式,把调用下游的接口类名、方法名利用占位符的方式定义到URL中。

qq_33240556的博客 1300

dubbo使用GenericService泛化调用

我们项目中常见场景,java应用内部接口都是使用dubbo,某个非java应用需要调用我们的接口的时候,无法使用dubbo,这是我们需要给它提供其他形式的接口,如restful api等等,这时我们需要为这个接口开发而增加额外的工作量。这时候就可以使用dubbo提供的GenericService来调用dubbo接口了,而使用GenericService调用接口的好处是不需要依赖服务提供方给的int...

a490789580的博客 1万+
上一篇: 讲享元设计模式,顺便~学会了数据库连接池,
下一篇: 什么是组合设计模式?组合模式实战代码
PromisingGirl-Du
博客等级 码龄9年 1143粉丝 225原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值