@umacloud/knowledge 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/00-governance/governance-capabilities.md +557 -0
- package/00-governance/knowledge-map.md +39 -0
- package/00-governance/maintenance-policy.md +76 -0
- package/00-governance/review-checklist.md +81 -0
- package/README.md +13 -0
- package/ai/01-standards/agent-development-complete.md +691 -0
- package/ai/01-standards/llm-application-complete.md +488 -0
- package/ai/01-standards/mlops-complete.md +798 -0
- package/ai/01-standards/prompt-engineering-complete.md +646 -0
- package/ai/01-standards/rag-architecture-complete.md +649 -0
- package/ai/02-playbooks/llm-evaluation-playbook.md +847 -0
- package/ai/03-checklists/ai-project-checklist.md +215 -0
- package/ai/04-antipatterns/ai-antipatterns.md +661 -0
- package/ai/05-cases/case-rag-production.md +147 -0
- package/ai/06-glossary/ai-glossary.md +162 -0
- package/ai/agent-evaluation-benchmark.md +53 -0
- package/ai/ai-agent-memory-context-management.md +41 -0
- package/ai/ai-cost-capacity-optimization-playbook.md +42 -0
- package/ai/ai-data-security-and-compliance-playbook.md +37 -0
- package/ai/ai-domain-index-and-checklist.md +40 -0
- package/ai/ai-governance-maturity-model.md +50 -0
- package/ai/ai-model-selection-and-routing-strategy.md +47 -0
- package/ai/ai-observability-and-oncall-runbook.md +52 -0
- package/ai/ai-rag-engineering-playbook.md +42 -0
- package/ai/ai-red-team-and-safety-evaluation.md +42 -0
- package/ai/ai-release-readiness-and-rollback-gate.md +42 -0
- package/ai/llm-agent-engineering-deep-dive.md +57 -0
- package/ai/prompt-and-tool-guardrails.md +52 -0
- package/api/01-standards/enterprise-api-standards.md +198 -0
- package/api/01-standards/rest-api-design-guide.md +63 -0
- package/api/02-playbooks/api-pagination-playbook.md +93 -0
- package/api/02-playbooks/graphql-production-playbook.md +176 -0
- package/api/03-checklists/api-review-checklist.md +55 -0
- package/api/04-antipatterns/api-antipatterns.md +112 -0
- package/architecture/01-standards/api-gateway-patterns.md +496 -0
- package/architecture/01-standards/cloud-native-patterns.md +644 -0
- package/architecture/01-standards/distributed-systems-patterns.md +591 -0
- package/architecture/01-standards/event-driven-architecture.md +595 -0
- package/architecture/01-standards/microservices-patterns-complete.md +968 -0
- package/architecture/01-standards/microservices-patterns.md +495 -0
- package/architecture/01-standards/system-design-interview.md +664 -0
- package/architecture/02-playbooks/microservices-patterns-playbook.md +137 -0
- package/architecture/02-playbooks/migration-playbook.md +780 -0
- package/architecture/02-playbooks/system-design-playbook.md +779 -0
- package/architecture/03-checklists/architecture-decision-checklist.md +297 -0
- package/architecture/04-antipatterns/architecture-antipatterns.md +417 -0
- package/architecture/05-cases/case-netflix-microservices.md +413 -0
- package/architecture/06-glossary/architecture-glossary.md +164 -0
- package/architecture/adr-template-and-examples.md +38 -0
- package/architecture/api-gateway-deep-dive.md +1291 -0
- package/architecture/configuration-management.md +1162 -0
- package/architecture/distributed-transactions.md +1220 -0
- package/architecture/microservices-complete.md +735 -0
- package/architecture/resilience-and-disaster-patterns.md +37 -0
- package/architecture/service-governance.md +1198 -0
- package/architecture/system-architecture-deep-dive.md +37 -0
- package/backend/01-standards/analytics-and-growth.md +65 -0
- package/backend/01-standards/api-and-error-conventions.md +120 -0
- package/backend/01-standards/application-layering-and-packaging.md +160 -0
- package/backend/01-standards/auth-implementation.md +104 -0
- package/backend/01-standards/backend-framework-idioms.md +74 -0
- package/backend/01-standards/background-jobs-and-async.md +66 -0
- package/backend/01-standards/caching-strategies-complete.md +390 -0
- package/backend/01-standards/config-and-observability.md +77 -0
- package/backend/01-standards/data-modeling-and-persistence.md +94 -0
- package/backend/01-standards/django-complete.md +1765 -0
- package/backend/01-standards/email-and-notifications.md +64 -0
- package/backend/01-standards/fastapi-complete.md +925 -0
- package/backend/01-standards/file-upload-and-storage.md +66 -0
- package/backend/01-standards/graphql-api-complete.md +416 -0
- package/backend/01-standards/llm-application-standard.md +78 -0
- package/backend/01-standards/message-queue-patterns.md +379 -0
- package/backend/01-standards/microservices-and-distributed.md +78 -0
- package/backend/01-standards/nestjs-complete.md +2167 -0
- package/backend/01-standards/payment-integration.md +80 -0
- package/backend/01-standards/rate-limiting-complete.md +451 -0
- package/backend/01-standards/realtime-and-websocket.md +65 -0
- package/backend/01-standards/search-and-filtering.md +64 -0
- package/backend/01-standards/spring-boot-complete.md +445 -0
- package/backend/02-playbooks/api-design-playbook.md +718 -0
- package/backend/02-playbooks/email-send-playbook.md +130 -0
- package/backend/02-playbooks/file-upload-s3-playbook.md +153 -0
- package/backend/02-playbooks/typescript-enterprise-playbook.md +133 -0
- package/backend/02-playbooks/websocket-realtime-playbook.md +154 -0
- package/backend/03-checklists/api-launch-checklist.md +189 -0
- package/backend/04-antipatterns/backend-antipatterns.md +1051 -0
- package/blockchain/01-standards/blockchain-basics.md +557 -0
- package/blockchain/01-standards/smart-contract-development.md +1315 -0
- package/cicd/01-standards/deployment-and-delivery-standard.md +96 -0
- package/cicd/01-standards/github-actions-complete.md +473 -0
- package/cicd/01-standards/release-and-store-submission.md +75 -0
- package/cicd/02-playbooks/cicd-pipeline-playbook.md +144 -0
- package/cicd/02-playbooks/release-management-playbook.md +605 -0
- package/cicd/03-checklists/pipeline-security-checklist.md +168 -0
- package/cicd/04-antipatterns/cicd-antipatterns.md +589 -0
- package/cicd/05-cases/case-deployment-automation.md +221 -0
- package/cicd/05-cases/case-gitops-transformation.md +212 -0
- package/cicd/06-glossary/cicd-glossary.md +114 -0
- package/cicd/cicd-blueprint-deep-dive.md +38 -0
- package/cicd/release-readiness-gate.md +37 -0
- package/cloud-native/01-standards/container-security.md +741 -0
- package/cloud-native/01-standards/kubernetes-complete.md +812 -0
- package/cloud-native/02-playbooks/api-gateway-playbook.md +155 -0
- package/cloud-native/02-playbooks/gitops-with-argocd.md +760 -0
- package/cloud-native/02-playbooks/k8s-troubleshooting-playbook.md +1942 -0
- package/cloud-native/02-playbooks/message-queue-playbook.md +129 -0
- package/cloud-native/02-playbooks/multicloud-governance.md +726 -0
- package/cloud-native/02-playbooks/serverless-patterns.md +788 -0
- package/cloud-native/02-playbooks/service-mesh-playbook.md +612 -0
- package/cloud-native/02-playbooks/terraform-iac-playbook.md +143 -0
- package/cloud-native/03-checklists/container-security-checklist.md +431 -0
- package/cloud-native/03-checklists/k8s-production-readiness-checklist.md +460 -0
- package/cloud-native/04-antipatterns/container-antipatterns.md +660 -0
- package/cloud-native/04-antipatterns/k8s-antipatterns.md +743 -0
- package/cloud-native/05-cases/case-k8s-migration.md +478 -0
- package/cloud-native/05-cases/case-k8s-scaling.md +642 -0
- package/cloud-native/05-cases/case-k8s-security-incident.md +397 -0
- package/cloud-native/06-glossary/cloud-native-glossary.md +337 -0
- package/cross-platform/01-standards/cross-platform-frameworks.md +83 -0
- package/cross-platform/01-standards/platform-selection-and-architecture.md +77 -0
- package/data/01-standards/elasticsearch-complete.md +2098 -0
- package/data/01-standards/postgresql-complete.md +1613 -0
- package/data/01-standards/redis-complete.md +1527 -0
- package/data/02-playbooks/database-optimization-playbook.md +403 -0
- package/data/02-playbooks/elasticsearch-production-playbook.md +132 -0
- package/data/03-checklists/database-launch-checklist.md +187 -0
- package/data/04-antipatterns/database-antipatterns.md +873 -0
- package/data/05-cases/case-database-migration.md +310 -0
- package/data/06-glossary/database-glossary.md +440 -0
- package/data/data-governance-and-modeling-deep-dive.md +39 -0
- package/data-engineering/01-standards/airflow-complete.md +523 -0
- package/data-engineering/01-standards/kafka-complete.md +1521 -0
- package/data-engineering/02-playbooks/spark-etl-playbook.md +496 -0
- package/data-engineering/03-checklists/pipeline-launch-checklist.md +194 -0
- package/data-engineering/04-antipatterns/data-pipeline-antipatterns.md +684 -0
- package/data-engineering/05-cases/case-real-time-pipeline.md +355 -0
- package/data-engineering/06-glossary/data-engineering-glossary.md +429 -0
- package/database/01-standards/database-schema-standards.md +147 -0
- package/database/02-playbooks/postgresql-optimization-quick.md +52 -0
- package/database/02-playbooks/postgresql-performance-optimization.md +58 -0
- package/database/02-playbooks/postgresql-production-playbook.md +146 -0
- package/database/02-playbooks/redis-caching-playbook.md +117 -0
- package/database/03-checklists/database-review-checklist.md +50 -0
- package/database/04-antipatterns/database-antipatterns.md +112 -0
- package/design/01-standards/ui-design-system-complete.md +423 -0
- package/design/02-playbooks/design-handoff-playbook.md +254 -0
- package/design/02-playbooks/design-review-playbook.md +388 -0
- package/design/03-checklists/design-review-checklist.md +246 -0
- package/design/04-antipatterns/design-antipatterns.md +378 -0
- package/design/05-cases/case-design-system-adoption.md +328 -0
- package/design/06-glossary/design-glossary.md +329 -0
- package/design/ui-full-lifecycle-cross-platform-playbook.md +571 -0
- package/design/ux-system-deep-dive.md +38 -0
- package/design-systems/00-craft-rules.md +71 -0
- package/design-systems/aesthetic-families.md +43 -0
- package/design-systems/anti-ai-slop.md +162 -0
- package/design-systems/bold-geometric.md +120 -0
- package/design-systems/brutalist-bold.md +103 -0
- package/design-systems/editorial-clean.md +109 -0
- package/design-systems/glass-aurora.md +108 -0
- package/design-systems/modern-minimal.md +145 -0
- package/design-systems/premium-luxury.md +106 -0
- package/design-systems/product-type-design-map.md +48 -0
- package/design-systems/soft-warm.md +123 -0
- package/design-systems/tech-utility.md +113 -0
- package/desktop/01-standards/desktop-app-standard.md +72 -0
- package/desktop/01-standards/desktop-design.md +71 -0
- package/development/00-governance/document-template.md +41 -0
- package/development/01-standards/api-versioning-strategies.md +432 -0
- package/development/01-standards/authentication-patterns-complete.md +479 -0
- package/development/01-standards/css-architecture-complete.md +550 -0
- package/development/01-standards/database-migration-strategies.md +484 -0
- package/development/01-standards/elasticsearch-complete.md +347 -0
- package/development/01-standards/git-complete.md +371 -0
- package/development/01-standards/golang-complete.md +1565 -0
- package/development/01-standards/graphql-complete.md +298 -0
- package/development/01-standards/javascript-bundlers-complete.md +469 -0
- package/development/01-standards/javascript-typescript-complete.md +528 -0
- package/development/01-standards/jest-complete.md +275 -0
- package/development/01-standards/linux-complete.md +234 -0
- package/development/01-standards/logging-observability-complete.md +526 -0
- package/development/01-standards/microservices-communication.md +502 -0
- package/development/01-standards/mongodb-complete.md +406 -0
- package/development/01-standards/oauth2-complete.md +285 -0
- package/development/01-standards/performance-optimization-complete.md +289 -0
- package/development/01-standards/playwright-complete.md +247 -0
- package/development/01-standards/postgresql-complete.md +456 -0
- package/development/01-standards/pytest-complete.md +340 -0
- package/development/01-standards/python-async-programming.md +902 -0
- package/development/01-standards/python-complete.md +956 -0
- package/development/01-standards/python-decorators-complete.md +799 -0
- package/development/01-standards/python-design-patterns.md +2854 -0
- package/development/01-standards/python-packaging-distribution.md +420 -0
- package/development/01-standards/python-testing-strategies.md +607 -0
- package/development/01-standards/python-web-frameworks-comparison.md +471 -0
- package/development/01-standards/redis-complete.md +317 -0
- package/development/01-standards/rest-api-complete.md +316 -0
- package/development/01-standards/rust-complete.md +578 -0
- package/development/01-standards/typescript-advanced-types.md +1513 -0
- package/development/01-standards/web-security-complete.md +292 -0
- package/development/02-playbooks/api-design-playbook.md +810 -0
- package/development/02-playbooks/database-migration-playbook.md +580 -0
- package/development/02-playbooks/debugging-playbook.md +692 -0
- package/development/02-playbooks/feature-delivery-playbook.md +430 -0
- package/development/02-playbooks/incident-hotfix-playbook.md +387 -0
- package/development/02-playbooks/performance-optimization-playbook.md +531 -0
- package/development/02-playbooks/performance-tuning-playbook.md +652 -0
- package/development/02-playbooks/refactor-playbook.md +403 -0
- package/development/02-playbooks/release-playbook.md +469 -0
- package/development/03-checklists/architecture-review-checklist.md +168 -0
- package/development/03-checklists/data-migration-checklist.md +157 -0
- package/development/03-checklists/oncall-handover-checklist.md +173 -0
- package/development/03-checklists/pr-checklist.md +158 -0
- package/development/03-checklists/production-readiness-checklist.md +190 -0
- package/development/03-checklists/release-readiness-checklist.md +154 -0
- package/development/03-checklists/security-review-checklist.md +182 -0
- package/development/04-antipatterns/api-antipatterns.md +657 -0
- package/development/04-antipatterns/architecture-antipatterns.md +686 -0
- package/development/04-antipatterns/backend-antipatterns.md +648 -0
- package/development/04-antipatterns/cicd-antipatterns.md +540 -0
- package/development/04-antipatterns/code-smell-antipatterns.md +571 -0
- package/development/04-antipatterns/data-antipatterns.md +658 -0
- package/development/04-antipatterns/database-antipatterns.md +578 -0
- package/development/04-antipatterns/frontend-antipatterns.md +635 -0
- package/development/04-antipatterns/reliability-antipatterns.md +700 -0
- package/development/04-antipatterns/security-antipatterns.md +747 -0
- package/development/05-cases/case-api-version-migration.md +428 -0
- package/development/05-cases/case-authorization-hardening.md +383 -0
- package/development/05-cases/case-bluegreen-rollback.md +466 -0
- package/development/05-cases/case-cache-snowball-protection.md +485 -0
- package/development/05-cases/case-ci-cd-pipeline.md +544 -0
- package/development/05-cases/case-database-scaling.md +500 -0
- package/development/05-cases/case-db-hotspot-optimization.md +487 -0
- package/development/05-cases/case-incident-mttr-reduction.md +563 -0
- package/development/05-cases/case-microservice-migration.md +375 -0
- package/development/05-cases/case-performance-optimization.md +406 -0
- package/development/05-cases/case-security-incident-response.md +345 -0
- package/development/06-glossary/full-stack-glossary.md +166 -0
- package/development/09-maturity/quarterly-audit-template.md +35 -0
- package/development/11-ui-excellence/ui-aesthetic-system.md +41 -0
- package/development/11-ui-excellence/ui-engineering-excellence.md +435 -0
- package/development/12-scenarios/development-scenarios-guide.md +565 -0
- package/development/13-implementation-assets/implementation-toolkit.md +282 -0
- package/development/13-implementation-assets/knowledge-gates-execution.md +43 -0
- package/development/14-full-lifecycle/software-lifecycle-gates.md +511 -0
- package/development/15-lifecycle-templates/project-templates-collection.md +791 -0
- package/development/api-contract-and-versioning-guide.md +36 -0
- package/development/api-governance-complete.md +43 -0
- package/development/backend-engineering-complete.md +43 -0
- package/development/code-review-quality-complete.md +43 -0
- package/development/concurrency-reliability-complete.md +43 -0
- package/development/database-engineering-complete.md +43 -0
- package/development/engineering-effectiveness-complete.md +43 -0
- package/development/engineering-standards-deep-dive.md +38 -0
- package/development/frontend-engineering-complete.md +43 -0
- package/development/performance-capacity-complete.md +43 -0
- package/development/refactor-migration-complete.md +42 -0
- package/development/refactoring-and-techdebt-playbook.md +37 -0
- package/development/security-in-development-complete.md +43 -0
- package/devops/01-standards/cicd-pipeline-complete.md +262 -0
- package/devops/01-standards/docker-complete.md +1490 -0
- package/devops/01-standards/github-actions-complete.md +337 -0
- package/devops/01-standards/kubernetes-complete.md +638 -0
- package/devops/01-standards/terraform-complete.md +2117 -0
- package/devops/02-playbooks/docker-compose-playbook.md +233 -0
- package/devops/02-playbooks/docker-k8s-production-playbook.md +186 -0
- package/devops/02-playbooks/docker-production-playbook.md +952 -0
- package/edge-iot/01-standards/edge-iot-complete.md +473 -0
- package/experts/architect/api-design.md +178 -0
- package/experts/architect/methodology.md +124 -0
- package/experts/architect/security.md +75 -0
- package/experts/backend-lead/methodology.md +216 -0
- package/experts/devops/methodology.md +160 -0
- package/experts/frontend-lead/methodology.md +178 -0
- package/experts/product-manager/industry/ecommerce.md +43 -0
- package/experts/product-manager/industry/saas.md +40 -0
- package/experts/product-manager/methodology.md +97 -0
- package/experts/qa-lead/methodology.md +123 -0
- package/experts/qa-lead/test-strategy.md +128 -0
- package/experts/uiux-designer/methodology.md +125 -0
- package/frontend/01-standards/accessibility-complete.md +532 -0
- package/frontend/01-standards/accessibility-standard.md +74 -0
- package/frontend/01-standards/admin-dashboard-and-crud.md +72 -0
- package/frontend/01-standards/design-tokens-complete.md +444 -0
- package/frontend/01-standards/forms-and-validation.md +77 -0
- package/frontend/01-standards/frontend-architecture-and-layering.md +119 -0
- package/frontend/01-standards/i18n-and-localization.md +65 -0
- package/frontend/01-standards/nextjs-complete.md +451 -0
- package/frontend/01-standards/react-complete.md +713 -0
- package/frontend/01-standards/react-hooks-complete-guide.md +1100 -0
- package/frontend/01-standards/react-hooks-complete.md +1171 -0
- package/frontend/01-standards/seo-and-web-vitals.md +77 -0
- package/frontend/01-standards/state-management-complete.md +444 -0
- package/frontend/01-standards/vue-complete.md +499 -0
- package/frontend/01-standards/vue3-complete.md +2002 -0
- package/frontend/01-standards/web-framework-best-practices.md +64 -0
- package/frontend/01-standards/web-performance-complete.md +495 -0
- package/frontend/02-playbooks/accessibility-a11y-playbook.md +161 -0
- package/frontend/02-playbooks/frontend-performance-playbook.md +707 -0
- package/frontend/02-playbooks/i18n-internationalization-playbook.md +120 -0
- package/frontend/02-playbooks/performance-optimization-playbook.md +163 -0
- package/frontend/02-playbooks/react-nextjs-production-playbook.md +167 -0
- package/frontend/02-playbooks/react-state-management-playbook.md +173 -0
- package/frontend/03-checklists/component-quality-checklist.md +166 -0
- package/frontend/03-checklists/frontend-launch-checklist.md +299 -0
- package/frontend/04-antipatterns/frontend-antipatterns.md +886 -0
- package/frontend/05-cases/case-performance-optimization.md +274 -0
- package/harmony/01-standards/harmonyos-arkts-standard.md +75 -0
- package/harmony/01-standards/harmonyos-design.md +65 -0
- package/high-quality-engineering-playbook.md +54 -0
- package/incident/01-standards/incident-response-complete.md +303 -0
- package/incident/02-playbooks/chaos-engineering-playbook.md +883 -0
- package/incident/02-playbooks/postmortem-playbook.md +398 -0
- package/incident/03-checklists/incident-readiness-checklist.md +181 -0
- package/incident/04-antipatterns/incident-antipatterns.md +490 -0
- package/incident/05-cases/case-cascade-failure.md +176 -0
- package/incident/06-glossary/incident-glossary.md +114 -0
- package/incident/postmortem-and-response-deep-dive.md +39 -0
- package/industries/ecommerce/ecommerce-complete.md +631 -0
- package/industries/education/education-complete.md +555 -0
- package/industries/fintech/fintech-complete.md +501 -0
- package/industries/gaming/gaming-complete.md +587 -0
- package/industries/healthcare/healthcare-complete.md +452 -0
- package/low-code/01-standards/low-code-complete.md +944 -0
- package/miniprogram/01-standards/ai-common-mistakes.md +61 -0
- package/miniprogram/01-standards/miniprogram-custom-navbar-capsule.md +77 -0
- package/miniprogram/01-standards/miniprogram-design.md +61 -0
- package/miniprogram/01-standards/miniprogram-standard.md +81 -0
- package/mobile/01-standards/android-material-design.md +70 -0
- package/mobile/01-standards/flutter-complete.md +384 -0
- package/mobile/01-standards/ios-design-hig.md +78 -0
- package/mobile/01-standards/mobile-app-standard.md +85 -0
- package/mobile/01-standards/react-native-complete.md +352 -0
- package/mobile/02-playbooks/mobile-cross-platform-playbook.md +175 -0
- package/mobile/02-playbooks/mobile-performance.md +473 -0
- package/mobile/03-checklists/mobile-release-checklist.md +234 -0
- package/mobile/04-antipatterns/mobile-antipatterns.md +798 -0
- package/mobile/05-cases/case-app-performance.md +500 -0
- package/mobile/05-cases/case-app-startup-optimization.md +218 -0
- package/mobile/06-glossary/mobile-glossary.md +484 -0
- package/observability/01-standards/observability-standards.md +103 -0
- package/observability/02-playbooks/prometheus-grafana-playbook.md +135 -0
- package/observability/02-playbooks/structured-logging-playbook.md +73 -0
- package/observability/03-checklists/observability-checklist.md +54 -0
- package/observability/04-antipatterns/observability-antipatterns.md +106 -0
- package/operations/01-standards/prometheus-monitoring-complete.md +1578 -0
- package/operations/02-playbooks/capacity-planning-playbook.md +620 -0
- package/operations/03-checklists/production-launch-checklist.md +365 -0
- package/operations/04-antipatterns/operations-antipatterns.md +664 -0
- package/operations/05-cases/case-sre-practices.md +581 -0
- package/operations/06-glossary/operations-glossary.md +120 -0
- package/operations/aiops-anomaly-detection.md +758 -0
- package/operations/capacity-planning.md +1061 -0
- package/operations/chaos-engineering.md +659 -0
- package/operations/incident-command-system.md +38 -0
- package/operations/observability-complete.md +442 -0
- package/operations/slo-sli-playbook.md +517 -0
- package/operations/sre-operations-deep-dive.md +39 -0
- package/package.json +8 -0
- package/performance/01-standards/performance-and-scalability.md +80 -0
- package/performance/01-standards/performance-standards.md +156 -0
- package/performance/02-playbooks/query-optimization-playbook.md +103 -0
- package/performance/03-checklists/performance-checklist.md +56 -0
- package/performance/04-antipatterns/performance-antipatterns.md +146 -0
- package/product/01-standards/product-management-complete.md +285 -0
- package/product/02-playbooks/feature-launch-playbook.md +207 -0
- package/product/02-playbooks/user-research-playbook.md +532 -0
- package/product/03-checklists/feature-launch-checklist.md +275 -0
- package/product/04-antipatterns/product-antipatterns.md +355 -0
- package/product/05-cases/case-mvp-to-scale.md +384 -0
- package/product/06-glossary/product-glossary.md +462 -0
- package/product/feature-prioritization-framework.md +40 -0
- package/product/kpi-and-metric-tree.md +37 -0
- package/product/product-discovery-and-prd-deep-dive.md +41 -0
- package/quantum/01-standards/quantum-complete.md +1186 -0
- package/security/01-standards/api-security-complete.md +511 -0
- package/security/01-standards/container-runtime-security.md +574 -0
- package/security/01-standards/data-protection-gdpr.md +543 -0
- package/security/01-standards/owasp-top10-complete.md +1890 -0
- package/security/01-standards/secure-coding-baseline.md +90 -0
- package/security/01-standards/supply-chain-security.md +441 -0
- package/security/01-standards/web-security-checklist.md +108 -0
- package/security/01-standards/zero-trust-architecture.md +521 -0
- package/security/02-playbooks/auth-sso-playbook.md +166 -0
- package/security/02-playbooks/incident-response-security-playbook.md +588 -0
- package/security/02-playbooks/owasp-api-security-playbook.md +129 -0
- package/security/02-playbooks/payment-integration-playbook.md +119 -0
- package/security/02-playbooks/penetration-testing-playbook.md +517 -0
- package/security/03-checklists/security-audit-checklist.md +356 -0
- package/security/04-antipatterns/security-coding-antipatterns.md +580 -0
- package/security/05-cases/case-log4shell-incident.md +537 -0
- package/security/05-cases/case-major-breaches.md +468 -0
- package/security/06-glossary/security-glossary.md +212 -0
- package/security/compliance-automation.md +993 -0
- package/security/container-security.md +680 -0
- package/security/devsecops-complete.md +426 -0
- package/security/sast-dast-sca.md +775 -0
- package/security/secrets-management.md +594 -0
- package/security/security-architecture-deep-dive.md +37 -0
- package/security/threat-modeling-stride-playbook.md +40 -0
- package/seed-templates/auth-system.md +59 -0
- package/seed-templates/blog-content.md +94 -0
- package/seed-templates/dashboard.md +89 -0
- package/seed-templates/docs-site.md +73 -0
- package/seed-templates/e-commerce.md +50 -0
- package/seed-templates/saas-landing.md +92 -0
- package/seed-templates/settings-page.md +51 -0
- package/testing/01-standards/test-strategy-and-layering.md +83 -0
- package/testing/01-standards/testing-strategy-complete.md +422 -0
- package/testing/01-standards/unit-testing-best-practices.md +118 -0
- package/testing/02-playbooks/e2e-testing-playbook.md +988 -0
- package/testing/02-playbooks/testing-strategy-playbook.md +126 -0
- package/testing/03-checklists/test-strategy-checklist.md +208 -0
- package/testing/04-antipatterns/testing-antipatterns.md +718 -0
- package/testing/05-cases/case-testing-transformation.md +300 -0
- package/testing/06-glossary/testing-glossary.md +110 -0
- package/testing/risk-based-test-matrix.md +36 -0
- package/testing/testing-strategy-deep-dive.md +37 -0
|
@@ -0,0 +1,968 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: microservices-patterns-complete
|
|
3
|
+
title: 微服务架构模式完全指南
|
|
4
|
+
domain: architecture
|
|
5
|
+
category: 01-standards
|
|
6
|
+
difficulty: advanced
|
|
7
|
+
tags: [microservices, architecture, distributed-systems, patterns]
|
|
8
|
+
quality_score: 94
|
|
9
|
+
maintainer: architecture-team@umadev.com
|
|
10
|
+
last_updated: 2026-03-29
|
|
11
|
+
version: 3.0
|
|
12
|
+
related_knowledge:
|
|
13
|
+
- ddd-complete
|
|
14
|
+
- event-driven-architecture
|
|
15
|
+
- api-gateway-patterns
|
|
16
|
+
prerequisites:
|
|
17
|
+
- software-architecture-fundamentals
|
|
18
|
+
- distributed-systems-basics
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# 微服务架构模式完全指南
|
|
22
|
+
|
|
23
|
+
## 概述
|
|
24
|
+
|
|
25
|
+
微服务架构是一种将单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,并使用轻量级机制(通常是 HTTP Resource API)进行通信。每个服务都是围绕业务能力构建的,并可以由全自动部署机制独立部署。这些服务可以用不同的编程语言编写,使用不同的数据存储技术。
|
|
26
|
+
|
|
27
|
+
本指南将全面讲解微服务架构的核心模式、设计原则、实施策略以及生产环境中的最佳实践。
|
|
28
|
+
|
|
29
|
+
## 核心概念
|
|
30
|
+
|
|
31
|
+
### 1. 微服务 vs 单体架构
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
graph TB
|
|
35
|
+
subgraph "单体架构"
|
|
36
|
+
A1[单一应用] --> B1[单一数据库]
|
|
37
|
+
A1 --> C1[单一部署单元]
|
|
38
|
+
A1 --> D1[紧耦合]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
subgraph "微服务架构"
|
|
42
|
+
A2[用户服务] --> B2[用户DB]
|
|
43
|
+
C2[订单服务] --> D2[订单DB]
|
|
44
|
+
E2[支付服务] --> F2[支付DB]
|
|
45
|
+
G2[通知服务] --> H2[通知DB]
|
|
46
|
+
|
|
47
|
+
A2 -.->|HTTP/gRPC| C2
|
|
48
|
+
C2 -.->|HTTP/gRPC| E2
|
|
49
|
+
E2 -.->|消息队列| G2
|
|
50
|
+
end
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
#### 微服务的优势
|
|
54
|
+
|
|
55
|
+
| 优势 | 说明 |
|
|
56
|
+
|------|------|
|
|
57
|
+
| **独立部署** | 每个服务可以独立部署,不影响其他服务 |
|
|
58
|
+
| **技术多样性** | 不同服务可以使用最适合的技术栈 |
|
|
59
|
+
| **故障隔离** | 一个服务失败不会导致整个系统崩溃 |
|
|
60
|
+
| **可扩展性** | 可以单独扩展瓶颈服务 |
|
|
61
|
+
| **团队自治** | 不同团队可以独立开发和维护服务 |
|
|
62
|
+
|
|
63
|
+
#### 微服务的挑战
|
|
64
|
+
|
|
65
|
+
| 挑战 | 说明 |
|
|
66
|
+
|------|------|
|
|
67
|
+
| **分布式复杂性** | 网络延迟、部分失败、分布式事务 |
|
|
68
|
+
| **运维复杂性** | 需要自动化部署、监控、日志聚合 |
|
|
69
|
+
| **数据一致性** | 跨服务的数据一致性难以保证 |
|
|
70
|
+
| **测试复杂性** | 需要集成测试和端到端测试 |
|
|
71
|
+
| **服务发现** | 服务实例动态变化,需要服务发现机制 |
|
|
72
|
+
|
|
73
|
+
### 2. 微服务设计原则
|
|
74
|
+
|
|
75
|
+
#### 单一职责原则 (SRP)
|
|
76
|
+
|
|
77
|
+
每个微服务应该只负责一个业务能力:
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
# ❌ 错误: 服务职责过多
|
|
81
|
+
class UserOrderService:
|
|
82
|
+
def create_user(self): pass
|
|
83
|
+
def create_order(self): pass
|
|
84
|
+
def process_payment(self): pass
|
|
85
|
+
def send_notification(self): pass
|
|
86
|
+
|
|
87
|
+
# ✅ 正确: 职责单一
|
|
88
|
+
class UserService:
|
|
89
|
+
def create_user(self): pass
|
|
90
|
+
def update_user(self): pass
|
|
91
|
+
def get_user(self): pass
|
|
92
|
+
|
|
93
|
+
class OrderService:
|
|
94
|
+
def create_order(self): pass
|
|
95
|
+
def update_order(self): pass
|
|
96
|
+
|
|
97
|
+
class PaymentService:
|
|
98
|
+
def process_payment(self): pass
|
|
99
|
+
|
|
100
|
+
class NotificationService:
|
|
101
|
+
def send_notification(self): pass
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
#### 围绕业务能力建模
|
|
105
|
+
|
|
106
|
+
使用领域驱动设计 (DDD) 的限界上下文 (Bounded Context):
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
# 用户上下文
|
|
110
|
+
class User:
|
|
111
|
+
def __init__(self, user_id, email, name):
|
|
112
|
+
self.user_id = user_id
|
|
113
|
+
self.email = email
|
|
114
|
+
self.name = name
|
|
115
|
+
|
|
116
|
+
# 订单上下文
|
|
117
|
+
class Order:
|
|
118
|
+
def __init__(self, order_id, customer_id, items):
|
|
119
|
+
self.order_id = order_id
|
|
120
|
+
self.customer_id = customer_id # 只存储 ID,不存储完整用户信息
|
|
121
|
+
self.items = items
|
|
122
|
+
self.status = "pending"
|
|
123
|
+
|
|
124
|
+
# 支付上下文
|
|
125
|
+
class Payment:
|
|
126
|
+
def __init__(self, payment_id, order_id, amount):
|
|
127
|
+
self.payment_id = payment_id
|
|
128
|
+
self.order_id = order_id
|
|
129
|
+
self.amount = amount
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## 核心模式
|
|
133
|
+
|
|
134
|
+
### 1. API 网关模式 (API Gateway)
|
|
135
|
+
|
|
136
|
+
#### 问题
|
|
137
|
+
客户端需要与多个服务通信,导致:
|
|
138
|
+
- 多次网络请求
|
|
139
|
+
- 跨域问题
|
|
140
|
+
- 协议转换复杂
|
|
141
|
+
- 认证逻辑重复
|
|
142
|
+
|
|
143
|
+
#### 解决方案
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
from fastapi import FastAPI, HTTPException, Depends
|
|
147
|
+
from pydantic import BaseModel
|
|
148
|
+
import httpx
|
|
149
|
+
|
|
150
|
+
app = FastAPI()
|
|
151
|
+
|
|
152
|
+
class Gateway:
|
|
153
|
+
def __init__(self):
|
|
154
|
+
self.services = {
|
|
155
|
+
"user": "http://user-service:8001",
|
|
156
|
+
"order": "http://order-service:8002",
|
|
157
|
+
"product": "http://product-service:8003"
|
|
158
|
+
}
|
|
159
|
+
self.client = httpx.AsyncClient()
|
|
160
|
+
|
|
161
|
+
async def call_service(self, service_name: str, path: str, method: str = "GET", data=None):
|
|
162
|
+
base_url = self.services.get(service_name)
|
|
163
|
+
if not base_url:
|
|
164
|
+
raise HTTPException(status_code=404, detail="Service not found")
|
|
165
|
+
|
|
166
|
+
url = f"{base_url}{path}"
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
if method == "GET":
|
|
170
|
+
response = await self.client.get(url)
|
|
171
|
+
elif method == "POST":
|
|
172
|
+
response = await self.client.post(url, json=data)
|
|
173
|
+
elif method == "PUT":
|
|
174
|
+
response = await self.client.put(url, json=data)
|
|
175
|
+
elif method == "DELETE":
|
|
176
|
+
response = await self.client.delete(url)
|
|
177
|
+
|
|
178
|
+
return response.json()
|
|
179
|
+
except httpx.RequestError as e:
|
|
180
|
+
raise HTTPException(status_code=503, detail=f"Service unavailable: {str(e)}")
|
|
181
|
+
|
|
182
|
+
gateway = Gateway()
|
|
183
|
+
|
|
184
|
+
# API 网关路由
|
|
185
|
+
@app.get("/api/users/{user_id}")
|
|
186
|
+
async def get_user(user_id: int):
|
|
187
|
+
return await gateway.call_service("user", f"/users/{user_id}")
|
|
188
|
+
|
|
189
|
+
@app.post("/api/orders")
|
|
190
|
+
async def create_order(order_data: dict):
|
|
191
|
+
# 1. 验证用户
|
|
192
|
+
user = await gateway.call_service("user", f"/users/{order_data['user_id']}")
|
|
193
|
+
if not user:
|
|
194
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
195
|
+
|
|
196
|
+
# 2. 验证产品
|
|
197
|
+
products = await gateway.call_service("product", "/products/batch", "POST",
|
|
198
|
+
{"product_ids": order_data['product_ids']})
|
|
199
|
+
|
|
200
|
+
# 3. 创建订单
|
|
201
|
+
order = await gateway.call_service("order", "/orders", "POST", {
|
|
202
|
+
"user_id": order_data['user_id'],
|
|
203
|
+
"products": products,
|
|
204
|
+
"total": sum(p['price'] for p in products)
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
return order
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
#### API 网关职责
|
|
211
|
+
|
|
212
|
+
```mermaid
|
|
213
|
+
graph LR
|
|
214
|
+
A[客户端] --> B[API 网关]
|
|
215
|
+
B --> C[认证授权]
|
|
216
|
+
B --> D[限流熔断]
|
|
217
|
+
B --> E[日志监控]
|
|
218
|
+
B --> F[协议转换]
|
|
219
|
+
B --> G[请求路由]
|
|
220
|
+
|
|
221
|
+
G --> H[用户服务]
|
|
222
|
+
G --> I[订单服务]
|
|
223
|
+
G --> J[支付服务]
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 2. 服务发现模式 (Service Discovery)
|
|
227
|
+
|
|
228
|
+
#### 问题
|
|
229
|
+
在动态环境中,服务实例的网络地址会动态变化,客户端如何知道服务地址?
|
|
230
|
+
|
|
231
|
+
#### 解决方案: 服务注册中心
|
|
232
|
+
|
|
233
|
+
```python
|
|
234
|
+
# 服务注册中心
|
|
235
|
+
import asyncio
|
|
236
|
+
from datetime import datetime, timedelta
|
|
237
|
+
from typing import Dict, List
|
|
238
|
+
from dataclasses import dataclass
|
|
239
|
+
|
|
240
|
+
@dataclass
|
|
241
|
+
class ServiceInstance:
|
|
242
|
+
service_name: str
|
|
243
|
+
instance_id: str
|
|
244
|
+
host: str
|
|
245
|
+
port: int
|
|
246
|
+
last_heartbeat: datetime
|
|
247
|
+
metadata: dict
|
|
248
|
+
|
|
249
|
+
class ServiceRegistry:
|
|
250
|
+
def __init__(self, heartbeat_timeout: int = 30):
|
|
251
|
+
self.services: Dict[str, List[ServiceInstance]] = {}
|
|
252
|
+
self.heartbeat_timeout = heartbeat_timeout
|
|
253
|
+
|
|
254
|
+
def register(self, service_name: str, instance_id: str, host: str, port: int, metadata: dict = None):
|
|
255
|
+
"""服务注册"""
|
|
256
|
+
if service_name not in self.services:
|
|
257
|
+
self.services[service_name] = []
|
|
258
|
+
|
|
259
|
+
instance = ServiceInstance(
|
|
260
|
+
service_name=service_name,
|
|
261
|
+
instance_id=instance_id,
|
|
262
|
+
host=host,
|
|
263
|
+
port=port,
|
|
264
|
+
last_heartbeat=datetime.now(),
|
|
265
|
+
metadata=metadata or {}
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
# 检查是否已存在
|
|
269
|
+
existing = next((i for i in self.services[service_name]
|
|
270
|
+
if i.instance_id == instance_id), None)
|
|
271
|
+
if existing:
|
|
272
|
+
self.services[service_name].remove(existing)
|
|
273
|
+
|
|
274
|
+
self.services[service_name].append(instance)
|
|
275
|
+
print(f"Registered: {service_name} at {host}:{port}")
|
|
276
|
+
|
|
277
|
+
def deregister(self, service_name: str, instance_id: str):
|
|
278
|
+
"""服务注销"""
|
|
279
|
+
if service_name in self.services:
|
|
280
|
+
self.services[service_name] = [
|
|
281
|
+
i for i in self.services[service_name]
|
|
282
|
+
if i.instance_id != instance_id
|
|
283
|
+
]
|
|
284
|
+
print(f"Deregistered: {service_name}/{instance_id}")
|
|
285
|
+
|
|
286
|
+
def heartbeat(self, service_name: str, instance_id: str):
|
|
287
|
+
"""心跳更新"""
|
|
288
|
+
if service_name in self.services:
|
|
289
|
+
instance = next((i for i in self.services[service_name]
|
|
290
|
+
if i.instance_id == instance_id), None)
|
|
291
|
+
if instance:
|
|
292
|
+
instance.last_heartbeat = datetime.now()
|
|
293
|
+
|
|
294
|
+
def get_instances(self, service_name: str) -> List[ServiceInstance]:
|
|
295
|
+
"""获取健康的服务实例"""
|
|
296
|
+
if service_name not in self.services:
|
|
297
|
+
return []
|
|
298
|
+
|
|
299
|
+
# 过滤掉超时的实例
|
|
300
|
+
now = datetime.now()
|
|
301
|
+
healthy = [
|
|
302
|
+
i for i in self.services[service_name]
|
|
303
|
+
if (now - i.last_heartbeat).total_seconds() < self.heartbeat_timeout
|
|
304
|
+
]
|
|
305
|
+
|
|
306
|
+
return healthy
|
|
307
|
+
|
|
308
|
+
def cleanup_expired(self):
|
|
309
|
+
"""清理过期实例"""
|
|
310
|
+
now = datetime.now()
|
|
311
|
+
for service_name in list(self.services.keys()):
|
|
312
|
+
before_count = len(self.services[service_name])
|
|
313
|
+
self.services[service_name] = [
|
|
314
|
+
i for i in self.services[service_name]
|
|
315
|
+
if (now - i.last_heartbeat).total_seconds() < self.heartbeat_timeout
|
|
316
|
+
]
|
|
317
|
+
after_count = len(self.services[service_name])
|
|
318
|
+
if before_count != after_count:
|
|
319
|
+
print(f"Cleaned up {before_count - after_count} expired instances for {service_name}")
|
|
320
|
+
|
|
321
|
+
# 使用示例
|
|
322
|
+
registry = ServiceRegistry()
|
|
323
|
+
|
|
324
|
+
# 服务启动时注册
|
|
325
|
+
registry.register("user-service", "instance-1", "192.168.1.10", 8001, {"version": "1.0"})
|
|
326
|
+
registry.register("user-service", "instance-2", "192.168.1.11", 8001, {"version": "1.0"})
|
|
327
|
+
|
|
328
|
+
# 客户端发现服务
|
|
329
|
+
instances = registry.get_instances("user-service")
|
|
330
|
+
print(f"Available instances: {len(instances)}")
|
|
331
|
+
for instance in instances:
|
|
332
|
+
print(f" - {instance.host}:{instance.port}")
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
#### 客户端负载均衡
|
|
336
|
+
|
|
337
|
+
```python
|
|
338
|
+
import random
|
|
339
|
+
from typing import List
|
|
340
|
+
|
|
341
|
+
class LoadBalancer:
|
|
342
|
+
"""负载均衡器"""
|
|
343
|
+
|
|
344
|
+
@staticmethod
|
|
345
|
+
def round_robin(instances: List[ServiceInstance], index: int) -> ServiceInstance:
|
|
346
|
+
"""轮询策略"""
|
|
347
|
+
return instances[index % len(instances)]
|
|
348
|
+
|
|
349
|
+
@staticmethod
|
|
350
|
+
def random_choice(instances: List[ServiceInstance]) -> ServiceInstance:
|
|
351
|
+
"""随机策略"""
|
|
352
|
+
return random.choice(instances)
|
|
353
|
+
|
|
354
|
+
@staticmethod
|
|
355
|
+
def weighted_random(instances: List[ServiceInstance]) -> ServiceInstance:
|
|
356
|
+
"""加权随机"""
|
|
357
|
+
weights = [i.metadata.get('weight', 1) for i in instances]
|
|
358
|
+
return random.choices(instances, weights=weights)[0]
|
|
359
|
+
|
|
360
|
+
@staticmethod
|
|
361
|
+
def least_connections(instances: List[ServiceInstance]) -> ServiceInstance:
|
|
362
|
+
"""最少连接数"""
|
|
363
|
+
return min(instances, key=lambda i: i.metadata.get('connections', 0))
|
|
364
|
+
|
|
365
|
+
# 使用示例
|
|
366
|
+
class ServiceClient:
|
|
367
|
+
def __init__(self, registry: ServiceRegistry, load_balancer=LoadBalancer.round_robin):
|
|
368
|
+
self.registry = registry
|
|
369
|
+
self.load_balancer = load_balancer
|
|
370
|
+
self.call_count = {}
|
|
371
|
+
|
|
372
|
+
async def call(self, service_name: str, path: str):
|
|
373
|
+
# 获取实例列表
|
|
374
|
+
instances = self.registry.get_instances(service_name)
|
|
375
|
+
if not instances:
|
|
376
|
+
raise Exception(f"No available instances for {service_name}")
|
|
377
|
+
|
|
378
|
+
# 负载均衡选择实例
|
|
379
|
+
if service_name not in self.call_count:
|
|
380
|
+
self.call_count[service_name] = 0
|
|
381
|
+
|
|
382
|
+
instance = self.load_balancer(instances, self.call_count[service_name])
|
|
383
|
+
self.call_count[service_name] += 1
|
|
384
|
+
|
|
385
|
+
# 发起调用
|
|
386
|
+
url = f"http://{instance.host}:{instance.port}{path}"
|
|
387
|
+
print(f"Calling {url}")
|
|
388
|
+
# 实际调用逻辑...
|
|
389
|
+
return {"status": "ok", "url": url}
|
|
390
|
+
|
|
391
|
+
client = ServiceClient(registry)
|
|
392
|
+
result = await client.call("user-service", "/users/123")
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### 3. 熔断器模式 (Circuit Breaker)
|
|
396
|
+
|
|
397
|
+
#### 问题
|
|
398
|
+
当服务不可用时,客户端持续调用会导致:
|
|
399
|
+
- 资源耗尽
|
|
400
|
+
- 级联失败
|
|
401
|
+
- 响应时间过长
|
|
402
|
+
|
|
403
|
+
#### 解决方案
|
|
404
|
+
|
|
405
|
+
```python
|
|
406
|
+
import time
|
|
407
|
+
from enum import Enum
|
|
408
|
+
from typing import Callable
|
|
409
|
+
from functools import wraps
|
|
410
|
+
|
|
411
|
+
class CircuitState(Enum):
|
|
412
|
+
CLOSED = "closed" # 正常状态
|
|
413
|
+
OPEN = "open" # 熔断状态
|
|
414
|
+
HALF_OPEN = "half_open" # 半开状态
|
|
415
|
+
|
|
416
|
+
class CircuitBreaker:
|
|
417
|
+
"""熔断器"""
|
|
418
|
+
|
|
419
|
+
def __init__(
|
|
420
|
+
self,
|
|
421
|
+
failure_threshold: int = 5,
|
|
422
|
+
timeout: int = 60,
|
|
423
|
+
success_threshold: int = 3
|
|
424
|
+
):
|
|
425
|
+
self.failure_threshold = failure_threshold
|
|
426
|
+
self.timeout = timeout
|
|
427
|
+
self.success_threshold = success_threshold
|
|
428
|
+
|
|
429
|
+
self.failure_count = 0
|
|
430
|
+
self.success_count = 0
|
|
431
|
+
self.state = CircuitState.CLOSED
|
|
432
|
+
self.last_failure_time = None
|
|
433
|
+
|
|
434
|
+
def call(self, func: Callable, *args, **kwargs):
|
|
435
|
+
"""执行函数调用"""
|
|
436
|
+
if self.state == CircuitState.OPEN:
|
|
437
|
+
# 检查是否可以进入半开状态
|
|
438
|
+
if self._should_attempt_reset():
|
|
439
|
+
self.state = CircuitState.HALF_OPEN
|
|
440
|
+
else:
|
|
441
|
+
raise Exception("Circuit breaker is OPEN")
|
|
442
|
+
|
|
443
|
+
try:
|
|
444
|
+
result = func(*args, **kwargs)
|
|
445
|
+
self._on_success()
|
|
446
|
+
return result
|
|
447
|
+
except Exception as e:
|
|
448
|
+
self._on_failure()
|
|
449
|
+
raise e
|
|
450
|
+
|
|
451
|
+
def _should_attempt_reset(self) -> bool:
|
|
452
|
+
"""检查是否应该尝试重置"""
|
|
453
|
+
if self.last_failure_time is None:
|
|
454
|
+
return False
|
|
455
|
+
|
|
456
|
+
elapsed = time.time() - self.last_failure_time
|
|
457
|
+
return elapsed >= self.timeout
|
|
458
|
+
|
|
459
|
+
def _on_success(self):
|
|
460
|
+
"""成功回调"""
|
|
461
|
+
self.failure_count = 0
|
|
462
|
+
|
|
463
|
+
if self.state == CircuitState.HALF_OPEN:
|
|
464
|
+
self.success_count += 1
|
|
465
|
+
if self.success_count >= self.success_threshold:
|
|
466
|
+
self.state = CircuitState.CLOSED
|
|
467
|
+
self.success_count = 0
|
|
468
|
+
print("Circuit breaker reset to CLOSED")
|
|
469
|
+
|
|
470
|
+
def _on_failure(self):
|
|
471
|
+
"""失败回调"""
|
|
472
|
+
self.failure_count += 1
|
|
473
|
+
self.last_failure_time = time.time()
|
|
474
|
+
self.success_count = 0
|
|
475
|
+
|
|
476
|
+
if self.failure_count >= self.failure_threshold:
|
|
477
|
+
self.state = CircuitState.OPEN
|
|
478
|
+
print("Circuit breaker opened due to failures")
|
|
479
|
+
|
|
480
|
+
# 装饰器方式使用
|
|
481
|
+
def circuit_breaker(failure_threshold=5, timeout=60):
|
|
482
|
+
"""熔断器装饰器"""
|
|
483
|
+
breaker = CircuitBreaker(failure_threshold, timeout)
|
|
484
|
+
|
|
485
|
+
def decorator(func):
|
|
486
|
+
@wraps(func)
|
|
487
|
+
def wrapper(*args, **kwargs):
|
|
488
|
+
return breaker.call(func, *args, **kwargs)
|
|
489
|
+
|
|
490
|
+
# 暴露熔断器状态
|
|
491
|
+
wrapper.breaker = breaker
|
|
492
|
+
return wrapper
|
|
493
|
+
|
|
494
|
+
return decorator
|
|
495
|
+
|
|
496
|
+
# 使用示例
|
|
497
|
+
@circuit_breaker(failure_threshold=3, timeout=10)
|
|
498
|
+
def call_external_service(url):
|
|
499
|
+
"""调用外部服务"""
|
|
500
|
+
# 模拟随机失败
|
|
501
|
+
import random
|
|
502
|
+
if random.random() < 0.7:
|
|
503
|
+
raise Exception("Service unavailable")
|
|
504
|
+
return {"data": "success"}
|
|
505
|
+
|
|
506
|
+
# 测试
|
|
507
|
+
for i in range(10):
|
|
508
|
+
try:
|
|
509
|
+
result = call_external_service("http://example.com/api")
|
|
510
|
+
print(f"Call {i+1}: Success - {result}")
|
|
511
|
+
except Exception as e:
|
|
512
|
+
print(f"Call {i+1}: Failed - {e}")
|
|
513
|
+
if "Circuit breaker is OPEN" in str(e):
|
|
514
|
+
print(" ⚠️ Circuit breaker is open, stopping calls")
|
|
515
|
+
break
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### 4. 服务间通信模式
|
|
519
|
+
|
|
520
|
+
#### 同步通信: REST/gRPC
|
|
521
|
+
|
|
522
|
+
```python
|
|
523
|
+
# REST API 示例 (FastAPI)
|
|
524
|
+
from fastapi import FastAPI, HTTPException
|
|
525
|
+
from pydantic import BaseModel
|
|
526
|
+
|
|
527
|
+
app = FastAPI()
|
|
528
|
+
|
|
529
|
+
class User(BaseModel):
|
|
530
|
+
id: int
|
|
531
|
+
name: str
|
|
532
|
+
email: str
|
|
533
|
+
|
|
534
|
+
# 用户服务
|
|
535
|
+
users_db = {
|
|
536
|
+
1: User(id=1, name="Alice", email="alice@example.com"),
|
|
537
|
+
2: User(id=2, name="Bob", email="bob@example.com")
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
@app.get("/users/{user_id}", response_model=User)
|
|
541
|
+
async def get_user(user_id: int):
|
|
542
|
+
user = users_db.get(user_id)
|
|
543
|
+
if not user:
|
|
544
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
545
|
+
return user
|
|
546
|
+
|
|
547
|
+
# 订单服务调用用户服务
|
|
548
|
+
import httpx
|
|
549
|
+
|
|
550
|
+
async def get_user_from_user_service(user_id: int):
|
|
551
|
+
"""从用户服务获取用户信息"""
|
|
552
|
+
async with httpx.AsyncClient() as client:
|
|
553
|
+
response = await client.get(f"http://user-service:8001/users/{user_id}")
|
|
554
|
+
if response.status_code == 200:
|
|
555
|
+
return response.json()
|
|
556
|
+
return None
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
#### 异步通信: 消息队列
|
|
560
|
+
|
|
561
|
+
```python
|
|
562
|
+
# 使用 RabbitMQ 的示例
|
|
563
|
+
import pika
|
|
564
|
+
import json
|
|
565
|
+
from typing import Callable
|
|
566
|
+
|
|
567
|
+
class MessageQueue:
|
|
568
|
+
"""消息队列封装"""
|
|
569
|
+
|
|
570
|
+
def __init__(self, host='localhost'):
|
|
571
|
+
self.connection = pika.BlockingConnection(
|
|
572
|
+
pika.ConnectionParameters(host=host)
|
|
573
|
+
)
|
|
574
|
+
self.channel = self.connection.channel()
|
|
575
|
+
|
|
576
|
+
def publish(self, queue_name: str, message: dict):
|
|
577
|
+
"""发布消息"""
|
|
578
|
+
self.channel.queue_declare(queue=queue_name)
|
|
579
|
+
|
|
580
|
+
self.channel.basic_publish(
|
|
581
|
+
exchange='',
|
|
582
|
+
routing_key=queue_name,
|
|
583
|
+
body=json.dumps(message),
|
|
584
|
+
properties=pika.BasicProperties(
|
|
585
|
+
delivery_mode=2, # 持久化
|
|
586
|
+
)
|
|
587
|
+
)
|
|
588
|
+
print(f"Published to {queue_name}: {message}")
|
|
589
|
+
|
|
590
|
+
def consume(self, queue_name: str, callback: Callable):
|
|
591
|
+
"""消费消息"""
|
|
592
|
+
self.channel.queue_declare(queue=queue_name)
|
|
593
|
+
|
|
594
|
+
def on_message(ch, method, properties, body):
|
|
595
|
+
message = json.loads(body)
|
|
596
|
+
callback(message)
|
|
597
|
+
ch.basic_ack(delivery_tag=method.delivery_tag)
|
|
598
|
+
|
|
599
|
+
self.channel.basic_qos(prefetch_count=1)
|
|
600
|
+
self.channel.basic_consume(queue=queue_name, on_message_callback=on_message)
|
|
601
|
+
|
|
602
|
+
print(f"Consuming from {queue_name}...")
|
|
603
|
+
self.channel.start_consuming()
|
|
604
|
+
|
|
605
|
+
def close(self):
|
|
606
|
+
"""关闭连接"""
|
|
607
|
+
self.connection.close()
|
|
608
|
+
|
|
609
|
+
# 使用示例
|
|
610
|
+
mq = MessageQueue()
|
|
611
|
+
|
|
612
|
+
# 订单服务发布订单创建事件
|
|
613
|
+
order_created = {
|
|
614
|
+
"event": "order_created",
|
|
615
|
+
"order_id": 123,
|
|
616
|
+
"user_id": 1,
|
|
617
|
+
"total": 99.99
|
|
618
|
+
}
|
|
619
|
+
mq.publish("order_events", order_created)
|
|
620
|
+
|
|
621
|
+
# 通知服务订阅订单事件
|
|
622
|
+
def handle_order_event(message):
|
|
623
|
+
if message["event"] == "order_created":
|
|
624
|
+
print(f"Sending notification for order {message['order_id']}")
|
|
625
|
+
# 发送邮件/短信通知...
|
|
626
|
+
|
|
627
|
+
# mq.consume("order_events", handle_order_event)
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### 5. 事件溯源模式 (Event Sourcing)
|
|
631
|
+
|
|
632
|
+
#### 问题
|
|
633
|
+
传统 CRUD 只保存当前状态,丢失了历史变更信息
|
|
634
|
+
|
|
635
|
+
#### 解决方案
|
|
636
|
+
|
|
637
|
+
```python
|
|
638
|
+
from typing import List
|
|
639
|
+
from datetime import datetime
|
|
640
|
+
from dataclasses import dataclass
|
|
641
|
+
import json
|
|
642
|
+
|
|
643
|
+
@dataclass
|
|
644
|
+
class Event:
|
|
645
|
+
event_type: str
|
|
646
|
+
aggregate_id: str
|
|
647
|
+
timestamp: str
|
|
648
|
+
data: dict
|
|
649
|
+
|
|
650
|
+
class EventStore:
|
|
651
|
+
"""事件存储"""
|
|
652
|
+
|
|
653
|
+
def __init__(self):
|
|
654
|
+
self.events: List[Event] = []
|
|
655
|
+
|
|
656
|
+
def append(self, event: Event):
|
|
657
|
+
self.events.append(event)
|
|
658
|
+
print(f"Event stored: {event.event_type} for {event.aggregate_id}")
|
|
659
|
+
|
|
660
|
+
def get_events(self, aggregate_id: str) -> List[Event]:
|
|
661
|
+
"""获取聚合的所有事件"""
|
|
662
|
+
return [e for e in self.events if e.aggregate_id == aggregate_id]
|
|
663
|
+
|
|
664
|
+
# 订单聚合根
|
|
665
|
+
class Order:
|
|
666
|
+
"""订单聚合根 (使用事件溯源)"""
|
|
667
|
+
|
|
668
|
+
def __init__(self, order_id: str):
|
|
669
|
+
self.order_id = order_id
|
|
670
|
+
self.status = None
|
|
671
|
+
self.items = []
|
|
672
|
+
self.total = 0
|
|
673
|
+
self.version = 0
|
|
674
|
+
|
|
675
|
+
def create(self, items: List[dict]):
|
|
676
|
+
"""创建订单"""
|
|
677
|
+
if self.version > 0:
|
|
678
|
+
raise Exception("Order already created")
|
|
679
|
+
|
|
680
|
+
event = Event(
|
|
681
|
+
event_type="OrderCreated",
|
|
682
|
+
aggregate_id=self.order_id,
|
|
683
|
+
timestamp=datetime.now().isoformat(),
|
|
684
|
+
data={"items": items}
|
|
685
|
+
)
|
|
686
|
+
self._apply(event)
|
|
687
|
+
return event
|
|
688
|
+
|
|
689
|
+
def confirm(self):
|
|
690
|
+
"""确认订单"""
|
|
691
|
+
if self.status != "pending":
|
|
692
|
+
raise Exception("Can only confirm pending orders")
|
|
693
|
+
|
|
694
|
+
event = Event(
|
|
695
|
+
event_type="OrderConfirmed",
|
|
696
|
+
aggregate_id=self.order_id,
|
|
697
|
+
timestamp=datetime.now().isoformat(),
|
|
698
|
+
data={}
|
|
699
|
+
)
|
|
700
|
+
self._apply(event)
|
|
701
|
+
return event
|
|
702
|
+
|
|
703
|
+
def cancel(self, reason: str):
|
|
704
|
+
"""取消订单"""
|
|
705
|
+
if self.status == "shipped":
|
|
706
|
+
raise Exception("Cannot cancel shipped orders")
|
|
707
|
+
|
|
708
|
+
event = Event(
|
|
709
|
+
event_type="OrderCancelled",
|
|
710
|
+
aggregate_id=self.order_id,
|
|
711
|
+
timestamp=datetime.now().isoformat(),
|
|
712
|
+
data={"reason": reason}
|
|
713
|
+
)
|
|
714
|
+
self._apply(event)
|
|
715
|
+
return event
|
|
716
|
+
|
|
717
|
+
def _apply(self, event: Event):
|
|
718
|
+
"""应用事件"""
|
|
719
|
+
if event.event_type == "OrderCreated":
|
|
720
|
+
self.status = "pending"
|
|
721
|
+
self.items = event.data["items"]
|
|
722
|
+
self.total = sum(item["price"] for item in self.items)
|
|
723
|
+
|
|
724
|
+
elif event.event_type == "OrderConfirmed":
|
|
725
|
+
self.status = "confirmed"
|
|
726
|
+
|
|
727
|
+
elif event.event_type == "OrderCancelled":
|
|
728
|
+
self.status = "cancelled"
|
|
729
|
+
|
|
730
|
+
self.version += 1
|
|
731
|
+
|
|
732
|
+
def load_from_history(self, events: List[Event]):
|
|
733
|
+
"""从事件历史重建状态"""
|
|
734
|
+
for event in events:
|
|
735
|
+
self._apply(event)
|
|
736
|
+
|
|
737
|
+
# 使用示例
|
|
738
|
+
event_store = EventStore()
|
|
739
|
+
|
|
740
|
+
# 创建订单
|
|
741
|
+
order = Order("order-123")
|
|
742
|
+
event1 = order.create([
|
|
743
|
+
{"product_id": 1, "price": 50.0},
|
|
744
|
+
{"product_id": 2, "price": 30.0}
|
|
745
|
+
])
|
|
746
|
+
event_store.append(event1)
|
|
747
|
+
|
|
748
|
+
# 确认订单
|
|
749
|
+
event2 = order.confirm()
|
|
750
|
+
event_store.append(event2)
|
|
751
|
+
|
|
752
|
+
# 重建订单状态
|
|
753
|
+
new_order = Order("order-123")
|
|
754
|
+
history = event_store.get_events("order-123")
|
|
755
|
+
new_order.load_from_history(history)
|
|
756
|
+
|
|
757
|
+
print(f"Order status: {new_order.status}")
|
|
758
|
+
print(f"Order total: {new_order.total}")
|
|
759
|
+
print(f"Order version: {new_order.version}")
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
## 数据管理模式
|
|
763
|
+
|
|
764
|
+
### 1. 数据库每服务模式 (Database per Service)
|
|
765
|
+
|
|
766
|
+
```python
|
|
767
|
+
# 用户服务数据库
|
|
768
|
+
class UserDatabase:
|
|
769
|
+
def __init__(self):
|
|
770
|
+
self.db = {} # 实际使用 PostgreSQL
|
|
771
|
+
|
|
772
|
+
def save(self, user_id, user_data):
|
|
773
|
+
self.db[user_id] = user_data
|
|
774
|
+
|
|
775
|
+
def get(self, user_id):
|
|
776
|
+
return self.db.get(user_id)
|
|
777
|
+
|
|
778
|
+
# 订单服务数据库 (独立)
|
|
779
|
+
class OrderDatabase:
|
|
780
|
+
def __init__(self):
|
|
781
|
+
self.db = {} # 实际使用 MongoDB
|
|
782
|
+
|
|
783
|
+
def save(self, order_id, order_data):
|
|
784
|
+
self.db[order_id] = order_data
|
|
785
|
+
|
|
786
|
+
def get(self, order_id):
|
|
787
|
+
return self.db.get(order_id)
|
|
788
|
+
|
|
789
|
+
# 服务只能访问自己的数据库
|
|
790
|
+
user_db = UserDatabase()
|
|
791
|
+
order_db = OrderDatabase()
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
### 2. Saga 模式 (分布式事务)
|
|
795
|
+
|
|
796
|
+
```python
|
|
797
|
+
from enum import Enum
|
|
798
|
+
from typing import List, Callable
|
|
799
|
+
|
|
800
|
+
class SagaStep:
|
|
801
|
+
"""Saga 步骤"""
|
|
802
|
+
def __init__(self, action: Callable, compensation: Callable):
|
|
803
|
+
self.action = action
|
|
804
|
+
self.compensation = compensation
|
|
805
|
+
|
|
806
|
+
class Saga:
|
|
807
|
+
"""Saga 编排器"""
|
|
808
|
+
|
|
809
|
+
def __init__(self):
|
|
810
|
+
self.steps: List[SagaStep] = []
|
|
811
|
+
self.completed_steps: List[SagaStep] = []
|
|
812
|
+
|
|
813
|
+
def add_step(self, action: Callable, compensation: Callable):
|
|
814
|
+
"""添加步骤"""
|
|
815
|
+
self.steps.append(SagaStep(action, compensation))
|
|
816
|
+
return self
|
|
817
|
+
|
|
818
|
+
async def execute(self):
|
|
819
|
+
"""执行 Saga"""
|
|
820
|
+
try:
|
|
821
|
+
# 正向执行所有步骤
|
|
822
|
+
for step in self.steps:
|
|
823
|
+
await step.action()
|
|
824
|
+
self.completed_steps.append(step)
|
|
825
|
+
|
|
826
|
+
print("Saga completed successfully")
|
|
827
|
+
|
|
828
|
+
except Exception as e:
|
|
829
|
+
print(f"Saga failed: {e}, starting compensation...")
|
|
830
|
+
|
|
831
|
+
# 反向补偿已完成的步骤
|
|
832
|
+
for step in reversed(self.completed_steps):
|
|
833
|
+
try:
|
|
834
|
+
await step.compensation()
|
|
835
|
+
except Exception as comp_error:
|
|
836
|
+
print(f"Compensation failed: {comp_error}")
|
|
837
|
+
|
|
838
|
+
raise e
|
|
839
|
+
|
|
840
|
+
# 使用示例: 创建订单 Saga
|
|
841
|
+
async def create_order_saga(user_id, product_id, amount):
|
|
842
|
+
"""创建订单的 Saga"""
|
|
843
|
+
|
|
844
|
+
saga = Saga()
|
|
845
|
+
|
|
846
|
+
# 步骤1: 创建订单
|
|
847
|
+
async def create_order():
|
|
848
|
+
print(f"Creating order for user {user_id}")
|
|
849
|
+
# 实际创建订单...
|
|
850
|
+
|
|
851
|
+
async def cancel_order():
|
|
852
|
+
print(f"Cancelling order for user {user_id}")
|
|
853
|
+
# 实际取消订单...
|
|
854
|
+
|
|
855
|
+
saga.add_step(create_order, cancel_order)
|
|
856
|
+
|
|
857
|
+
# 步骤2: 扣减库存
|
|
858
|
+
async def deduct_inventory():
|
|
859
|
+
print(f"Deducting inventory for product {product_id}")
|
|
860
|
+
# 实际扣减库存...
|
|
861
|
+
|
|
862
|
+
async def restore_inventory():
|
|
863
|
+
print(f"Restoring inventory for product {product_id}")
|
|
864
|
+
# 实际恢复库存...
|
|
865
|
+
|
|
866
|
+
saga.add_step(deduct_inventory, restore_inventory)
|
|
867
|
+
|
|
868
|
+
# 步骤3: 扣款
|
|
869
|
+
async def charge_payment():
|
|
870
|
+
print(f"Charging {amount} from user {user_id}")
|
|
871
|
+
# 实际扣款...
|
|
872
|
+
|
|
873
|
+
async def refund_payment():
|
|
874
|
+
print(f"Refunding {amount} to user {user_id}")
|
|
875
|
+
# 实际退款...
|
|
876
|
+
|
|
877
|
+
saga.add_step(charge_payment, refund_payment)
|
|
878
|
+
|
|
879
|
+
# 执行 Saga
|
|
880
|
+
await saga.execute()
|
|
881
|
+
|
|
882
|
+
# 测试
|
|
883
|
+
import asyncio
|
|
884
|
+
asyncio.run(create_order_saga(user_id=1, product_id=100, amount=99.99))
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
## 最佳实践
|
|
888
|
+
|
|
889
|
+
### 1. 服务拆分原则
|
|
890
|
+
|
|
891
|
+
- ✅ 单一业务能力
|
|
892
|
+
- ✅ 高内聚低耦合
|
|
893
|
+
- ✅ 独立数据存储
|
|
894
|
+
- ✅ 独立部署能力
|
|
895
|
+
- ✅ 故障隔离
|
|
896
|
+
|
|
897
|
+
### 2. 服务间通信最佳实践
|
|
898
|
+
|
|
899
|
+
```python
|
|
900
|
+
# ✅ 使用异步通信减少耦合
|
|
901
|
+
async def process_order(order_id):
|
|
902
|
+
# 发布事件,而不是直接调用其他服务
|
|
903
|
+
await event_bus.publish("OrderCreated", {"order_id": order_id})
|
|
904
|
+
|
|
905
|
+
# ✅ 使用 API 版本管理
|
|
906
|
+
@app.get("/api/v1/users/{user_id}")
|
|
907
|
+
async def get_user_v1(user_id: int):
|
|
908
|
+
pass
|
|
909
|
+
|
|
910
|
+
@app.get("/api/v2/users/{user_id}")
|
|
911
|
+
async def get_user_v2(user_id: int):
|
|
912
|
+
pass
|
|
913
|
+
|
|
914
|
+
# ✅ 实现幂等性
|
|
915
|
+
processed_orders = set()
|
|
916
|
+
|
|
917
|
+
async def process_payment(order_id):
|
|
918
|
+
if order_id in processed_orders:
|
|
919
|
+
return {"status": "already_processed"}
|
|
920
|
+
|
|
921
|
+
# 处理支付...
|
|
922
|
+
processed_orders.add(order_id)
|
|
923
|
+
return {"status": "success"}
|
|
924
|
+
```
|
|
925
|
+
|
|
926
|
+
### 3. 监控和可观测性
|
|
927
|
+
|
|
928
|
+
```python
|
|
929
|
+
from prometheus_client import Counter, Histogram
|
|
930
|
+
import logging
|
|
931
|
+
|
|
932
|
+
# 指标收集
|
|
933
|
+
request_count = Counter('http_requests_total', 'Total HTTP requests')
|
|
934
|
+
request_latency = Histogram('http_request_duration_seconds', 'HTTP request latency')
|
|
935
|
+
|
|
936
|
+
@app.middleware("http")
|
|
937
|
+
async def monitor_requests(request, call_next):
|
|
938
|
+
request_count.inc()
|
|
939
|
+
|
|
940
|
+
with request_latency.time():
|
|
941
|
+
response = await call_next(request)
|
|
942
|
+
|
|
943
|
+
# 日志记录
|
|
944
|
+
logging.info(f"{request.method} {request.url} - {response.status_code}")
|
|
945
|
+
|
|
946
|
+
return response
|
|
947
|
+
```
|
|
948
|
+
|
|
949
|
+
## 参考资料
|
|
950
|
+
|
|
951
|
+
### 书籍
|
|
952
|
+
- *Building Microservices* by Sam Newman
|
|
953
|
+
- *Microservices Patterns* by Chris Richardson
|
|
954
|
+
- *Production-Ready Microservices* by Susan J. Fowler
|
|
955
|
+
|
|
956
|
+
### 文章
|
|
957
|
+
- [Microservices Guide by Martin Fowler](https://martinfowler.com/microservices/)
|
|
958
|
+
- [Pattern: Microservice Architecture](https://microservices.io/patterns/microservices.html)
|
|
959
|
+
|
|
960
|
+
---
|
|
961
|
+
|
|
962
|
+
**知识ID**: `microservices-patterns-complete`
|
|
963
|
+
**领域**: architecture
|
|
964
|
+
**类型**: standards
|
|
965
|
+
**难度**: advanced
|
|
966
|
+
**质量分**: 94
|
|
967
|
+
**维护者**: architecture-team@umadev.com
|
|
968
|
+
**最后更新**: 2026-03-29
|