MIC¶
Une architecture explicite pour des services Python et Node.js solides, testables et agnostiques au framework.
MIC (Model / Interface / Controller) sépare le métier, ses interfaces et les adaptateurs qui l'exposent. Deux implémentations officielles appliquent ce contrat : mic-python, avec trois distributions PyPI et un scaffold cookiecutter, et mic-node, avec quinze paquets npm TypeScript et un générateur de service.
Pourquoi vous êtes ici¶
-
Vous voulez des services robustes
Des contrats stricts (Pydantic v2
extra="forbid", frozen, ré-validés), une frontière claire entre métier et HTTP, des erreurs d'API avec un code canonique. Pas de "ça marche en dev mais pas en prod". -
Vous voulez du framework-agnostique
Une route MIC peut être servie par FastAPI ou Litestar en Python, et par Node HTTP, Express, Fastify, Hono ou NestJS en TypeScript. Le gestionnaire métier ne change pas.
-
Vous voulez des preuves exécutables
Le contrôle Python exige 100 % de couverture. Les versions Node vérifient les archives publiées dans un projet vierge et exécutent le service généré. Les limites de validation sont publiées sans extrapolation.
-
Vous voulez un nouveau service en 30 minutes
cookiecuttergénère le service Python ;@mic-struct/create-mic-servicegénère le service Node.js. Les deux livrent les routes d'exploitation, un module exemple et les tests associés.
Python en 30 secondes¶
from fastapi import FastAPI
from mic.contracts import StrictSchema, wrap_http_success
from mic.http import HttpResponseSpec, HttpRouteSpec
from mic.fastapi import build_fastapi_router
class CreateItem(StrictSchema):
name: str
quantity: int = 0
def _create(*, payload: CreateItem) -> HttpResponseSpec:
return HttpResponseSpec(
status_code=201,
body=wrap_http_success({"name": payload.name, "qty": payload.quantity}),
)
app = FastAPI()
app.include_router(build_fastapi_router(routes=(
HttpRouteSpec(
method="POST", path="/api/v1/items",
name="items_v1_create", category="items",
handler=_create,
),
)))
HttpRouteSpec est aussi servi par build_litestar_router(...) — le code
métier ne change pas. C'est ça, MIC.
Node.js / TypeScript en 30 secondes¶
Les quinze paquets @mic-struct sont publiés sur le registre public npm et ne
demandent aucun jeton. Générez puis vérifiez le service :
pnpm dlx @mic-struct/create-mic-service ./my-service
cd my-service
pnpm install
pnpm verify
pnpm start
Le projet obtenu expose sa santé, son état de préparation et son contrat OpenAPI 3.1. Le quickstart Node.js donne la liste exacte des paquets et les garanties de publication.
Ce qui est livré¶
Python¶
Les imports Python sont toujours mic.<module> ; la colonne Paquet indique quelle
distribution PyPI le fournit (cf. Organisation des paquets).
| Module | Paquet | Rôle |
|---|---|---|
mic.contracts |
mic-core |
StrictSchema statique ou SchemaRegistry gouverné, enveloppes HTTP strictes |
mic.model |
mic-core |
DomainError, TransientError, NotFoundError… (mappées 4xx / 5xx canoniquement) |
mic.http |
mic-core |
HttpRouteSpec agnostique + adaptateurs FastAPI et Litestar (parité prouvée) |
mic.auth |
mic-core |
Jetons inter-service liés à l'audience, rotation et portées exactes |
mic.tenancy |
mic-core |
Contexte d'organisation + vue relationnelle qui refuse les accès hors portée |
mic.client |
mic-core |
ServiceHttpClient httpx auto-signé + mapping erreurs canonique |
mic.observability |
mic-core |
configure_logging() JSON + Prometheus counter / gauge / histogram |
mic.datastorage |
mic-datastore |
SqlDataStorage (+ document / graph / clé-valeur), sessions, prepare() idempotent |
mic.outbox |
mic-datastore |
Livraison at-least-once avec ordre par agrégat optionnel |
mic.scheduling |
mic-datastore |
Tâches périodiques avec verrou, point de reprise, suivi et alerte de silence |
mic.ratelimit |
mic-platform |
RateLimiter + RateLimitMiddleware (in-memory / Redis) |
template/ |
(repo mic-struct) |
Cookiecutter — répondez à 3 questions, obtenez un service complet |
Node.js / TypeScript¶
| Groupe | Rôle |
|---|---|
@mic-struct/mic-core, @mic-struct/mic-client |
Contrats, erreurs, HTTP, authentification et appels inter-services |
@mic-struct/mic-datastore, @mic-struct/mic-redis |
Persistance, cache, outbox, files, temps réel et planification |
| Adaptateurs HTTP | Node HTTP, Express, Fastify, Hono et NestJS |
@mic-struct/mic-observability, @mic-struct/mic-resilience |
Journaux, traces, métriques, Sentry et disjoncteurs applicatifs |
@mic-struct/create-mic-service |
Générateur d'un service testé avec OpenAPI et CLI opérateur |
L'implémentation Node compte quinze paquets versionnés ensemble. Ils exigent Node.js 24 ou une version ultérieure.
Fait pour livrer en confiance¶
- PyPI :
mic-core·mic-datastore·mic-platform— installables depuis n'importe où - npm : quinze paquets
@mic-struct— publiés sur le registre public, sans authentification, et testés après publication - MIT — utilisable en commercial / open-source / propriétaire
- Python 3.14 — choix assumé qui impose un runtime récent
- Node.js 24+ — contrat déclaré dans chaque paquet publié
- Services réels validés — forte densité d'intégration ; les agrégats complexes et l'échelle milliard restent à éprouver
- Périmètre et sortie documentés — limites, maturité et réversibilité