当前位置: 首页 > 软件库 > 程序开发 > 微服务框架 >

Govern EventBus

事件驱动架构框架
授权协议 Apache
开发语言 Java
所属分类 程序开发、 微服务框架
软件类型 开源软件
地区 国产
投 递 者 笪欣嘉
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Govern EventBus 是一个历经四年生产环境验证的事件驱动架构框架, 通过事件总线机制来治理微服务间的远程过程调用。 使用本地事务来支持微服务内强一致性,事件总线来实现微服务间的最终一致性,另外还提供了事件发布/订阅失败的自动补偿机制。

执行流

Govern EventBus

安装

初始化 db

create table compensate_leader
(
    name varchar(16) not null
        primary key,
    term_start bigint unsigned not null,
    term_end bigint unsigned not null,
    transition_period bigint unsigned not null,
    leader_id varchar(100) not null,
    version int unsigned not null
);

create table publish_event
(
    id bigint unsigned auto_increment
        primary key,
    event_name varchar(100) not null,
    event_data mediumtext not null,
    status smallint unsigned not null,
    published_time bigint unsigned default 0 not null,
    version smallint unsigned not null,
    create_time bigint unsigned not null
);

create index idx_status
    on publish_event (status);

create table publish_event_compensate
(
    id bigint unsigned auto_increment
        primary key,
    publish_event_id bigint unsigned not null,
    start_time bigint unsigned not null,
    taken bigint unsigned not null,
    failed_msg text null
);

create table publish_event_failed
(
    id bigint unsigned auto_increment
        primary key,
    publish_event_id bigint unsigned not null,
    failed_msg text not null,
    create_time bigint unsigned not null
);

create table subscribe_event
(
    id bigint unsigned auto_increment
        primary key,
    subscribe_name varchar(100) not null,
    status smallint unsigned not null,
    subscribe_time bigint unsigned not null,
    event_id bigint unsigned not null,
    event_name varchar(100) not null,
    event_data mediumtext not null,
    event_create_time bigint unsigned not null,
    version smallint unsigned not null,
    create_time bigint unsigned not null,
    constraint uk_subscribe_name_even_id_event_name
        unique (subscribe_name, event_id, event_name)
);

create index idx_status
    on subscribe_event (status);

create table subscribe_event_compensate
(
    id bigint unsigned auto_increment
        primary key,
    subscribe_event_id bigint unsigned not null,
    start_time bigint unsigned not null,
    taken int unsigned not null,
    failed_msg text null
);

create table subscribe_event_failed
(
    id bigint unsigned auto_increment
        primary key,
    subscribe_event_id bigint unsigned not null,
    failed_msg text not null,
    create_time bigint unsigned not null
);

insert into compensate_leader
(name, term_start, term_end, transition_period, leader_id, version)
values ('publish_leader', 0, 0, 0, '', 0);

insert into compensate_leader
(name, term_start, term_end, transition_period, leader_id, version)
values ('subscribe_leader', 0, 0, 0, '', 0);

Gradle

val eventbusVersion = "0.9.2";
    implementation("me.ahoo.eventbus:eventbus-spring-boot-starter:${eventbusVersion}")
    implementation("me.ahoo.eventbus:eventbus-spring-boot-autoconfigure:${eventbusVersion}") {
        capabilities {
            requireCapability("me.ahoo.eventbus:rabbit-bus-support")
            //requireCapability("me.ahoo.eventbus:kafka-bus-support")
        }
    }

Maven

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <artifactId>demo</artifactId>
    <properties>
        <eventbus.version>0.9.2</eventbus.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>me.ahoo.eventbus</groupId>
            <artifactId>eventbus-spring-boot-starter</artifactId>
            <version>${eventbus.version}</version>
        </dependency>
        <dependency>
            <groupId>me.ahoo.eventbus</groupId>
            <artifactId>eventbus-rabbit</artifactId>
            <version>${eventbus.version}</version>
        </dependency>
        <!--<dependency>-->
        <!--    <groupId>me.ahoo.eventbus</groupId>-->
        <!--    <artifactId>eventbus-kafka</artifactId>-->
        <!--    <version>${eventbus.version}</version>-->
        <!--</dependency>-->
    </dependencies>
</project>

Spring Boot Application Config

spring:
  application:
  name: eventbus-demo
  datasource:
    url: jdbc:mysql://localhost:3306/eventbus_db?serverTimezone=GMT%2B8&characterEncoding=utf-8
    username: root
    password: root
  rabbitmq:
    host: localhost
    username: eventbus
    password: eventbus

govern:
  eventbus:
    rabbit:
      exchange: eventbus
    compensate:
      db:
        publish:
          schedule:
            initial-delay: 30
            period: 10
        subscribe:
          schedule:
            initial-delay: 30
            period: 10
        enabled: true
    subscriber:
      prefix: ${spring.application.name}.

快速上手

一般情况下 Publisher 与 Subscriber 不在同一个应用服务内。 这里只是作为演示用途。

Demo

Publisher

/**
 * 定义发布事件
 */
public class OrderCreatedEvent {
    private long orderId;

    public long getOrderId() {
        return orderId;
    }

    public void setOrderId(long orderId) {
        this.orderId = orderId;
    }

    @Override
    public String toString() {
        return "OrderCreatedEvent{" +
                "orderId=" + orderId +
                '}';
    }
}
package me.ahoo.eventbus.demo.service;

import me.ahoo.eventbus.core.annotation.Publish;
import me.ahoo.eventbus.demo.event.OrderCreatedEvent;
import org.springframework.stereotype.Service;

/**
 * @author ahoo wang
 */
@Service
public class OrderService {

    @Publish
    public OrderCreatedEvent createOrder() {
        OrderCreatedEvent orderCreatedEvent = new OrderCreatedEvent();
        orderCreatedEvent.setOrderId(1L);
        return orderCreatedEvent;
    }
}

Subscriber

package me.ahoo.eventbus.demo.service;

import lombok.extern.slf4j.Slf4j;
import me.ahoo.eventbus.core.annotation.Subscribe;
import me.ahoo.eventbus.demo.event.OrderCreatedEvent;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class NoticeService {

    @Subscribe
    public void handleOrderCreated(OrderCreatedEvent orderCreatedEvent) {
        log.info("handleOrderCreated - event:[{}].", orderCreatedEvent);
        /**
         * 执行相应的业务代码
         * send sms / email ?
         */
    }
}
 相关资料
  • translated_page: https://github.com/PX4/Devguide/blob/master/en/middleware/drivers.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e 驱动框架 PX4的代码库使用一个轻量级的,统一的驱动抽象层:DriverFramework. POSIX和 QuR

  • 问题内容: 尽管Java的简单,接口驱动的事件通知框架早于寒武纪就已经存在(例如,java.beans.PropertyChangeSupport),但是使用注释驱动的事件通知的框架正变得越来越流行。 有关示例,请参见JBossCache 2.2。侦听器类的侦听器方法带有注释,而不是遵循严格的接口。因为您不必编写您不感兴趣的侦听器回调的空实现(而且是的,我知道侦听器适配器超类),所以这更容易编程和

  • 本文向大家介绍Nginx学习笔记之事件驱动框架处理流程,包括了Nginx学习笔记之事件驱动框架处理流程的使用技巧和注意事项,需要的朋友参考一下 ngx_event_core_module模块的ngx_event_process_init方法对事件模块做了一些初始化。其中包括将“请求连接”这样一个读事件对应的处理方法(handler)设置为ngx_event_accept函数,并将此事件添加到epo

  • 本文向大家介绍解释行为驱动框架。,包括了解释行为驱动框架。的使用技巧和注意事项,需要的朋友参考一下 行为驱动框架从项目中的所有涉众那里获取信息,比如开发人员、测试人员、产品所有者、经理、客户和业务分析师。这个想法是为了让项目的每个成员都有相同的理解。 行为驱动框架致力于团队中每个人之间的协作和协调。技术编码知识是不必要的,因为功能需求或规范是用非技术性的,通用的语言描述的。 在自动和手动测试人员设

  • 本文向大家介绍说明数据驱动框架和关键字驱动框架之间的差异。,包括了说明数据驱动框架和关键字驱动框架之间的差异。的使用技巧和注意事项,需要的朋友参考一下 下文介绍了数据驱动框架和关键字驱动框架之间的差异。 在数据驱动的测试中,我们可以借助参数化对多个组合的多个数据进行测试。在这里,数据被视为测试脚本逻辑的输入。每个数据集都可以视为一个单独的测试用例。 在关键字驱动的测试中,开发的关键字表示动作。依序

  • 本文向大家介绍解释数据驱动的框架。,包括了解释数据驱动的框架。的使用技巧和注意事项,需要的朋友参考一下 数据驱动框架用于将测试脚本逻辑与测试数据分离。在此框架中,我们可以在参数化的帮助下,使用多个组合的多组数据来运行测试脚本。测试数据保存在单独的文件中,例如excel,access,txt等。 测试脚本需要连接到这些外部文件以获取数据。该框架的主要目的是针对各种数据集运行我们的测试脚本,从而减少测

  • 背景与概述 Sensor 是物联网重要的一部分,“Sensor 之于物联网”相当于“眼睛之于人类”。人没有眼睛就看不到这大千的花花世界,物联网没有了 Sensor 更是不能感知这变化万千的世界。 现在,为物联网开发的 Sensor 已经很多了,有加速度计(Accelerometer),磁力计(Magnetometer),陀螺仪(Gyroscope),光感计(Ambient light sensor