• Govern EventBus


    Govern EventBus

    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}.
    

    快速上手

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

    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 ?
             */
        }
    }
    

    作者:Ahoo Wang (阿虎)

    Github: https://github.com/Ahoo-Wang/

    SmartSql(高性能、高生产力,超轻量级的ORM!): https://github.com/Ahoo-Wang/SmartSql

    SmartCode(不只是代码生成器!): https://github.com/Ahoo-Wang/SmartCode

    CoSky 高性能、低成本微服务治理平台 : https://github.com/Ahoo-Wang/CoSky

    CosId 通用、灵活、高性能的分布式 ID 生成器 : https://github.com/Ahoo-Wang/CosId

    Govern EventBus 历经多年生产环境验证的事件驱动架构框架: https://github.com/Ahoo-Wang/govern-eventbus


    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    wireshark 抓包rtp over tcp分析PS/H264负载的过程
    C++虚函数表
    MonoForAndroid 第一章 Android、移动设备和Marketplace 简介
    MonoForAndroid 分享用C#开发Android应用程序
    MonoForAndroid 第二章 Mono For Android 简介
    Java的垃圾回收机制及算法
    如何观测MySQL DDL的进度
    如何开启MySQL coredump
    MongoDB对日志文件进行归档的方法
    winform多线程修改界面lable
  • 原文地址:https://www.cnblogs.com/Ahoo-Wang/p/govern-eventbus.html
Copyright © 2020-2023  润新知