Asbru - A Data-oriented Service Mesh ====
Crates.io version Documentation Download


/!\ WIP: Asbru won't be usable until version 0.1.0 /!\ /!\ The target is to have a MVP right now, so the code might be ugly sometimes, it's on purpose to create a prototype first. /!\ `Asbru` is an `async_graphql` Data-oriented Service Mesh generator: it'll generate an `async_graphql` project from a schema with resolvers, dataloaders, data-transformation. It'll create a Data-oriented service mesh from your schema so you'll just have to describe your microservices with your described schema to have a Data-Oriented Service Mesh like Airbnb's. `Asbru` will be able to send metrics to apollo studio, use dataloaders patterns, store cache data into an external datastorage, be served serverless and even more. `Asbru` is an opensource project based on Viaduct, an Airbnb's project presented [here](https://www.youtube.com/watch?v=xxk9MWCk7cM). - [Documentation](https://docs.rs/asbru/) _Tested at Rust version: `rustc 1.53.0 (53cb7b09b 2021-06-17)`_ ## Rendered GraphQL The rendered code is split accros three folders following an architecture inspired by the Domain Driven Design with 3 layers: ``` | main.rs | schema.rs | application/ | entity/entity.rs | entity/query.rs | entity/mutation.rs | domain/ | entity/entity.rs | infrastructure/ | http.rs | db.rs | ... ``` `infrastructure` will contains every code and definitions structuring the whole application, each files should describe a high-level API which abstract the implementation, in practise, it might be coupled with the implementation. For instance, instead of using directly `reqwest` to do http call, we create a higher level API, which describe how to do a HTTP call, and we provide an implementation for it with `reqwest`. `domain` will describe our domains data, which called are made to call an entity, the associated dataloaders. `application` will describe entity with a GraphQL implementation to describe query, mutations, subscriptions. ## Example An interactive example is available with this [configuration](https://github.com/Miaxos/Asbru/tree/main/example/test01). Available schema here: - [https://asbru-schema-01.herokuapp.com/graphql](https://asbru-schema-01.herokuapp.com/) ## Roadmap v0.1.0 * ✅ Manage a configuration files. * ✅ Docker build * ❌ Codegen a `async_graphql` layout - ✅ Object generation layout - ✅ Modfiles - ✅ Cargo - ✅ Rust types on GraphQL scalars - ✅ Enum - ✅ Simple Query - ❌ Interfaces - ❌ Union - ❌ Mutations - ❌ Connections * ❌ Architecture & Connect to services with a directive (at Airbnb it's something like `@serviceBackedNode`). - ✅ serviceBackedQuery - ❌ serviceBackedNode - ❌ serviceBackedConnection ## Roadmap v1.0.0 - Infrastructure - ❌ Dataloaders - ❌ Intra-request cache - ❌ Tracing - ❌ Extensions (Apollo Studio) - GraphQL - ❌ Subscriptions - Directives - ❌ derivedField - Transport - ❌ GRPC ## Crate features No features right now, but soon. ## References * [Viaduct presentation](https://www.youtube.com/watch?v=xxk9MWCk7cM) * [GraphQL](https://graphql.org) * [Async Graphql Crates](https://github.com/async-graphql/async-graphql) * [Codegen for async_graphql](https://github.com/atsuhiro/codegen-for-async-graphql)