八、 泛化调用
1. 特性说明
泛化调用是指在调用方没有服务方提供的API(SDK)的情况下,对服务方进行调用,并且可以正常拿到调用结果。
2. 使用场景
泛化调用主要用于实现一个通用的远程服务Mock框架,可通过实现GenericService接口处理所有服务请求。比如如下场景:
• 网关服务:如果要搭建一个网关服务,那么服务网关要作为所有RPC服务的调用端。但是网关本身不应该依赖于服务提供方的接口API(这样会导致每有一个新的服务发布,就需要修改网关的代码以及重新部署),所以需要泛化调用的支持。
• 测试平台:如果要搭建一个可以测试RPC调用的平台,用户输入分组名、接口、方法名等信息,就可以测试对应的RPC服务。那么由于同样的原因(即会导致每有一个新的服务发布,就需要修改网关的代码以及重新部署),所以平台本身不应该依赖于服务提供方的接口API。所以需要泛化调用的支持。
3. 使用方式
demo可见dubbo项目中的示例代码。
API部分以此demo为例讲解使用方式。
1) 服务定义
服务接口
服务实现类
public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "sayHello: " + name; } @Override public CompletableFuture<String> sayHelloAsync(String name) { CompletableFuture<String> future = new CompletableFuture<>(); new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } future.complete("sayHelloAsync: " + name); }).start(); return future; } @Override public CompletableFuture<Person> sayHelloAsyncComplex(String name) { Person person = new Person(1, "sayHelloAsyncComplex: " + name); CompletableFuture<Person> future = new CompletableFuture<>(); new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } future.complete(person); }).start(); return future; } @Override public CompletableFuture<GenericType<Person>> sayHelloAsyncGenericComplex(String name) { Person person = new Person(1, "sayHelloAsyncGenericComplex: " + name); GenericType<Person> genericType = new GenericType<>(person); CompletableFuture<GenericType<Person>> future = new CompletableFuture<>(); new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } future.complete(genericType); }).start(); return future; } }