Integrate with Hyperledger Fabric using REST and Kafka with Block and Chaincode Event emitter.

Overview

Hyperledger Fabric REST Integration

Description:-

This artifact provides a mechanism to invoke and query fabric chaincode using a REST-based API interface.
Additionally, it can also invoke chaincode using a asynchronous method and can publish chaincode events to Kafka/Event-Hub topics.

Key Feature:-

  1. Invoke Chaincode with REST.
  2. Query Chaincode with REST.
  3. Invoke Chaincode with Kafka/Event-Hub.
  4. Publish chaincode events from multiple channels to Kafka/Event-Hub.

Prerequisites:-

  1. Fabric 2.x network.
  2. Connection Profile YAML file.
  3. Wallet (.id) file.
  4. Java and Maven is installed.
  5. (Optional) Kafka/Event-Hub configuration for invoking chaincode asynchronously.
  6. (Optional) Kafka/Event-Hub configuration for publishing chaincode events.

Running Locally:-

  1. Download/Clone the repository and build the project using mvn clean install
  2. Create a folder wallet in the root directory of the project.
  3. If using fabric-getting-started script, note the path to CA Pem file for Org1.
    Usually located in fabric-getting-started/test-network/organizations/peerOrganizations/org1.example.com/ca folder.
  4. Open EnrollAdmin.java and set the pemFilePath variable with value noted above and run. This will create admin.id in the wallet folder.
  5. Open RegisterUser and set the pemFilePath variable with value noted above and run. This will create clientUser.id in the wallet folder.
  6. Add the connection-org1.yaml file, located at fabric-getting-started/test-network/organizations/peerOrganizations/org1.example.com to the wallet folder.
  7. Make sure the Peer URL and CA URL in connection-org1.yaml are reachable.
    If using fabric-getting-started, change the peer URL in connection-org1.yaml to peer0.org1.example.com:7051 and CA URL to ca-org1:7054.
  8. Run, hlf.java.rest.client.FabricClientBootstrap java file or jar file.
  9. You can also run as container using docker-compose up.
    If the fabric network is running local, make sure the docker-compose.yml file is configured to use the correct network.
networks:
  default:
    external:
      name: 
   

   

Event-driven Design

Asynchronous Integration to invoke chaincode

This component supports event-based architecture by consuming transactions through Kafka & Azure EventHub. To configure it, use the below configuration in the application.yml file.

ssl-keystore-password: ssl-truststore-location: ssl-truststore-password: ssl-key-password: ">
kafka:
  integration:
    brokerHost: 
       
        
    groupId: 
        
         
    topic: 
         
          
    # For Azure EventHub
    jaasConfig: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://
          
           /;SharedAccessKeyName=
           
            ;SharedAccessKey=
            
             "; # For SOX compliant Kafka Clusters ssl-enabled: true security-protocol: SSL ssl-keystore-location: 
             
               ssl-keystore-password: 
              
                ssl-truststore-location: 
               
                 ssl-truststore-password: 
                
                  ssl-key-password: 
                  
                 
                
               
              
             
            
           
          
         
        
       

The component accepts JSON payload and 3 headers to invoke the chaincode. Please find below the keys for the headers:-

1. channel_name
2. function_name
3. chaincode_name

Capture Chaincode events:-

This component supports capturing chaincode events and publish it to Kafka or Azure EventHub. This can be useful for integrating with offchain DB. To configure it, use the below configuration in the application.yml file.

ssl-keystore-password: ssl-truststore-location: ssl-truststore-password: ssl-key-password: ">
fabric:
  events:
    enabled: true
    chaincode: mychannel1,mychannel2  #Comma-separated list for listening to events from multiple channels 
kafka:
  event-listener:
    brokerHost: 
       
        
    topic: 
        
         
    # For Azure EventHub
    jaasConfig: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://
         
          /;SharedAccessKeyName=
          
           ;SharedAccessKey=
           
            "; # For SOX compliant Kafka Clusters ssl-enabled: true security-protocol: SSL ssl-keystore-location: 
            
              ssl-keystore-password: 
             
               ssl-truststore-location: 
              
                ssl-truststore-password: 
               
                 ssl-key-password: 
                 
                
               
              
             
            
           
          
         
        
       

The component will send the same JSON payload sent by the chaincode and add the following headers.

1. fabric_tx_id
2. event_name
3. channel_name
4. event_type (value: chaincode_event)

Capture Block events:-

This component supports capturing block events and publish it to Kafka or Azure EventHub. This can be useful for integrating with offchain DB where adding events to chaincode is not possible (for ex - Food-Trust anchor channel). To configure it, use the below configuration in the application.yml file.

ssl-keystore-password: ssl-truststore-location: ssl-truststore-password: ssl-key-password: ">
fabric:
  events:
    enabled: true
    block: mychannel1,mychannel2  #Comma-separated list for listening to events from multiple channels 
kafka:
  event-listener:
    brokerHost: 
       
        
    topic: 
        
         
    # For Azure EventHub
    jaasConfig: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://
         
          /;SharedAccessKeyName=
          
           ;SharedAccessKey=
           
            "; # For SOX compliant Kafka Clusters ssl-enabled: true security-protocol: SSL ssl-keystore-location: 
            
              ssl-keystore-password: 
             
               ssl-truststore-location: 
              
                ssl-truststore-password: 
               
                 ssl-key-password: 
                 
                
               
              
             
            
           
          
         
        
       

The component will send the same JSON payload sent by the chaincode and add the following headers.

1. fabric_tx_id
2. channel_name
3. chaincode name
4. function_name
5. event_type (value: block_event)
Comments
  • add org to channel

    add org to channel

    6 Functionalities Covered:

    1. Get Configuration File
    2. Generate Configuration Update File - Step 1/3
    3. Sign the Configuration Update File - Step 2/3
    4. Commit the Configuration File to the Ledger - Step 3/3
    5. Add an Organization to the Channel Configuration (in one function call)
    6. Decode encoded configuration files produced by any of the above methods
    opened by coran-coley 3
  • Jackson serialize PrivateData EmptyList field to empty string

    Jackson serialize PrivateData EmptyList field to empty string

    • Currently, if the privateData list is empty , jackson outputs it as json array i.e "[]" , to keep it inline with chaincode_event empty privateData, it is made empty string.

    Signed-off-by:Jitendra Das [email protected]

    opened by jitendra62075 1
  • Process Data-ingestion messages through Batched async mechanism to improve throughput.

    Process Data-ingestion messages through Batched async mechanism to improve throughput.

    Current Problem : Presently, only a single Listener container is generated to consume messages from the Connectors ingestion Topic (across all the partitions) . This Listener sequentially processes each record returned by the internal poll() method which eventually affects the overall throughput of Connector, since the downstream TransactionConsumer#listen does a blocking call for writing transactions which could span for few seconds. Therefore given a scenario where TransactionConsumer#listen takes 2 seconds complete, in order to process 100 incoming records fetched by the poll() method it takes around 50 seconds.

    Proposed Fix : Assign a dedicated Listener Container for each partition in the Topic, per connector instance (capped to a max of 6 Listeners, in order to avoid spawning a large number of Listeners for high-partitioned Topics ). Each Listener gets a batch of Messages from the Partition it is assigned to, this batch is processed asynchronously by submitting it to a task executor in one go. The Listener thread defers the next poll until the entire records are processed parallelly. Once the batch is processed, Listener gets the next Batch from poll() In case one of the records encounters an exception while processing parallelly, we perform a partial Batch commit and the failed and unprocessed records are sent again in the next poll()

    opened by nithin-pankaj 0
  • Fix broken Event-Publisher flow caused by java version upgrade

    Fix broken Event-Publisher flow caused by java version upgrade

    This PR contains the changes to revert Java version upgrade which is potentially blocking the Chaincode Event publisher flow. Upgrade from 8 to 11 will be performed after verifying that no other dependencies of HLF connector has a strict dependency on version 8 or is incompatible with version 11.

    opened by nithin-pankaj 0
  • Add SSL AuthFiles creator, Fix broken refresh of Kafka properties

    Add SSL AuthFiles creator, Fix broken refresh of Kafka properties

    This PR contains the changeset which will enable connector to create SSL files in local path from the SSL base64 details in Application config. Furthermore, this PR fixes few inconsistencies in refreshing Kafka Producer/Listener beans after invoking the actuator refresh endpoint.

    opened by nithin-pankaj 0
  • update springboot version

    update springboot version

    1. update spring version to 2.7.1
    2. update jdk version to 11
    3. update conflicted dependencies
    4. fix null pointer issue when EventPublishService bean is not instantiated

    Signed-off-by: weihong-ou [email protected]

    opened by weihong-ou 0
  • Fixes for event listening

    Fixes for event listening

    EventListener annotation is redundant in the code which is causing error with events.enable as true while the application is bootstrapping

    Signed-off-by: n0s09by [email protected]

    opened by nidhi-singh02 0
  • Populate init flag from incoming request for fetching approved Orgs

    Populate init flag from incoming request for fetching approved Orgs

    This PR contains the changeset for populating the init property of lifecycleCheckCommitReadinessRequest from the incoming ChaincodeOperationsModel passed by the client rather than setting it default as true.

    opened by nithin-pankaj 0
  • Add org to existing channel fix

    Add org to existing channel fix

    This PR contains following changes:

    1.Code formatting and imports reorganised 2.Add org to existing channel minor fixes 3.Sonar lint issues resolved

    Signed-off-by: Abhay Kishore [email protected]

    opened by abhakish 0
  • Add org to existing channel fix

    Add org to existing channel fix

    This PR contains following changes:

    1. Code formatting and imports reorganised
    2. Add org to existing channel minor fixes
    3. Sonar lint issues resolved Signed-off-by: Abhay Kishore [email protected]
    opened by abhakish 0
  • Fabric setup for running integration tests and channel creation fix

    Fabric setup for running integration tests and channel creation fix

    1.This PR contains the files which were missed in earlier commits for fabric setup. 2. Github action added for running the integration tests. 3. Channel creation fix for multiple orgs

    Signed-off-by: Abhay Kishore [email protected]

    opened by abhakish 0
  • Make Init funtion params optional & accept endorsement policy as String for Approval and Commit

    Make Init funtion params optional & accept endorsement policy as String for Approval and Commit

    This PR contains the changes for the following behavior

    • Init chaincode endpoint to make Requestbody optional to handle SC inits for init functions with no parameters.
    • SC Approve & Commit endpoint will now accept endorsement policy as a String.
    opened by nithin-pankaj 0
  • Unable to find certification path to request target

    Unable to find certification path to request target

    Hi there. I am currently having certification issues with the EnrollAdmin part of the guide to run locally. Below is my stack trace. I am running on Hyperledger Fabric Sample 2.4.6. My CA pem file path is directed here: ../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem. I have tried to export the .pem into .crt and installed this certification within my Ubuntu system (usr/local/share/ca-certificates/extra) and used sudo update-ca-certificates to update my certificate. After that, there is a ca.org1.example.com-cert.pem generated within /etc/ssl/certs.

    08:18:02.163 [main] WARN o.h.fabric_ca.sdk.helper.Config - Failed to load any configuration from: config.properties. Using toolkit defaults 08:18:02.694 [main] WARN o.h.fabric.sdk.helper.Config - Failed to load any configuration from: config.properties. Using toolkit defaults 08:18:04.131 [main] ERROR o.h.fabric_ca.sdk.HFCAClient - PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alert.createSSLException(Alert.java:131) at sun.security.ssl.TransportContext.fatal(TransportContext.java:324) at sun.security.ssl.TransportContext.fatal(TransportContext.java:267) at sun.security.ssl.TransportContext.fatal(TransportContext.java:262) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:654) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:473) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:369) at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:377) at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444) at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422) at sun.security.ssl.TransportContext.dispatch(TransportContext.java:182) at sun.security.ssl.SSLTransport.decode(SSLTransport.java:152) at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1397) at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1305) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:440) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) at org.hyperledger.fabric_ca.sdk.HFCAClient.httpPost(HFCAClient.java:1328) at org.hyperledger.fabric_ca.sdk.HFCAClient.enroll(HFCAClient.java:480) at hlf.java.rest.client.util.EnrollAdmin.generateWallet(EnrollAdmin.java:65) at hlf.java.rest.client.util.EnrollAdmin.main(EnrollAdmin.java:35) Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:456) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:323) at sun.security.validator.Validator.validate(Validator.java:271) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:315) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:223) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638) ... 26 common frames omitted Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451) ... 32 common frames omitted org.hyperledger.fabric_ca.sdk.exception.EnrollmentException: Url:https://localhost:7053, Failed to enroll user admin at org.hyperledger.fabric_ca.sdk.HFCAClient.enroll(HFCAClient.java:520) at hlf.java.rest.client.util.EnrollAdmin.generateWallet(EnrollAdmin.java:65) at hlf.java.rest.client.util.EnrollAdmin.main(EnrollAdmin.java:35) Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alert.createSSLException(Alert.java:131) at sun.security.ssl.TransportContext.fatal(TransportContext.java:324) at sun.security.ssl.TransportContext.fatal(TransportContext.java:267) at sun.security.ssl.TransportContext.fatal(TransportContext.java:262) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:654) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:473) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:369) at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:377) at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444) at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422) at sun.security.ssl.TransportContext.dispatch(TransportContext.java:182) at sun.security.ssl.SSLTransport.decode(SSLTransport.java:152) at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1397) at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1305) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:440) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) at org.hyperledger.fabric_ca.sdk.HFCAClient.httpPost(HFCAClient.java:1328) at org.hyperledger.fabric_ca.sdk.HFCAClient.enroll(HFCAClient.java:480) ... 2 more Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:456) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:323) at sun.security.validator.Validator.validate(Validator.java:271) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:315) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:223) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638) ... 26 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451) ... 32 more

    Process finished with exit code 0

    opened by gonghanvip 0
  • CI: code analysis and vulnerability check

    CI: code analysis and vulnerability check

    Signed-off-by: adityajoshi12 [email protected]

    1. Added static code analyser (CodeQL)
    2. Added vulnerability check (Trivy)
    3. Check for GitHub-actions version (Dependabot)
    opened by adityajoshi12 0
  • Support init transaction through HLF connector

    Support init transaction through HLF connector

    Support a new parameter that will allow HLF connector to send init transactions to the running Fabric network. The ask here is to add an option to existing API so that the user of the connector can send initialization request.

    enhancement good first issue help wanted 
    opened by arsulegai 0
Owner
Hyperledger Labs provides a space where work can easily be started without the creation of an official Hyperledger project.
null
:rocket: Lightning fast and elegant mvc framework for Java8

Based on Java8 + Netty4 to create a lightweight, high-performance, simple and elegant Web framework ?? Spend 1 hour to learn it to do something intere

Blade Framework 5.7k Dec 28, 2022
Ninja is a full stack web framework for Java. Rock solid, fast and super productive.

_______ .___ _______ ____. _____ \ \ | |\ \ | | / _ \ / | \| |/ | \ | |/ /_\ \ / | \

Ninja Web Framework 1.9k Jan 5, 2023
The modular web framework for Java and Kotlin

∞ do more, more easily Jooby is a modern, performant and easy to use web framework for Java and Kotlin built on top of your favorite web server. Java:

jooby 1.5k Dec 16, 2022
ZK is a highly productive Java framework for building amazing enterprise web and mobile applications

ZK ZK is a highly productive Java framework for building amazing enterprise web and mobile applications. Resources Documentation Tutorial ZK Essential

ZK 375 Dec 23, 2022
:rocket: Lightning fast and elegant mvc framework for Java8

Based on Java8 + Netty4 to create a lightweight, high-performance, simple and elegant Web framework ?? Spend 1 hour to learn it to do something intere

Blade Framework 5.7k Jan 5, 2023
An evolving set of open source web components for building mobile and desktop web applications in modern browsers.

Vaadin components Vaadin components is an evolving set of high-quality user interface web components commonly needed in modern mobile and desktop busi

Vaadin 519 Dec 31, 2022
A web MVC action-based framework, on top of CDI, for fast and maintainable Java development.

A web MVC action-based framework, on top of CDI, for fast and maintainable Java development. Downloading For a quick start, you can use this snippet i

Caelum 347 Nov 15, 2022
☄️ LiteCommands - Command framework for Velocity and your other implementations.

☄️ LiteCommands Command framework for Velocity and your other implementations. Helpful links: Support Discord GitHub issues Panda Repository (Maven or

Norbert Dejlich 38 Dec 1, 2022
A server-state reactive Java web framework for building real-time user interfaces and UI components.

RSP About Maven Code examples HTTP requests routing HTML markup Java DSL Page state model Single-page application Navigation bar URL path UI Component

Vadim Vashkevich 33 Jul 13, 2022
RESTEasy is a JBoss project that provides various frameworks to help you build RESTful Web Services and RESTful Java applications

RESTEasy RESTEasy is a JBoss.org project aimed at providing productivity frameworks for developing client and server RESTful applications and services

RESTEasy 1k Dec 23, 2022
Javalin - A simple web framework for Java and Kotlin

Javalin is a very lightweight web framework for Kotlin and Java which supports WebSockets, HTTP2 and async requests. Javalin’s main goals are simplicity, a great developer experience, and first class interoperability between Kotlin and Java.

David (javalin.io) 6.2k Jan 6, 2023
[Nelson] Microservices and Distributed Systems [ENG, 2022]

[Nelson] Microservices and Distributed Systems [ENG, 2022] Course

Marley 9 Dec 14, 2022
Evgeniy Khyst 54 Dec 28, 2022
Powerful event-bus optimized for high throughput in multi-threaded applications. Features: Sync and Async event publication, weak/strong references, event filtering, annotation driven

MBassador MBassador is a light-weight, high-performance event bus implementing the publish subscribe pattern. It is designed for ease of use and aims

Benjamin Diedrichsen 930 Jan 6, 2023
PostgreSQL is the world's most advanced open source database. Also, PostgreSQL is suitable for Event Sourcing. This repository provides a sample of event sourced system that uses PostgreSQL as event store.

Event Sourcing with PostgreSQL Introduction Example Domain Event Sourcing and CQRS 101 State-Oriented Persistence Event Sourcing CQRS Advantages of CQ

Evgeniy Khyst 146 Dec 20, 2022
EventStoreDB is the database for Event Sourcing. This repository provides a sample of event sourced system that uses EventStoreDB as event store.

Event Sourcing with EventStoreDB Introduction Example Domain Event Sourcing and CQRS 101 State-Oriented Persistence Event Sourcing CQRS Advantages of

Evgeniy Khyst 53 Dec 15, 2022
Kafka example - a simple producer and consumer for kafka using spring boot + java

Kafka example - a simple producer and consumer for kafka using spring boot + java

arturcampos 1 Feb 18, 2022
End to End project for Kafka Streams using Spring Cloud Kafka streams

Spring Kafka Streams using Spring Cloud Streams End to End example Endpoint http://localhost:8080/domain/lookup/facebook - to pull all facebook relate

TechPrimers 43 Dec 20, 2022
Microservices project with CQRS, Event sourcing and Event-driven design.

for more details about the project, please check the attached pdf document "Walkthrough_SpringBoot_Microservices_Project" To Run the project : downloa

null 2 Jan 31, 2022