dami - lpc 之本地(单体)过程调用
Lpc 是相对于 Rpc 的本地概念(本地过程调用)。为单体多模块项目提供解耦支持。
1、本地过程调用
通过总线,把本地没有关系的 “服务消费者” 和 “服务提供者” 实现接口调用。从而实现“解耦”。
//服务消费者
public interface UserService {
Long getUserId(String name);
}
//服务提供者(或实现)
public class UserServiceImpl {
public Long getUserId(String name) {
return 99L;
}
}
public class DemoApp {
public static void main(String[] args) throws Exception {
//注册服务实现(监听事件)
Dami.lpc().registerService("demo", new UserServiceImpl());
//生成服务消费者(发送事件)
UserService userService = Dami.lpc().createConsumer("demo", UserService.class);
userService.getUserId("noear");
}
}
2、LPC 的内部处理
流事件的内部同样是“通用事件”(仅是一种体验简化)。改成“通用事件”。
- 把服务侧改为“通用事件”处理
LPC 默认编码处理,会把方法的参数编码成 Map 做为载核数据。注意主题的变化,要与方法名对应起来。
public class DemoApp {
public static void main(String[] args) throws Exception {
//注册服务实现(监听事件)
//Dami.lpc().registerService("demo", new UserServiceImpl());
Dami.bus().<CallPayload<Map<String,Object>, Long>>listen("demo.getUserId", event -> {
//获取参数
String name = (String) event.getPayload().getData().get("name");
event.getPayload().getSink().complete(99L);
});
//生成服务消费者(发送事件)
UserService userService = Dami.lpc().createConsumer("demo", UserService.class);
userService.getUserId("noear");
}
}
- 把消费侧改为“通用事件”处理
注意主题的变化,要与方法名对应起来。
public class DemoApp {
public static void main(String[] args) throws Exception {
//注册服务实现(监听事件)
Dami.lpc().registerService("demo", new UserServiceImpl());
//生成服务消费者(发送事件)
//UserService userService = Dami.lpc().createConsumer("demo", UserService.class);
//userService.getUserId("noear");
Long rst = Dami.bus().<CallPayload<Map<String,Object>, Long>>send("demo.getUserId", new CallPayload<>(Utils.asMap("name", "noear")))
.getPayload()
.getSink()
.get();
System.err.println(rst);
}
}