DamiBus v1.1.0 发布(给单体多模块解耦)

DamiBus,专为单体多模块之间通讯解耦而设计(尤其是未知模块、隔离模块、领域模块)。零依赖。

特点

结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用。

  • 支持事务传导(同步分发、异常透传)
  • 支持事件标识、拦截器(方便跟踪)
  • 支持监听者排序、附件传递(多监听时,可相互合作)
  • 支持 Bus 和 Api 两种体验风格

与常见的 EventBus、ApiBean 的区别

DamiBus EventBus Api DamiBus 的情况说明
广播 有 有 无 发送(send) + 监听(listen) 以及 Api 模式
应答 有 无 有 调用(call) + 监听(listen) + 答复(reply) 以及 Api 模式
耦合 弱- 弱+ 强++

如果涉及类加载器隔离:请在主程序标为编译,在其它模块标为可选。

本次更新了什么?

新版本简化了体验!

  • 调整 DamiBus:sendAndSubscribe 标为弃用
  • 调整 DamiBus:sendAndRequest 标为弃用(由 call 替代)
  • 调整 Payload:isSubscribe 标为弃用
  • 调整 Payload:isRequest 标为弃用(由 requiredReply 替代)
  • 添加 DamiBus:call 方法,意为调用(要求有一个答复)
  • 添加 Payload:requiredReply 方法,意为要求答复(或必须答复)

性能测试?

瞬发 1000万个事件,1秒左右可发完(基于 jdk11 测试):

java 复制代码
public class SendTest {
    static Integer count = 0;

    public static void main(String[] args) {
        Dami.bus().listen("test.demo", e -> { count = count + 1; });

        long start = System.currentTimeMillis();
        for (int i = 0; i < 10_000_000; i++) {
            Dami.bus().send("test.demo", "1");
        }
        System.out.println(System.currentTimeMillis() - start + "::" + count);
    }
}

疑问:

为什么不用分布式消息队列呢?定位不同(侧重,单体多模块解耦)。

示例

demo21_send

java 复制代码
//总线风格。bus()
public class Deom11 {
    static String topic = "demo.hello";

    public static void main(String[] args) {
        //监听事件
        Dami.bus().listen(topic, payload -> {
            System.err.println(payload); //可以有多个订阅
        });
        Dami.bus().listen(topic, payload -> {
            CompletableFuture.runAsync(()-> { //也可以异步消费
                System.err.println(payload);
            });
        });


        //发送事件
        Dami.bus().send(topic, "{name:'noear',say:'hello'}");
    }
}

demo12_call

java 复制代码
//泛型总线风格。<C,R>bus()
public class Demo12 {
    static String topic = "demo.hello";

    public static void main(String[] args) {
        //监听事件
        Dami.<String,String>bus().listen(topic, payload -> {
            System.err.println(payload);

            if (payload.requiredReply()) {
                payload.reply("hi!"); 
            }
        });


        //发送事件 //要求有答复(即,返回值)
        String rst1 = Dami.<String,String>bus().call(topic, "world"); 
        //发送事件 //要求有答复(即,返回值) //支持默认值(没有订阅时触发)
        //String rst1 = Dami.<String,String>bus().call(topic, "world", ()->"demo"); 
        System.out.println(rst1);
    }
}

项目地址

相关推荐
海的透彻3 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat3 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习4 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one4 小时前
算法--构造
java·数据结构·算法
SL_staff4 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff5 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko75 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.6 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff6 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
代码山河7 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目