springbootAI 2.3.7__tar.gz → 2.3.8__tar.gz
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.
- {springbootai-2.3.7 → springbootai-2.3.8}/CHANGELOG.md +10 -0
- {springbootai-2.3.7/springbootAI.egg-info → springbootai-2.3.8}/PKG-INFO +47 -77
- {springbootai-2.3.7 → springbootai-2.3.8}/README.md +46 -76
- {springbootai-2.3.7 → springbootai-2.3.8}/pyproject.toml +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8/springbootAI.egg-info}/PKG-INFO +47 -77
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootAI.egg-info/SOURCES.txt +4 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/annotation_runtime.py +286 -37
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/annotations.py +20 -3
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cli/scaffold.py +8 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/config_center.py +82 -20
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/discovery.py +115 -39
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/nacos_config.py +158 -88
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/config/__init__.py +4 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/config/config_loader.py +400 -48
- springbootai-2.3.8/springbootai/config/config_monitor.py +248 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/config/spring-configuration-metadata.json +15 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/csv/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/data/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/datasource/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/excel/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/autoconfig.py +92 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/mcp/client.py +39 -13
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/mcp/config.py +4 -2
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/messaging/rabbitmq.py +172 -4
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/version.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/test/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/tx/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/utils/banner.py +2 -2
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/utils/redis_client.py +33 -9
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/validation/__init__.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/actuator.py +72 -3
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/request_metrics.py +17 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/swagger.py +1 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/web_context.py +6 -1
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/websocket/__init__.py +1 -1
- springbootai-2.3.8/tests/test_ai_annotations.py +201 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_config_center.py +25 -0
- springbootai-2.3.8/tests/test_config_center_hardening.py +84 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_config_fixes_185.py +19 -0
- springbootai-2.3.8/tests/test_config_monitor.py +52 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_langchain_module.py +14 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_nacos_config.py +35 -0
- springbootai-2.3.8/tests/test_optional_component_timeouts.py +110 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_runtime_configuration_fixes.py +22 -0
- springbootai-2.3.7/tests/test_ai_annotations.py +0 -100
- {springbootai-2.3.7 → springbootai-2.3.8}/LICENSE +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/MANIFEST.in +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/SECURITY.md +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/requirements-ai.txt +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/requirements-langgraph.txt +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/requirements-mcp.txt +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/requirements.txt +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/setup.cfg +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/setup.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootAI.egg-info/dependency_links.txt +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootAI.egg-info/entry_points.txt +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootAI.egg-info/requires.txt +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootAI.egg-info/top_level.txt +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/advisors.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/autoconfig.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/core.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/etl.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/memory.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/observability.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/providers.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/resilience.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/tools.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/ai/vectorstore.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/batch.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/cache.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/cloud.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/conditional.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/core.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/data.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/enterprise.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/langchain.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/langgraph.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/lombok.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/messaging.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/annotations/security.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/aop/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/aop/aspect.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/aop/cloud_aop.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/aop/comprehensive_aop.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/aop/method_interceptor.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/aop/proxy_factory.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/batch/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cli/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cli/main.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/bus.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/feign.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/gateway.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/load_balancer.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/seata.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/seata_at_proxy.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/seata_bridge.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/sentinel.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/tracer.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/cloud/transaction_store.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/config/binding.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/context/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/context/application_context.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/context/bean_definition.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/context/bean_factory.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/context/lifecycle.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/context/registry.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/context/scanner.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/core/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/core/graceful_shutdown.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/core/typing_utils.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/csv/annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/csv/converters.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/csv/easy_csv.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/csv/exceptions.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/csv/reader.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/csv/writer.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/data/page.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/data/repository.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/data/rest.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/data/specification.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/datasource/annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/datasource/context.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/datasource/dynamic.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/devtools.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/event/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/event/publisher.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/excel/annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/excel/converters.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/excel/easy_excel.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/excel/exceptions.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/excel/reader.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/excel/style.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/excel/writer.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/accessor.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/auto_config.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/holder.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/locale.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/locale_resolver.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/message_source.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/middleware.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/properties.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/i18n/sources.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/adapters.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/agents/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/agents/services.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/callbacks/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/callbacks/handlers.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/chains/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/chains/services.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/core.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/indexes/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/indexes/index.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/loaders/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/loaders/loaders.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/memory/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/memory/memory.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/parsers/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/parsers/parsers.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/partners.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/prompts/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/prompts/templates.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/retrievers/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/retrievers/retrievers.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/tools/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/tools/tools.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/utilities/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/utilities/utils.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/vectorstores/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langchain/vectorstores/stores.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langgraph/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langgraph/annotation_runtime.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langgraph/annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langgraph/autoconfig.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langgraph/checkpoint.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langgraph/config.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/langgraph/runtime.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/logging/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/logging/loguru_logger.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/main.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/mcp/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/mcp/annotation_runtime.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/mcp/annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/mcp/autoconfig.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/mcp/server.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/messaging/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/messaging/kafka.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/monitoring/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/monitoring/admin_client.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/monitoring/prometheus.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/database.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/ddl_auto.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/migration.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/mybatis_integration.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/annotations/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/annotations/annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/cache/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/cache/cache.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/cache/redis_cache.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/circuit_breaker/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/configuration.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/core/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/core/sql_session.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/core/sql_session_factory.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/dialect/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/dialect/dialect.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/dynamic_sql/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/interceptor/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/interceptor/interceptor.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/mapper/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/mapper/mapper.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/metrics/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/metrics/metrics.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/pool/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/pool/connection_pool.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/security/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/security/access_control.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/security/password_encoder.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/security/sensitive_data_masker.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/security/sql_injection_detector.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/transaction/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/transaction/transaction.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/type_handler/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/type_handler/type_handler.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/xml_parser/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/orm/pymybatis/xml_parser/xml_parser.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/retry/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/retry/recovery.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/retry/retry_annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/retry/retry_decorator.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/scheduling/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/scheduling/scheduler.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/security/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/security/jwt_utils.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/security/oauth2.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/security/replay_protection.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/security/secret_manager.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/security/security_aop.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/security/security_context.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/test/slicing.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/tracing/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/tracing/skywalking.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/tx/events.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/tx/synchronization.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/utils/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/utils/bean_utils.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/utils/logger.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/validation/aop.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/validation/constraints.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/validation/exceptions.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/validation/validator.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/__init__.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/csrf.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/exception_handler.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/hateoas.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/health.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/interceptor.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/web/result.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/websocket/annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/websocket/broker.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/websocket/exceptions.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/websocket/handler.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/websocket/router.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/springbootai/websocket/session.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/sql/seata_undo_log.sql +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_actuator.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_actuator_prometheus_admin.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_ai_comprehensive.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_ai_declarative_annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_ai_module.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_annotation_combinations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_annotations_contract.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_aop_annotations_full.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_aop_pointcut_enhancements.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_audit_time.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_batch.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_bean_utils.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_bus.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_cache_annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_cli.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_cloud_embedded_full.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_component_init_error.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_compositional_annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_conditional_annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_config_binding.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_connection_resilience.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_core.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_core_annotations_full.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_csrf.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_csv_module.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_data_repository.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_data_rest.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_datasource_routing.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_ddl_auto.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_declarative_aop_post_authorize_recover.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_devtools.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_di_config_event_full.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_excel_module.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_hateoas.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_i18n_module.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_ioc_lifecycle_enhancements.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_jpa_version_transient.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_kafka.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_langchain_comprehensive.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_langchain_ext.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_langgraph_comprehensive.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_langgraph_module.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_logging_config.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_lombok_annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_mcp_module.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_metadata.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_migration.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_new_annotations.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_new_features.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_oauth2.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_orm_pymybatis_full.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_production_readiness.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_pymybatis_configuration_hardening.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_pymybatis_contract.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_request_metrics.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_retry.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_scaffold_hardening.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_scheduling.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_seata_at_proxy.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_seata_bridge.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_seata_durable_store.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_security.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_security_full.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_security_hardening.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_select_page.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_starter.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_startup_lifecycle.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_swagger_module.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_test_slicing.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_tracing.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_transactional_events.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_validation_module.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_web_annotations_full.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_web_file_upload.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_web_root_mapping.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_web_security_responses.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_web_static_files.py +0 -0
- {springbootai-2.3.7 → springbootai-2.3.8}/tests/test_websocket_module.py +0 -0
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.8] - 2026-08-24
|
|
4
|
+
|
|
5
|
+
- 修复配置加载的原子性与数据库 URL 优先级:请求监控不再误落到根目录 `test.db`,SQLite 运行目录会自动创建,显式 URL/驱动/数据库名称按统一优先级生效。
|
|
6
|
+
- 新增可选配置监控(默认关闭),兼容 YAML、环境变量和 Nacos,提供脱敏历史、变更键、来源、耗时与成功/失败信息,并接入 Actuator/Admin 面板。
|
|
7
|
+
- 修复 Nacos 热更新失败后不重试、客户端状态污染和 Web/Actuator/请求监控配置不刷新的问题;热更新现在安全重绑运行时配置。
|
|
8
|
+
- 修复默认 profile 占位符未参与 profile 文件选择的问题,支持自动加载 `application-default.yml`;同时限制 Nacos 请求超时(最多 120 秒)和热刷新间隔(最多 1 小时)。
|
|
9
|
+
- 为 Nacos 服务发现与 RabbitMQ 增加有限连接/请求超时和重试上限,未配置或服务不可用时不会无限阻塞启动;补充 MCP 本机代理兼容、Redis 单次探测和 AI Cache 并发/容量保护。
|
|
10
|
+
- 加固 Spring Cloud Config 可选客户端:容忍空/错误配置层级,限制 timeout、重试次数与退避间隔,避免配置中心异常反向拖垮启动。
|
|
11
|
+
- 补充条件装配注解示例、可选组件超时回归测试,并同步配置元数据与模块文档。
|
|
12
|
+
|
|
3
13
|
## [2.3.7] - 2026-08-20
|
|
4
14
|
|
|
5
15
|
### PyPI 项目说明修正
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: springbootAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.8
|
|
4
4
|
Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
|
|
5
5
|
Author-email: YuConggen <1516933915@qq.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -187,7 +187,7 @@ SpringBootAI 已提供配套的在线考试认证平台,学习者、团队成
|
|
|
187
187
|
|
|
188
188
|
建议的认证准备流程:
|
|
189
189
|
|
|
190
|
-
1. 先按 README 中的“
|
|
190
|
+
1. 先按 README 中的“1 分钟跑通第一个接口”完成本地环境搭建,确认能够创建应用、启动服务并访问 Swagger。
|
|
191
191
|
2. 阅读 [新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md),理解 `@SpringBootApplication`、`@RestController`、`@Service`、`@Autowired`、配置文件和依赖注入的基本用法。
|
|
192
192
|
3. 根据实际使用方向阅读模块文档,例如 Web MVC、ORM、事务、缓存、安全、配置绑定、测试切片、AI、LangChain、LangGraph、MCP 和 Cloud 微服务等。
|
|
193
193
|
4. 运行示例或编写一个小型业务接口,至少覆盖 Controller、Service、配置读取、异常处理、Swagger 文档和数据访问中的若干能力。
|
|
@@ -216,90 +216,40 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
216
216
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
217
217
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
218
218
|
|
|
219
|
-
当前版本是 `2.3.
|
|
219
|
+
当前版本是 `2.3.8`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 模式通过 ORM 拦截器自动生成 undo_log 实现自动回滚。
|
|
220
220
|
|
|
221
221
|
[新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | [全部文档](https://github.com/YUCONGGEN/springbootAI/tree/master/doc) | [变更日志](https://github.com/YUCONGGEN/springbootAI/blob/master/CHANGELOG.md) | [安全报告](https://github.com/YUCONGGEN/springbootAI/blob/master/SECURITY.md) | [发布检查](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/RELEASE_CHECKLIST.md)
|
|
222
222
|
|
|
223
|
-
##
|
|
223
|
+
## 1 分钟跑通第一个接口
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
已安装 Python 3.10、3.11 或 3.12 时,直接执行下面五条命令。示例不需要数据库、Redis、Docker 或大模型 API Key:
|
|
226
226
|
|
|
227
227
|
```powershell
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
python
|
|
233
|
-
python -m pip install springbootAI
|
|
234
|
-
|
|
235
|
-
mkdir demo
|
|
236
|
-
mkdir demo\controller
|
|
237
|
-
New-Item demo\__init__.py -ItemType File
|
|
238
|
-
New-Item demo\controller\__init__.py -ItemType File
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
Linux/macOS 激活命令是 `source .venv/bin/activate`,其余 Python 命令相同。
|
|
242
|
-
|
|
243
|
-
创建 `demo/Application.py`:
|
|
244
|
-
|
|
245
|
-
```python
|
|
246
|
-
from springbootai.annotations import SpringBootApplication
|
|
247
|
-
from springbootai.main import run
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
@SpringBootApplication(scan_base_packages=["demo"])
|
|
251
|
-
class Application:
|
|
252
|
-
pass
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
if __name__ == "__main__":
|
|
256
|
-
run(Application)
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
创建 `demo/controller/HelloController.py`:
|
|
260
|
-
|
|
261
|
-
```python
|
|
262
|
-
from springbootai.annotations import GetMapping, RequestMapping, RestController
|
|
263
|
-
from springbootai.web.swagger import Operation, Tag
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
@Tag(name="入门接口", description="确认应用已经正常运行")
|
|
267
|
-
@RequestMapping("/api")
|
|
268
|
-
@RestController
|
|
269
|
-
class HelloController:
|
|
270
|
-
@Operation(summary="打招呼")
|
|
271
|
-
@GetMapping("/hello/{name}")
|
|
272
|
-
def hello(self, name: str):
|
|
273
|
-
return {"message": f"Hello, {name}"}
|
|
228
|
+
python -m pip install --upgrade springbootAI
|
|
229
|
+
springbootai init demo --modules web --no-docker --non-interactive
|
|
230
|
+
cd demo
|
|
231
|
+
python -m pip install -r requirements.txt
|
|
232
|
+
python Application.py
|
|
274
233
|
```
|
|
275
234
|
|
|
276
|
-
|
|
235
|
+
`springbootai init demo` 会自动创建 `demo` 项目目录、启动类、配置文件和 Hello 示例接口。`--non-interactive` 表示直接使用默认配置,不进入问答;`--no-docker` 表示本次不生成 Docker 文件。
|
|
277
236
|
|
|
278
|
-
|
|
279
|
-
server:
|
|
280
|
-
host: 127.0.0.1
|
|
281
|
-
port: 8080
|
|
282
|
-
|
|
283
|
-
database:
|
|
284
|
-
enabled: false
|
|
237
|
+
看到下面的输出就说明启动成功:
|
|
285
238
|
|
|
286
|
-
|
|
287
|
-
|
|
239
|
+
```text
|
|
240
|
+
Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
|
|
288
241
|
```
|
|
289
242
|
|
|
290
|
-
|
|
243
|
+
保持服务运行,另开终端验证:
|
|
291
244
|
|
|
292
245
|
```powershell
|
|
293
|
-
|
|
246
|
+
curl http://127.0.0.1:8000/api/hello/Alice
|
|
247
|
+
curl http://127.0.0.1:8000/actuator/health/liveness
|
|
294
248
|
```
|
|
295
249
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
```powershell
|
|
299
|
-
curl http://127.0.0.1:8080/api/hello/Alice
|
|
300
|
-
```
|
|
250
|
+
第一个请求的返回数据中会包含 `"message":"Hello, Alice!"`,健康检查会返回 `"status":"UP"`。浏览器访问 `http://127.0.0.1:8000/docs` 可以直接查看并测试 Swagger 接口。
|
|
301
251
|
|
|
302
|
-
|
|
252
|
+
生成的业务代码位于 `demo/src/demo/`,主配置文件位于 `demo/config/application.yml`。完整参数见 [CLI 模块指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLI_MODULE.md),遇到启动问题时按[新手入门指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md)排查。
|
|
303
253
|
|
|
304
254
|
---
|
|
305
255
|
|
|
@@ -397,10 +347,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
397
347
|
|
|
398
348
|
| 组件 | 当前版本 |
|
|
399
349
|
|------|----------|
|
|
400
|
-
| `springbootai` 框架 API | 2.3.
|
|
401
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
402
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
403
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
350
|
+
| `springbootai` 框架 API | 2.3.8 |
|
|
351
|
+
| `springbootai.orm.pymybatis` | 2.3.8 |
|
|
352
|
+
| `springbootai.ai` AI 模块 | 2.3.8 |
|
|
353
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.8 |
|
|
404
354
|
| Python | 3.10+ |
|
|
405
355
|
|
|
406
356
|
### 1.4 适合什么场景
|
|
@@ -765,14 +715,30 @@ Profile 用于 Bean 过滤和生产安全校验。多环境配置可使用以下
|
|
|
765
715
|
| `/actuator/admin` | **Spring Boot Admin 风格可视化面板**(浏览器打开即用,每 30 秒自动刷新) |
|
|
766
716
|
| `/actuator/prometheus` | **Prometheus 文本格式指标**(供 Prometheus Server 抓取) |
|
|
767
717
|
| `/actuator/sysmetrics` | **进程级系统指标**(RSS/CPU/线程/FD,供 Admin 面板 JS 调用) |
|
|
718
|
+
| `/actuator/config-monitor` | 配置加载与 Nacos 热刷新历史(`management.config-monitor.enabled=true` 后启用,默认关闭) |
|
|
719
|
+
|
|
720
|
+
`database.enabled: false` 时数据库状态为 `DISABLED`,不会创建数据库文件。
|
|
721
|
+
|
|
722
|
+
配置监控默认关闭。需要排查配置来源或热更新时,可在 YAML、环境变量或 Nacos 中设置:
|
|
723
|
+
|
|
724
|
+
```yaml
|
|
725
|
+
management:
|
|
726
|
+
config-monitor:
|
|
727
|
+
enabled: true
|
|
728
|
+
include-values: false # 生产环境建议保持 false
|
|
729
|
+
history-size: 100
|
|
730
|
+
refresh-events: true
|
|
731
|
+
```
|
|
768
732
|
|
|
769
|
-
|
|
733
|
+
开启后访问受 Actuator 鉴权保护的 `/actuator/config-monitor`,或直接查看 Admin
|
|
734
|
+
面板中的“配置刷新监控”卡片。关闭时不保留历史,也不读取配置值。
|
|
770
735
|
|
|
771
736
|
> 详见 [ACTUATOR_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ACTUATOR_MODULE.md) 第四章(Spring Boot Admin 面板)与第五章(Prometheus + Grafana 工业级监控)。
|
|
772
737
|
|
|
773
738
|
> **⚠️ 新手常见错误**:
|
|
774
|
-
> - ❌ 错误:"
|
|
775
|
-
> - ✅
|
|
739
|
+
> - ❌ 错误:"我改了本地 YAML,重新请求接口怎么没生效?"
|
|
740
|
+
> - ✅ 正解:本地 YAML 是启动时读取的,修改后需要重启应用;Nacos 配置只有在启用
|
|
741
|
+
> `NACOS_CONFIG_ENABLED=true` 且 `refresh-enabled=true` 时才会按轮询间隔热刷新。
|
|
776
742
|
|
|
777
743
|
---
|
|
778
744
|
|
|
@@ -1715,9 +1681,13 @@ gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8080 myapp.asgi:app
|
|
|
1715
1681
|
|---------|------|--------|
|
|
1716
1682
|
| `SERVER_PORT` | 服务端口 | 8080 |
|
|
1717
1683
|
| `JWT_SECRET_KEY` | JWT 密钥 | spring-python-secret-key-change-in-production |
|
|
1718
|
-
| `DB_URL` | 数据库连接 URL | sqlite:///./
|
|
1684
|
+
| `DB_URL` | 数据库连接 URL | 未设置时使用 `sqlite:///./runtime/springbootai.db` |
|
|
1719
1685
|
| `REDIS_HOST` / `REDIS_PORT` / `REDIS_PASSWORD` | Redis 连接 | localhost/6379/空 |
|
|
1720
1686
|
| `NACOS_SERVER` | Nacos 地址 | localhost:8848 |
|
|
1687
|
+
| `NACOS_TIMEOUT` / `DISCOVERY_TIMEOUT` | Nacos 服务发现单次 HTTP 超时(秒) | 3(最大60) |
|
|
1688
|
+
| `RABBITMQ_CONNECTION_TIMEOUT` | RabbitMQ 建连默认超时(秒) | 5 |
|
|
1689
|
+
| `RABBITMQ_SOCKET_TIMEOUT` / `RABBITMQ_STACK_TIMEOUT` | RabbitMQ TCP/AMQP 握手超时(秒) | 5/5 |
|
|
1690
|
+
| `RABBITMQ_CONNECTION_ATTEMPTS` | RabbitMQ 建连尝试次数 | 1 |
|
|
1721
1691
|
| `SPRING_DISABLE_DOCKER_IP_DETECT` | 禁用容器 IP 检测 | 0 |
|
|
1722
1692
|
|
|
1723
1693
|
### 14.5 验证部署 & 故障排查
|
|
@@ -25,7 +25,7 @@ SpringBootAI 已提供配套的在线考试认证平台,学习者、团队成
|
|
|
25
25
|
|
|
26
26
|
建议的认证准备流程:
|
|
27
27
|
|
|
28
|
-
1. 先按 README 中的“
|
|
28
|
+
1. 先按 README 中的“1 分钟跑通第一个接口”完成本地环境搭建,确认能够创建应用、启动服务并访问 Swagger。
|
|
29
29
|
2. 阅读 [新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md),理解 `@SpringBootApplication`、`@RestController`、`@Service`、`@Autowired`、配置文件和依赖注入的基本用法。
|
|
30
30
|
3. 根据实际使用方向阅读模块文档,例如 Web MVC、ORM、事务、缓存、安全、配置绑定、测试切片、AI、LangChain、LangGraph、MCP 和 Cloud 微服务等。
|
|
31
31
|
4. 运行示例或编写一个小型业务接口,至少覆盖 Controller、Service、配置读取、异常处理、Swagger 文档和数据访问中的若干能力。
|
|
@@ -54,90 +54,40 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
54
54
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
55
55
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
56
56
|
|
|
57
|
-
当前版本是 `2.3.
|
|
57
|
+
当前版本是 `2.3.8`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 模式通过 ORM 拦截器自动生成 undo_log 实现自动回滚。
|
|
58
58
|
|
|
59
59
|
[新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | [全部文档](https://github.com/YUCONGGEN/springbootAI/tree/master/doc) | [变更日志](https://github.com/YUCONGGEN/springbootAI/blob/master/CHANGELOG.md) | [安全报告](https://github.com/YUCONGGEN/springbootAI/blob/master/SECURITY.md) | [发布检查](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/RELEASE_CHECKLIST.md)
|
|
60
60
|
|
|
61
|
-
##
|
|
61
|
+
## 1 分钟跑通第一个接口
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
已安装 Python 3.10、3.11 或 3.12 时,直接执行下面五条命令。示例不需要数据库、Redis、Docker 或大模型 API Key:
|
|
64
64
|
|
|
65
65
|
```powershell
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
python
|
|
71
|
-
python -m pip install springbootAI
|
|
72
|
-
|
|
73
|
-
mkdir demo
|
|
74
|
-
mkdir demo\controller
|
|
75
|
-
New-Item demo\__init__.py -ItemType File
|
|
76
|
-
New-Item demo\controller\__init__.py -ItemType File
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Linux/macOS 激活命令是 `source .venv/bin/activate`,其余 Python 命令相同。
|
|
80
|
-
|
|
81
|
-
创建 `demo/Application.py`:
|
|
82
|
-
|
|
83
|
-
```python
|
|
84
|
-
from springbootai.annotations import SpringBootApplication
|
|
85
|
-
from springbootai.main import run
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
@SpringBootApplication(scan_base_packages=["demo"])
|
|
89
|
-
class Application:
|
|
90
|
-
pass
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if __name__ == "__main__":
|
|
94
|
-
run(Application)
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
创建 `demo/controller/HelloController.py`:
|
|
98
|
-
|
|
99
|
-
```python
|
|
100
|
-
from springbootai.annotations import GetMapping, RequestMapping, RestController
|
|
101
|
-
from springbootai.web.swagger import Operation, Tag
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
@Tag(name="入门接口", description="确认应用已经正常运行")
|
|
105
|
-
@RequestMapping("/api")
|
|
106
|
-
@RestController
|
|
107
|
-
class HelloController:
|
|
108
|
-
@Operation(summary="打招呼")
|
|
109
|
-
@GetMapping("/hello/{name}")
|
|
110
|
-
def hello(self, name: str):
|
|
111
|
-
return {"message": f"Hello, {name}"}
|
|
66
|
+
python -m pip install --upgrade springbootAI
|
|
67
|
+
springbootai init demo --modules web --no-docker --non-interactive
|
|
68
|
+
cd demo
|
|
69
|
+
python -m pip install -r requirements.txt
|
|
70
|
+
python Application.py
|
|
112
71
|
```
|
|
113
72
|
|
|
114
|
-
|
|
73
|
+
`springbootai init demo` 会自动创建 `demo` 项目目录、启动类、配置文件和 Hello 示例接口。`--non-interactive` 表示直接使用默认配置,不进入问答;`--no-docker` 表示本次不生成 Docker 文件。
|
|
115
74
|
|
|
116
|
-
|
|
117
|
-
server:
|
|
118
|
-
host: 127.0.0.1
|
|
119
|
-
port: 8080
|
|
120
|
-
|
|
121
|
-
database:
|
|
122
|
-
enabled: false
|
|
75
|
+
看到下面的输出就说明启动成功:
|
|
123
76
|
|
|
124
|
-
|
|
125
|
-
|
|
77
|
+
```text
|
|
78
|
+
Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
|
|
126
79
|
```
|
|
127
80
|
|
|
128
|
-
|
|
81
|
+
保持服务运行,另开终端验证:
|
|
129
82
|
|
|
130
83
|
```powershell
|
|
131
|
-
|
|
84
|
+
curl http://127.0.0.1:8000/api/hello/Alice
|
|
85
|
+
curl http://127.0.0.1:8000/actuator/health/liveness
|
|
132
86
|
```
|
|
133
87
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
```powershell
|
|
137
|
-
curl http://127.0.0.1:8080/api/hello/Alice
|
|
138
|
-
```
|
|
88
|
+
第一个请求的返回数据中会包含 `"message":"Hello, Alice!"`,健康检查会返回 `"status":"UP"`。浏览器访问 `http://127.0.0.1:8000/docs` 可以直接查看并测试 Swagger 接口。
|
|
139
89
|
|
|
140
|
-
|
|
90
|
+
生成的业务代码位于 `demo/src/demo/`,主配置文件位于 `demo/config/application.yml`。完整参数见 [CLI 模块指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLI_MODULE.md),遇到启动问题时按[新手入门指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md)排查。
|
|
141
91
|
|
|
142
92
|
---
|
|
143
93
|
|
|
@@ -235,10 +185,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
235
185
|
|
|
236
186
|
| 组件 | 当前版本 |
|
|
237
187
|
|------|----------|
|
|
238
|
-
| `springbootai` 框架 API | 2.3.
|
|
239
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
240
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
241
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
188
|
+
| `springbootai` 框架 API | 2.3.8 |
|
|
189
|
+
| `springbootai.orm.pymybatis` | 2.3.8 |
|
|
190
|
+
| `springbootai.ai` AI 模块 | 2.3.8 |
|
|
191
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.8 |
|
|
242
192
|
| Python | 3.10+ |
|
|
243
193
|
|
|
244
194
|
### 1.4 适合什么场景
|
|
@@ -603,14 +553,30 @@ Profile 用于 Bean 过滤和生产安全校验。多环境配置可使用以下
|
|
|
603
553
|
| `/actuator/admin` | **Spring Boot Admin 风格可视化面板**(浏览器打开即用,每 30 秒自动刷新) |
|
|
604
554
|
| `/actuator/prometheus` | **Prometheus 文本格式指标**(供 Prometheus Server 抓取) |
|
|
605
555
|
| `/actuator/sysmetrics` | **进程级系统指标**(RSS/CPU/线程/FD,供 Admin 面板 JS 调用) |
|
|
556
|
+
| `/actuator/config-monitor` | 配置加载与 Nacos 热刷新历史(`management.config-monitor.enabled=true` 后启用,默认关闭) |
|
|
557
|
+
|
|
558
|
+
`database.enabled: false` 时数据库状态为 `DISABLED`,不会创建数据库文件。
|
|
559
|
+
|
|
560
|
+
配置监控默认关闭。需要排查配置来源或热更新时,可在 YAML、环境变量或 Nacos 中设置:
|
|
561
|
+
|
|
562
|
+
```yaml
|
|
563
|
+
management:
|
|
564
|
+
config-monitor:
|
|
565
|
+
enabled: true
|
|
566
|
+
include-values: false # 生产环境建议保持 false
|
|
567
|
+
history-size: 100
|
|
568
|
+
refresh-events: true
|
|
569
|
+
```
|
|
606
570
|
|
|
607
|
-
|
|
571
|
+
开启后访问受 Actuator 鉴权保护的 `/actuator/config-monitor`,或直接查看 Admin
|
|
572
|
+
面板中的“配置刷新监控”卡片。关闭时不保留历史,也不读取配置值。
|
|
608
573
|
|
|
609
574
|
> 详见 [ACTUATOR_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ACTUATOR_MODULE.md) 第四章(Spring Boot Admin 面板)与第五章(Prometheus + Grafana 工业级监控)。
|
|
610
575
|
|
|
611
576
|
> **⚠️ 新手常见错误**:
|
|
612
|
-
> - ❌ 错误:"
|
|
613
|
-
> - ✅
|
|
577
|
+
> - ❌ 错误:"我改了本地 YAML,重新请求接口怎么没生效?"
|
|
578
|
+
> - ✅ 正解:本地 YAML 是启动时读取的,修改后需要重启应用;Nacos 配置只有在启用
|
|
579
|
+
> `NACOS_CONFIG_ENABLED=true` 且 `refresh-enabled=true` 时才会按轮询间隔热刷新。
|
|
614
580
|
|
|
615
581
|
---
|
|
616
582
|
|
|
@@ -1553,9 +1519,13 @@ gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8080 myapp.asgi:app
|
|
|
1553
1519
|
|---------|------|--------|
|
|
1554
1520
|
| `SERVER_PORT` | 服务端口 | 8080 |
|
|
1555
1521
|
| `JWT_SECRET_KEY` | JWT 密钥 | spring-python-secret-key-change-in-production |
|
|
1556
|
-
| `DB_URL` | 数据库连接 URL | sqlite:///./
|
|
1522
|
+
| `DB_URL` | 数据库连接 URL | 未设置时使用 `sqlite:///./runtime/springbootai.db` |
|
|
1557
1523
|
| `REDIS_HOST` / `REDIS_PORT` / `REDIS_PASSWORD` | Redis 连接 | localhost/6379/空 |
|
|
1558
1524
|
| `NACOS_SERVER` | Nacos 地址 | localhost:8848 |
|
|
1525
|
+
| `NACOS_TIMEOUT` / `DISCOVERY_TIMEOUT` | Nacos 服务发现单次 HTTP 超时(秒) | 3(最大60) |
|
|
1526
|
+
| `RABBITMQ_CONNECTION_TIMEOUT` | RabbitMQ 建连默认超时(秒) | 5 |
|
|
1527
|
+
| `RABBITMQ_SOCKET_TIMEOUT` / `RABBITMQ_STACK_TIMEOUT` | RabbitMQ TCP/AMQP 握手超时(秒) | 5/5 |
|
|
1528
|
+
| `RABBITMQ_CONNECTION_ATTEMPTS` | RabbitMQ 建连尝试次数 | 1 |
|
|
1559
1529
|
| `SPRING_DISABLE_DOCKER_IP_DETECT` | 禁用容器 IP 检测 | 0 |
|
|
1560
1530
|
|
|
1561
1531
|
### 14.5 验证部署 & 故障排查
|
|
@@ -12,7 +12,7 @@ build-backend = "setuptools.build_meta"
|
|
|
12
12
|
[project]
|
|
13
13
|
# Distribution name: springbootAI (pip install springbootAI); import package: springbootai.
|
|
14
14
|
name = "springbootAI"
|
|
15
|
-
version = "2.3.
|
|
15
|
+
version = "2.3.8"
|
|
16
16
|
description = "Spring-style Python framework with Web, ORM, Cloud and AI integrations"
|
|
17
17
|
readme = "README.md"
|
|
18
18
|
license = "MIT"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: springbootAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.8
|
|
4
4
|
Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
|
|
5
5
|
Author-email: YuConggen <1516933915@qq.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -187,7 +187,7 @@ SpringBootAI 已提供配套的在线考试认证平台,学习者、团队成
|
|
|
187
187
|
|
|
188
188
|
建议的认证准备流程:
|
|
189
189
|
|
|
190
|
-
1. 先按 README 中的“
|
|
190
|
+
1. 先按 README 中的“1 分钟跑通第一个接口”完成本地环境搭建,确认能够创建应用、启动服务并访问 Swagger。
|
|
191
191
|
2. 阅读 [新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md),理解 `@SpringBootApplication`、`@RestController`、`@Service`、`@Autowired`、配置文件和依赖注入的基本用法。
|
|
192
192
|
3. 根据实际使用方向阅读模块文档,例如 Web MVC、ORM、事务、缓存、安全、配置绑定、测试切片、AI、LangChain、LangGraph、MCP 和 Cloud 微服务等。
|
|
193
193
|
4. 运行示例或编写一个小型业务接口,至少覆盖 Controller、Service、配置读取、异常处理、Swagger 文档和数据访问中的若干能力。
|
|
@@ -216,90 +216,40 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
216
216
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
217
217
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
218
218
|
|
|
219
|
-
当前版本是 `2.3.
|
|
219
|
+
当前版本是 `2.3.8`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 模式通过 ORM 拦截器自动生成 undo_log 实现自动回滚。
|
|
220
220
|
|
|
221
221
|
[新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | [全部文档](https://github.com/YUCONGGEN/springbootAI/tree/master/doc) | [变更日志](https://github.com/YUCONGGEN/springbootAI/blob/master/CHANGELOG.md) | [安全报告](https://github.com/YUCONGGEN/springbootAI/blob/master/SECURITY.md) | [发布检查](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/RELEASE_CHECKLIST.md)
|
|
222
222
|
|
|
223
|
-
##
|
|
223
|
+
## 1 分钟跑通第一个接口
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
已安装 Python 3.10、3.11 或 3.12 时,直接执行下面五条命令。示例不需要数据库、Redis、Docker 或大模型 API Key:
|
|
226
226
|
|
|
227
227
|
```powershell
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
python
|
|
233
|
-
python -m pip install springbootAI
|
|
234
|
-
|
|
235
|
-
mkdir demo
|
|
236
|
-
mkdir demo\controller
|
|
237
|
-
New-Item demo\__init__.py -ItemType File
|
|
238
|
-
New-Item demo\controller\__init__.py -ItemType File
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
Linux/macOS 激活命令是 `source .venv/bin/activate`,其余 Python 命令相同。
|
|
242
|
-
|
|
243
|
-
创建 `demo/Application.py`:
|
|
244
|
-
|
|
245
|
-
```python
|
|
246
|
-
from springbootai.annotations import SpringBootApplication
|
|
247
|
-
from springbootai.main import run
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
@SpringBootApplication(scan_base_packages=["demo"])
|
|
251
|
-
class Application:
|
|
252
|
-
pass
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
if __name__ == "__main__":
|
|
256
|
-
run(Application)
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
创建 `demo/controller/HelloController.py`:
|
|
260
|
-
|
|
261
|
-
```python
|
|
262
|
-
from springbootai.annotations import GetMapping, RequestMapping, RestController
|
|
263
|
-
from springbootai.web.swagger import Operation, Tag
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
@Tag(name="入门接口", description="确认应用已经正常运行")
|
|
267
|
-
@RequestMapping("/api")
|
|
268
|
-
@RestController
|
|
269
|
-
class HelloController:
|
|
270
|
-
@Operation(summary="打招呼")
|
|
271
|
-
@GetMapping("/hello/{name}")
|
|
272
|
-
def hello(self, name: str):
|
|
273
|
-
return {"message": f"Hello, {name}"}
|
|
228
|
+
python -m pip install --upgrade springbootAI
|
|
229
|
+
springbootai init demo --modules web --no-docker --non-interactive
|
|
230
|
+
cd demo
|
|
231
|
+
python -m pip install -r requirements.txt
|
|
232
|
+
python Application.py
|
|
274
233
|
```
|
|
275
234
|
|
|
276
|
-
|
|
235
|
+
`springbootai init demo` 会自动创建 `demo` 项目目录、启动类、配置文件和 Hello 示例接口。`--non-interactive` 表示直接使用默认配置,不进入问答;`--no-docker` 表示本次不生成 Docker 文件。
|
|
277
236
|
|
|
278
|
-
|
|
279
|
-
server:
|
|
280
|
-
host: 127.0.0.1
|
|
281
|
-
port: 8080
|
|
282
|
-
|
|
283
|
-
database:
|
|
284
|
-
enabled: false
|
|
237
|
+
看到下面的输出就说明启动成功:
|
|
285
238
|
|
|
286
|
-
|
|
287
|
-
|
|
239
|
+
```text
|
|
240
|
+
Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
|
|
288
241
|
```
|
|
289
242
|
|
|
290
|
-
|
|
243
|
+
保持服务运行,另开终端验证:
|
|
291
244
|
|
|
292
245
|
```powershell
|
|
293
|
-
|
|
246
|
+
curl http://127.0.0.1:8000/api/hello/Alice
|
|
247
|
+
curl http://127.0.0.1:8000/actuator/health/liveness
|
|
294
248
|
```
|
|
295
249
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
```powershell
|
|
299
|
-
curl http://127.0.0.1:8080/api/hello/Alice
|
|
300
|
-
```
|
|
250
|
+
第一个请求的返回数据中会包含 `"message":"Hello, Alice!"`,健康检查会返回 `"status":"UP"`。浏览器访问 `http://127.0.0.1:8000/docs` 可以直接查看并测试 Swagger 接口。
|
|
301
251
|
|
|
302
|
-
|
|
252
|
+
生成的业务代码位于 `demo/src/demo/`,主配置文件位于 `demo/config/application.yml`。完整参数见 [CLI 模块指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLI_MODULE.md),遇到启动问题时按[新手入门指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md)排查。
|
|
303
253
|
|
|
304
254
|
---
|
|
305
255
|
|
|
@@ -397,10 +347,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
397
347
|
|
|
398
348
|
| 组件 | 当前版本 |
|
|
399
349
|
|------|----------|
|
|
400
|
-
| `springbootai` 框架 API | 2.3.
|
|
401
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
402
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
403
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
350
|
+
| `springbootai` 框架 API | 2.3.8 |
|
|
351
|
+
| `springbootai.orm.pymybatis` | 2.3.8 |
|
|
352
|
+
| `springbootai.ai` AI 模块 | 2.3.8 |
|
|
353
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.8 |
|
|
404
354
|
| Python | 3.10+ |
|
|
405
355
|
|
|
406
356
|
### 1.4 适合什么场景
|
|
@@ -765,14 +715,30 @@ Profile 用于 Bean 过滤和生产安全校验。多环境配置可使用以下
|
|
|
765
715
|
| `/actuator/admin` | **Spring Boot Admin 风格可视化面板**(浏览器打开即用,每 30 秒自动刷新) |
|
|
766
716
|
| `/actuator/prometheus` | **Prometheus 文本格式指标**(供 Prometheus Server 抓取) |
|
|
767
717
|
| `/actuator/sysmetrics` | **进程级系统指标**(RSS/CPU/线程/FD,供 Admin 面板 JS 调用) |
|
|
718
|
+
| `/actuator/config-monitor` | 配置加载与 Nacos 热刷新历史(`management.config-monitor.enabled=true` 后启用,默认关闭) |
|
|
719
|
+
|
|
720
|
+
`database.enabled: false` 时数据库状态为 `DISABLED`,不会创建数据库文件。
|
|
721
|
+
|
|
722
|
+
配置监控默认关闭。需要排查配置来源或热更新时,可在 YAML、环境变量或 Nacos 中设置:
|
|
723
|
+
|
|
724
|
+
```yaml
|
|
725
|
+
management:
|
|
726
|
+
config-monitor:
|
|
727
|
+
enabled: true
|
|
728
|
+
include-values: false # 生产环境建议保持 false
|
|
729
|
+
history-size: 100
|
|
730
|
+
refresh-events: true
|
|
731
|
+
```
|
|
768
732
|
|
|
769
|
-
|
|
733
|
+
开启后访问受 Actuator 鉴权保护的 `/actuator/config-monitor`,或直接查看 Admin
|
|
734
|
+
面板中的“配置刷新监控”卡片。关闭时不保留历史,也不读取配置值。
|
|
770
735
|
|
|
771
736
|
> 详见 [ACTUATOR_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ACTUATOR_MODULE.md) 第四章(Spring Boot Admin 面板)与第五章(Prometheus + Grafana 工业级监控)。
|
|
772
737
|
|
|
773
738
|
> **⚠️ 新手常见错误**:
|
|
774
|
-
> - ❌ 错误:"
|
|
775
|
-
> - ✅
|
|
739
|
+
> - ❌ 错误:"我改了本地 YAML,重新请求接口怎么没生效?"
|
|
740
|
+
> - ✅ 正解:本地 YAML 是启动时读取的,修改后需要重启应用;Nacos 配置只有在启用
|
|
741
|
+
> `NACOS_CONFIG_ENABLED=true` 且 `refresh-enabled=true` 时才会按轮询间隔热刷新。
|
|
776
742
|
|
|
777
743
|
---
|
|
778
744
|
|
|
@@ -1715,9 +1681,13 @@ gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8080 myapp.asgi:app
|
|
|
1715
1681
|
|---------|------|--------|
|
|
1716
1682
|
| `SERVER_PORT` | 服务端口 | 8080 |
|
|
1717
1683
|
| `JWT_SECRET_KEY` | JWT 密钥 | spring-python-secret-key-change-in-production |
|
|
1718
|
-
| `DB_URL` | 数据库连接 URL | sqlite:///./
|
|
1684
|
+
| `DB_URL` | 数据库连接 URL | 未设置时使用 `sqlite:///./runtime/springbootai.db` |
|
|
1719
1685
|
| `REDIS_HOST` / `REDIS_PORT` / `REDIS_PASSWORD` | Redis 连接 | localhost/6379/空 |
|
|
1720
1686
|
| `NACOS_SERVER` | Nacos 地址 | localhost:8848 |
|
|
1687
|
+
| `NACOS_TIMEOUT` / `DISCOVERY_TIMEOUT` | Nacos 服务发现单次 HTTP 超时(秒) | 3(最大60) |
|
|
1688
|
+
| `RABBITMQ_CONNECTION_TIMEOUT` | RabbitMQ 建连默认超时(秒) | 5 |
|
|
1689
|
+
| `RABBITMQ_SOCKET_TIMEOUT` / `RABBITMQ_STACK_TIMEOUT` | RabbitMQ TCP/AMQP 握手超时(秒) | 5/5 |
|
|
1690
|
+
| `RABBITMQ_CONNECTION_ATTEMPTS` | RabbitMQ 建连尝试次数 | 1 |
|
|
1721
1691
|
| `SPRING_DISABLE_DOCKER_IP_DETECT` | 禁用容器 IP 检测 | 0 |
|
|
1722
1692
|
|
|
1723
1693
|
### 14.5 验证部署 & 故障排查
|
|
@@ -71,6 +71,7 @@ springbootai/cloud/transaction_store.py
|
|
|
71
71
|
springbootai/config/__init__.py
|
|
72
72
|
springbootai/config/binding.py
|
|
73
73
|
springbootai/config/config_loader.py
|
|
74
|
+
springbootai/config/config_monitor.py
|
|
74
75
|
springbootai/config/spring-configuration-metadata.json
|
|
75
76
|
springbootai/context/__init__.py
|
|
76
77
|
springbootai/context/application_context.py
|
|
@@ -282,7 +283,9 @@ tests/test_compositional_annotations.py
|
|
|
282
283
|
tests/test_conditional_annotations.py
|
|
283
284
|
tests/test_config_binding.py
|
|
284
285
|
tests/test_config_center.py
|
|
286
|
+
tests/test_config_center_hardening.py
|
|
285
287
|
tests/test_config_fixes_185.py
|
|
288
|
+
tests/test_config_monitor.py
|
|
286
289
|
tests/test_connection_resilience.py
|
|
287
290
|
tests/test_core.py
|
|
288
291
|
tests/test_core_annotations_full.py
|
|
@@ -315,6 +318,7 @@ tests/test_nacos_config.py
|
|
|
315
318
|
tests/test_new_annotations.py
|
|
316
319
|
tests/test_new_features.py
|
|
317
320
|
tests/test_oauth2.py
|
|
321
|
+
tests/test_optional_component_timeouts.py
|
|
318
322
|
tests/test_orm_pymybatis_full.py
|
|
319
323
|
tests/test_production_readiness.py
|
|
320
324
|
tests/test_pymybatis_configuration_hardening.py
|
|
@@ -54,7 +54,7 @@ from springbootai.ai.observability import AIMetrics, ai_metrics
|
|
|
54
54
|
from springbootai.ai.autoconfig import AIProperties, bind_ai_config, configure_ai
|
|
55
55
|
from springbootai.ai.annotation_runtime import ContentModerationError
|
|
56
56
|
|
|
57
|
-
__version__ = "2.3.
|
|
57
|
+
__version__ = "2.3.8"
|
|
58
58
|
|
|
59
59
|
__all__ = [
|
|
60
60
|
# core
|