Dubbo泛化调用
简介
泛化调用是指在调用方没有服务方提供的 API 的情况下,对服务方进行调用,并且可以正常拿到调用结果。
泛化调用主要用于实现一个通用的远程服务 Mock 框架,通过实现 GenericService 接口处理所有服务请求,比如如下场景:
- 网关服务:如果要搭建一个网关服务,那么服务网关要作为所有 RPC 服务的调用端。但是网关本身不应该依赖于服务提供方的接口 API(否则每一个新的服务发布,都需要修改网关的代码并重新部署),所以需要泛化调用支持。
- 测试平台:如果要搭建一个可以测试 RPC 调用的平台,用户输入分组名、接口、方法名等信息,就可以测试对应的 RPC 服务。
下面,我用一系列 Demo 介绍如何使用 Dubbo 实现泛化调用。
配置
pom.xml
引入 Dubbo 依赖:
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.5</version>
</dependency>
使用 Zookeeper 作为配置中心(需要在本机安装好 zk):
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
application.yml
服务提供者为 Spring Boot 项目,需要在 application.yml 中配置 Dubbo:
server:
port: 8090
dubbo:
application:
version: 1.0.0
name: api-gateway-test-provider
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
scan:
base-packages: cn.wzz.gateway.interfaces
provider:
timeout: 30000
服务 Provider
rpc 模块项目结构:
服务接口IActivityBooth
:
public interface IActivityBooth {
// case1: 入参为字符串、整数等原生数据类型
String sayHi(String msg);
// case2: 入参为DTO 对象
String describeUser(User user);
// case3: 入参为 DTO 对象集合
String describeUsers(List<User> user);
// case4: 入参为泛型对象
String describeWrapper(Wrapper<User> userWrapper);
}
DTO 对象(User
和Wrapper
):
Wrapper
包装类,用于测试含泛型入参的泛化调用
public class User implements Serializable {
private String uid;
private Integer age;
private String nickName;
//getter/setter
}
public class Wrapper<T