Solon v3.5.2

dami - lpc 之本地(单体)过程调用

</> markdown

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);
    }
}