Spring IO 2019大會上Axon+Spring的事件驅動微服務和CQRS原始碼專案
點選標題進入專案,CommandHandler程式碼
@Profile("command") @Aggregate public class Bike { @AggregateIdentifier private String bikeId; private boolean isAvailable; public Bike() { } @CommandHandler public Bike(RegisterBikeCommand command) { apply(new BikeRegisteredEvent(command.getBikeId(), command.getLocation())); } @CommandHandler public void handle(RentBikeCommand command) { if (!this.isAvailable) { throw new IllegalStateException("Bike is already rented"); } apply(new BikeRentedEvent(command.getBikeId(), command.getRenter())); } @CommandHandler public void handle(ReturnBikeCommand command) { if (this.isAvailable) { throw new IllegalStateException("Bike was already returned"); } apply(new BikeReturnedEvent(command.getBikeId(), command.getLocation())); } @EventSourcingHandler protected void handle(BikeRegisteredEvent event) { this.bikeId = event.getBikeId(); this.isAvailable = true; } @EventSourcingHandler protected void handle(BikeReturnedEvent event) { this.isAvailable = true; } @EventSourcingHandler protected void handle(BikeRentedEvent event) { this.isAvailable = false; } } |
用於EventSourcing的歷史實體:
@Profile("history") @Entity public class BikeHistory { @Id @GeneratedValue private Long id; private String bikeId; private String description; private String timestamp; public BikeHistory() { } public BikeHistory(String bikeId, Instant timestamp, String description) { this.bikeId = bikeId; this.timestamp = timestamp.toString(); this.description = description; } public String getBikeId() { return bikeId; } public String getDescription() { return description; } public String getTimestamp() { return timestamp; } } |
領域歷史事件重播到當前狀態:
@Profile("history") @Component public class BikeHistoryProjection { private final BikeHistoryRepository bikeHistoryRepository; private final QueryUpdateEmitter updateEmitter; public BikeHistoryProjection(BikeHistoryRepository bikeHistoryRepository, QueryUpdateEmitter updateEmitter) { this.bikeHistoryRepository = bikeHistoryRepository; this.updateEmitter = updateEmitter; } @EventHandler public void handle(BikeRegisteredEvent event, @Timestamp Instant timestamp) { bikeHistoryRepository.save(new BikeHistory(event.getBikeId(), timestamp, "Bike registered in " + event.getLocation())); } @EventHandler public void handle(BikeRentedEvent event, @Timestamp Instant timestamp) { BikeHistory newEntry = new BikeHistory(event.getBikeId(), timestamp, "Bike rented out to " + event.getRenter()); bikeHistoryRepository.save(newEntry); updateEmitter.emit(m -> "locationHistory".equals(m.getQueryName()) && newEntry.getBikeId().equals(m.getPayload()), newEntry); } @EventHandler public void handle(BikeReturnedEvent event, @Timestamp Instant timestamp) { BikeHistory newEntry = new BikeHistory(event.getBikeId(), timestamp, "Bike returned in " + event.getLocation()); bikeHistoryRepository.save(newEntry); updateEmitter.emit(m -> "locationHistory".equals(m.getQueryName()) && newEntry.getBikeId().equals(m.getPayload()), newEntry); } @QueryHandler(queryName = "locationHistory") public List<BikeHistory> findMovements(String bikeId) { return bikeHistoryRepository.findByBikeIdOrderById(bikeId); } } |
領域事件歷史使用Spring JPA持久:
@Profile("history") public interface BikeHistoryRepository extends JpaRepository<BikeHistory, Long> { List<BikeHistory> findByBikeIdOrderById(String bikeId); } |
相關文章
- 使用領域驅動設計DDD和CQRS實現身份驗證的微服務原始碼專案微服務原始碼
- 事件驅動的微服務-事件驅動設計事件微服務
- 使用Spring Cloud Stream和RabbitMQ實現事件驅動的微服務SpringCloudMQ事件微服務
- 使用Spring Cloud Stream和Spring State Machine建立事件驅動的微服務案例SpringCloudMac事件微服務
- 基於事件溯源與CDC的事件驅動微服務架構案例原始碼事件微服務架構原始碼
- 領域驅動設計:CQRS 和事件源的強大功能事件
- 微服務事件驅動架構演進微服務事件架構
- 使用TypeScript和nextjs實現基於CQRS的微服務的銀行API原始碼TypeScriptNextJS微服務API原始碼
- Spring:事件驅動Spring事件
- 事件驅動的微服務-建立第三方庫事件微服務
- 領域驅動設計(DDD)實踐之路(二):事件驅動與CQRS事件
- 基於Spring Cloud Netflix的TCC柔性事務和EDA事件驅動示例SpringCloud事件
- 微服務、CQRS和eventsourcing開源資源微服務
- axon框架創始人談微服務與事件驅動框架微服務事件
- 如何在Java中實現事件驅動的微服務架構Java事件微服務架構
- 結合領域事件和微服務的實現領域驅動設計 - Alagarsamy事件微服務
- 訊息驅動式微服務:Spring Cloud Stream & RabbitMQ微服務SpringCloudMQ
- spring — Spring中的事件驅動機制解析Spring事件
- 基於gRPC、API閘道器和身份驗證的Go微服務原始碼專案RPCAPIGo微服務原始碼
- 微服務專案Git倉庫自動化指令碼微服務Git指令碼
- 使用Redis/RabbitMQ/EventStore實現事件溯源CQRS微服務應用 - Aram KoukiaRedisMQ事件微服務
- 微服務生態元件之Spring Cloud OpenFeign詳解和原始碼分析微服務元件SpringCloud原始碼
- 微服務生態元件之Spring Cloud LoadBalancer詳解和原始碼分析微服務元件SpringCloud原始碼
- redis個人原始碼分析筆記3---redis的事件驅動原始碼分析Redis原始碼筆記事件
- Spring Boot的微服務分散聚集模式教程與原始碼 - vinsguruSpring Boot微服務模式原始碼
- 事件驅動架構正在起飛 – Boyney.io事件架構
- 基於spring實現事件驅動Spring事件
- 小馬哥Spring事件驅動模型Spring事件模型
- 使用Apache Kafka實現從單體到事件驅動微服務 - swlhApacheKafka事件微服務
- 類似SpringCloud的vlingo平臺是一套事件驅動的微服務工具SpringGCCloudGo事件微服務
- Spring5原始碼解析-Spring框架中的事件和監聽器Spring原始碼框架事件
- spring cloud springboot mybatis 分散式 微服務 架構原始碼CloudSpring BootMyBatis分散式微服務架構原始碼
- GitHub - soooban/AxonDemo: 使用Axon/Spring Cloud實現事件溯源和CQRS案例GithubSpringCloud事件
- Spring Boot實現DDD的貨運Cargo微服務案例原始碼Spring BootCargo微服務原始碼
- Spring Cloud 微服務專案實現總架構一SpringCloud微服務架構
- 使用Spring Boot實現微服務架構的開源專案Spring Boot微服務架構
- Spring Boot + Junit 5 + Testcontainers原始碼專案Spring BootAI原始碼
- 如何設計基於事件驅動架構的銷售庫存微服務?- Jasbir事件架構微服務