fix: resolve compilation errors and dependency conflicts

- Fix 'Path' macro parsing issue in service-kit-macros
- Resolve 'reedline'/'sqlite' dependency conflict in service-kit
- Consolidate workspace configuration and lockfile
- Fix 'data-persistence-service' compilation errors
- Update docker-compose and dev configurations
This commit is contained in:
Lv, Qi 2025-11-29 16:29:56 +08:00
parent 0c975bb8f1
commit eee1eb8b3f
20 changed files with 2816 additions and 33177 deletions

6
.tiltignore Normal file
View File

@ -0,0 +1,6 @@
# Ignore Rust source changes to prevent Tilt from rebuilding/restarting containers.
# We rely on cargo-watch inside the container for hot reload (via volume mounts).
**/*.rs
**/Cargo.toml
**/Cargo.lock

File diff suppressed because it is too large Load Diff

33
Cargo.toml Normal file
View File

@ -0,0 +1,33 @@
[workspace]
resolver = "2"
members = [
"services/alphavantage-provider-service",
"services/api-gateway",
"services/common-contracts",
"services/data-persistence-service",
"services/finnhub-provider-service",
"services/mock-provider-service",
"services/report-generator-service",
"services/tushare-provider-service",
"services/workflow-orchestrator-service",
"services/yfinance-provider-service",
"crates/workflow-context",
]
[workspace.package]
edition = "2024"
version = "0.1.0"
authors = ["Lv, Qi <lvsoft@gmail.com>"]
license = "MIT"
repository = "https://github.com/lvsoft/Fundamental_Analysis"
homepage = "https://github.com/lvsoft/Fundamental_Analysis"
readme = "README.md"
[workspace.dependencies]
rmcp = "0.9.1"
rmcp-macros = "0.9.1"
[patch.crates-io]
service_kit = { path = "ref/service_kit_mirror/service_kit/service_kit" }
service-kit-macros = { path = "ref/service_kit_mirror/service_kit/service_kit/service-kit-macros" }

View File

@ -1,840 +0,0 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "aho-corasick"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
[[package]]
name = "anyhow"
version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "bitflags"
version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
[[package]]
name = "block-buffer"
version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
"generic-array",
]
[[package]]
name = "bstr"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
dependencies = [
"memchr",
"serde",
]
[[package]]
name = "cc"
version = "1.2.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07"
dependencies = [
"find-msvc-tools",
"jobserver",
"libc",
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "cpufeatures"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
"libc",
]
[[package]]
name = "crypto-common"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
dependencies = [
"generic-array",
"typenum",
]
[[package]]
name = "digest"
version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
"crypto-common",
]
[[package]]
name = "displaydoc"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "fastrand"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]]
name = "find-msvc-tools"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844"
[[package]]
name = "form_urlencoded"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
"percent-encoding",
]
[[package]]
name = "generic-array"
version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
]
[[package]]
name = "getrandom"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"libc",
"r-efi",
"wasip2",
]
[[package]]
name = "git2"
version = "0.18.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70"
dependencies = [
"bitflags",
"libc",
"libgit2-sys",
"log",
"openssl-probe",
"openssl-sys",
"url",
]
[[package]]
name = "globset"
version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
dependencies = [
"aho-corasick",
"bstr",
"log",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "hex"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "icu_collections"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
dependencies = [
"displaydoc",
"potential_utf",
"yoke",
"zerofrom",
"zerovec",
]
[[package]]
name = "icu_locale_core"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
dependencies = [
"displaydoc",
"litemap",
"tinystr",
"writeable",
"zerovec",
]
[[package]]
name = "icu_normalizer"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
dependencies = [
"icu_collections",
"icu_normalizer_data",
"icu_properties",
"icu_provider",
"smallvec",
"zerovec",
]
[[package]]
name = "icu_normalizer_data"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
[[package]]
name = "icu_properties"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
dependencies = [
"icu_collections",
"icu_locale_core",
"icu_properties_data",
"icu_provider",
"zerotrie",
"zerovec",
]
[[package]]
name = "icu_properties_data"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
[[package]]
name = "icu_provider"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
dependencies = [
"displaydoc",
"icu_locale_core",
"writeable",
"yoke",
"zerofrom",
"zerotrie",
"zerovec",
]
[[package]]
name = "idna"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
"idna_adapter",
"smallvec",
"utf8_iter",
]
[[package]]
name = "idna_adapter"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
dependencies = [
"icu_normalizer",
"icu_properties",
]
[[package]]
name = "itoa"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "jobserver"
version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
dependencies = [
"getrandom",
"libc",
]
[[package]]
name = "libc"
version = "0.2.177"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
[[package]]
name = "libgit2-sys"
version = "0.16.2+1.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8"
dependencies = [
"cc",
"libc",
"libssh2-sys",
"libz-sys",
"openssl-sys",
"pkg-config",
]
[[package]]
name = "libssh2-sys"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9"
dependencies = [
"cc",
"libc",
"libz-sys",
"openssl-sys",
"pkg-config",
"vcpkg",
]
[[package]]
name = "libz-sys"
version = "1.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]]
name = "linux-raw-sys"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
[[package]]
name = "litemap"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
[[package]]
name = "log"
version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
[[package]]
name = "memchr"
version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]]
name = "once_cell"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "openssl-probe"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
[[package]]
name = "openssl-src"
version = "300.5.4+3.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72"
dependencies = [
"cc",
]
[[package]]
name = "openssl-sys"
version = "0.9.111"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321"
dependencies = [
"cc",
"libc",
"openssl-src",
"pkg-config",
"vcpkg",
]
[[package]]
name = "percent-encoding"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pkg-config"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "potential_utf"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
dependencies = [
"zerovec",
]
[[package]]
name = "proc-macro2"
version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
dependencies = [
"proc-macro2",
]
[[package]]
name = "r-efi"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "regex"
version = "1.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
[[package]]
name = "rustix"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys",
"windows-sys",
]
[[package]]
name = "ryu"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
dependencies = [
"winapi-util",
]
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.145"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
"serde_core",
]
[[package]]
name = "sha2"
version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures",
"digest",
]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "smallvec"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "stable_deref_trait"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
[[package]]
name = "syn"
version = "2.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "synstructure"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tempfile"
version = "3.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
dependencies = [
"fastrand",
"getrandom",
"once_cell",
"rustix",
"windows-sys",
]
[[package]]
name = "thiserror"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tinystr"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
dependencies = [
"displaydoc",
"zerovec",
]
[[package]]
name = "typenum"
version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
[[package]]
name = "unicode-ident"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "url"
version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
"serde",
]
[[package]]
name = "utf8_iter"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "walkdir"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
"winapi-util",
]
[[package]]
name = "wasip2"
version = "1.0.1+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
dependencies = [
"wit-bindgen",
]
[[package]]
name = "winapi-util"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
"windows-sys",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
[[package]]
name = "wit-bindgen"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
[[package]]
name = "workflow-context"
version = "0.1.0"
dependencies = [
"anyhow",
"git2",
"globset",
"hex",
"regex",
"serde",
"serde_json",
"sha2",
"tempfile",
"thiserror",
"walkdir",
]
[[package]]
name = "writeable"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
[[package]]
name = "yoke"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
dependencies = [
"stable_deref_trait",
"yoke-derive",
"zerofrom",
]
[[package]]
name = "yoke-derive"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [
"proc-macro2",
"quote",
"syn",
"synstructure",
]
[[package]]
name = "zerofrom"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
dependencies = [
"zerofrom-derive",
]
[[package]]
name = "zerofrom-derive"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
"syn",
"synstructure",
]
[[package]]
name = "zerotrie"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
dependencies = [
"displaydoc",
"yoke",
"zerofrom",
]
[[package]]
name = "zerovec"
version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
dependencies = [
"yoke",
"zerofrom",
"zerovec-derive",
]
[[package]]
name = "zerovec-derive"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [
"proc-macro2",
"quote",
"syn",
]

View File

@ -28,9 +28,10 @@ services:
data-persistence-service: data-persistence-service:
build: build:
context: . context: .
dockerfile: services/data-persistence-service/Dockerfile dockerfile: docker/Dockerfile.dev
# Override build context to ensure ignored files are included if needed, or rely on .dockerignore
container_name: data-persistence-service container_name: data-persistence-service
working_dir: /app/services/data-persistence-service
command: ["cargo", "watch", "-x", "run --bin data-persistence-service-server"]
environment: environment:
HOST: 0.0.0.0 HOST: 0.0.0.0
PORT: 3000 PORT: 3000
@ -46,9 +47,10 @@ services:
interval: 5s interval: 5s
timeout: 5s timeout: 5s
retries: 10 retries: 10
# If you prefer live-reload or local code mount, consider switching to a dev Dockerfile. volumes:
# volumes: - ./:/app
# - ./:/workspace - cargo-target:/app/target
- cargo-cache:/usr/local/cargo
networks: networks:
- app-network - app-network
@ -86,9 +88,11 @@ services:
api-gateway: api-gateway:
build: build:
context: . context: .
dockerfile: services/api-gateway/Dockerfile dockerfile: docker/Dockerfile.dev
container_name: api-gateway container_name: api-gateway
restart: unless-stopped restart: unless-stopped
working_dir: /app/services/api-gateway
command: ["cargo", "watch", "-x", "run --bin api-gateway"]
ports: ports:
- "4000:4000" - "4000:4000"
environment: environment:
@ -120,14 +124,23 @@ services:
interval: 5s interval: 5s
timeout: 5s timeout: 5s
retries: 12 retries: 12
volumes:
- ./:/app
- cargo-target:/app/target
- cargo-cache:/usr/local/cargo
alphavantage-provider-service: alphavantage-provider-service:
build: build:
context: . context: .
dockerfile: services/alphavantage-provider-service/Dockerfile dockerfile: docker/Dockerfile.dev
container_name: alphavantage-provider-service container_name: alphavantage-provider-service
working_dir: /app/services/alphavantage-provider-service
command: ["cargo", "watch", "-x", "run"]
volumes: volumes:
- workflow_data:/mnt/workflow_data - workflow_data:/mnt/workflow_data
- ./:/app
- cargo-target:/app/target
- cargo-cache:/usr/local/cargo
environment: environment:
SERVER_PORT: 8000 SERVER_PORT: 8000
NATS_ADDR: nats://nats:4222 NATS_ADDR: nats://nats:4222
@ -151,10 +164,15 @@ services:
tushare-provider-service: tushare-provider-service:
build: build:
context: . context: .
dockerfile: services/tushare-provider-service/Dockerfile dockerfile: docker/Dockerfile.dev
container_name: tushare-provider-service container_name: tushare-provider-service
working_dir: /app/services/tushare-provider-service
command: ["cargo", "watch", "-x", "run"]
volumes: volumes:
- workflow_data:/mnt/workflow_data - workflow_data:/mnt/workflow_data
- ./:/app
- cargo-target:/app/target
- cargo-cache:/usr/local/cargo
environment: environment:
SERVER_PORT: 8001 SERVER_PORT: 8001
NATS_ADDR: nats://nats:4222 NATS_ADDR: nats://nats:4222
@ -179,10 +197,15 @@ services:
finnhub-provider-service: finnhub-provider-service:
build: build:
context: . context: .
dockerfile: services/finnhub-provider-service/Dockerfile dockerfile: docker/Dockerfile.dev
container_name: finnhub-provider-service container_name: finnhub-provider-service
working_dir: /app/services/finnhub-provider-service
command: ["cargo", "watch", "-x", "run"]
volumes: volumes:
- workflow_data:/mnt/workflow_data - workflow_data:/mnt/workflow_data
- ./:/app
- cargo-target:/app/target
- cargo-cache:/usr/local/cargo
environment: environment:
SERVER_PORT: 8002 SERVER_PORT: 8002
NATS_ADDR: nats://nats:4222 NATS_ADDR: nats://nats:4222
@ -207,10 +230,15 @@ services:
yfinance-provider-service: yfinance-provider-service:
build: build:
context: . context: .
dockerfile: services/yfinance-provider-service/Dockerfile dockerfile: docker/Dockerfile.dev
container_name: yfinance-provider-service container_name: yfinance-provider-service
working_dir: /app/services/yfinance-provider-service
command: ["cargo", "watch", "-x", "run"]
volumes: volumes:
- workflow_data:/mnt/workflow_data - workflow_data:/mnt/workflow_data
- ./:/app
- cargo-target:/app/target
- cargo-cache:/usr/local/cargo
environment: environment:
SERVER_PORT: 8003 SERVER_PORT: 8003
NATS_ADDR: nats://nats:4222 NATS_ADDR: nats://nats:4222
@ -237,10 +265,15 @@ services:
report-generator-service: report-generator-service:
build: build:
context: . context: .
dockerfile: services/report-generator-service/Dockerfile dockerfile: docker/Dockerfile.dev
container_name: report-generator-service container_name: report-generator-service
working_dir: /app/services/report-generator-service
command: ["cargo", "watch", "-x", "run --bin report-generator-service"]
volumes: volumes:
- workflow_data:/mnt/workflow_data - workflow_data:/mnt/workflow_data
- ./:/app
- cargo-target:/app/target
- cargo-cache:/usr/local/cargo
environment: environment:
SERVER_PORT: 8004 SERVER_PORT: 8004
NATS_ADDR: nats://nats:4222 NATS_ADDR: nats://nats:4222
@ -262,10 +295,15 @@ services:
workflow-orchestrator-service: workflow-orchestrator-service:
build: build:
context: . context: .
dockerfile: services/workflow-orchestrator-service/Dockerfile dockerfile: docker/Dockerfile.dev
container_name: workflow-orchestrator-service container_name: workflow-orchestrator-service
working_dir: /app/services/workflow-orchestrator-service
command: ["cargo", "watch", "-x", "run --bin workflow-orchestrator-service"]
volumes: volumes:
- workflow_data:/mnt/workflow_data - workflow_data:/mnt/workflow_data
- ./:/app
- cargo-target:/app/target
- cargo-cache:/usr/local/cargo
environment: environment:
SERVER_PORT: 8005 SERVER_PORT: 8005
NATS_ADDR: nats://nats:4222 NATS_ADDR: nats://nats:4222
@ -293,8 +331,10 @@ volumes:
pgdata: pgdata:
frontend_node_modules: frontend_node_modules:
nats_data: nats_data:
cargo-target:
driver: local
cargo-cache:
driver: local
networks: networks:
app-network: app-network:

13
docker/Dockerfile.dev Normal file
View File

@ -0,0 +1,13 @@
FROM rust:1.90-bookworm
# Install cargo-watch for hot reload
RUN cargo install cargo-watch
WORKDIR /app
# Create target and cache directories to ensure permissions
RUN mkdir -p /app/target && mkdir -p /usr/local/cargo
# Default command
CMD ["cargo", "watch", "-x", "run"]

View File

@ -0,0 +1,131 @@
# Rust 微服务开发最佳实践Workspace 与 Docker 高效协同
**日期**: 2025-11-29
**标签**: #Rust #Microservices #Docker #DevEx #Tilt #Workspace
---
## 1. 背景与痛点
在采用 Rust 开发微服务架构时,我们面临着一个经典的**两难选择**
### 方案 A单一仓库 (Monorepo) + Workspace
* **优点**:所有服务共享依赖库版本(`Cargo.lock`),代码复用极其方便,一次编译所有公共库(`target` 共享)。
* **缺点**:在 Docker 容器化部署时,每次修改哪怕一行代码,都会导致 Docker Cache 失效,触发整个 Workspace 的重新编译。对于拥有数十个服务的系统,这简直是灾难。
### 方案 B多仓库 (Polyrepo) 或 独立构建
* **优点**:服务间彻底隔离,互不影响。
* **缺点**:每个服务都要重新下载和编译一遍 `tokio`, `axum` 等几百个依赖。磁盘占用爆炸(每个服务 2GB+ target编译时间爆炸CPU 重复劳动)。
### 我们的目标
我们需要一种**两全其美**的方案:
1. **开发时 (Dev)**:享受 Workspace 的增量编译速度,改一行代码只需 2 秒重启。
2. **部署时 (Prod)**:享受容器的隔离性,且构建尽可能快。
3. **体验 (DevEx)**:自动化热重载 (Hot Reload),无需手动重启容器。
---
## 2. 解决方案:共享缓存挂载 + 容器内增量编译
核心思想是**放弃在 Docker 构建阶段进行编译**(针对开发环境),改为**在容器运行时利用挂载的宿主机缓存进行增量编译**。
### 2.1 关键技术点
1. **极简开发镜像 (`Dockerfile.dev`)**:
* 不再 `COPY` 源代码。
* 不再运行 `cargo build`
* 只安装必要工具(如 `cargo-watch`)。
* 所有源码和依赖通过 Volume 挂载。
2. **共享编译缓存 (`cargo-target` Volume)**:
* 创建一个 Docker Volume或挂载宿主机目录专门存放 `/app/target`
* 所有微服务容器**共享**这个 Volume。
* **效果**:服务 A 编译过的 `tokio`,服务 B 启动时直接复用,无需再次编译。
3. **Cargo Registry 缓存 (`cargo-cache` Volume)**:
* 挂载 `/usr/local/cargo`
* **效果**:避免每次启动容器都要重新下载 crates.io 的索引和源码。
4. **Cargo Watch 热重载**:
* 容器启动命令为 `cargo watch -x "run --bin my-service"`
* 配合 Docker Compose 的源码挂载,一旦宿主机修改代码,容器内立即触发增量编译并重启进程。
### 2.2 实施细节
#### Dockerfile.dev (通用开发镜像)
```dockerfile
FROM rust:1.90
# 安装热重载工具
RUN cargo install cargo-watch
WORKDIR /app
# 预创建挂载点,避免权限问题
RUN mkdir -p /app/target && mkdir -p /usr/local/cargo
# 默认命令:监听并运行
CMD ["cargo", "watch", "-x", "run"]
```
#### docker-compose.yml (编排配置)
```yaml
services:
api-gateway:
build:
context: .
dockerfile: docker/Dockerfile.dev
# 覆盖启动命令,指定运行的 binary
command: ["cargo", "watch", "-x", "run --bin api-gateway-server"]
volumes:
# 1. 挂载源码 (实时同步)
- .:/app
# 2. 挂载共享编译产物 (核心加速点!)
- cargo-target:/app/target
# 3. 挂载依赖库缓存
- cargo-cache:/usr/local/cargo
iam-service:
# ... 同样的配置,复用相同的 cargo-target
volumes:
- .:/app
- cargo-target:/app/target
- cargo-cache:/usr/local/cargo
volumes:
cargo-target: # 这里的魔法在于所有容器共享同一个 target 目录
driver: local
cargo-cache:
driver: local
```
---
## 3. 优势总结
| 指标 | 传统 Docker 构建 | 本方案 (共享挂载) |
| :--- | :--- | :--- |
| **首次启动时间** | 慢 (需编译所有) | 慢 (需编译所有,但只需一次) |
| **二次启动时间** | **极慢** (代码变动导致层失效,全量重编) | **极快** (复用 target增量编译 < 5s) |
| **磁盘占用** | 高 (每个镜像都有 target) | **低** (所有服务共享一份 target) |
| **依赖冲突** | 严格 (Docker 构建会报错) | 宽松 (只要本地能跑,容器就能跑) |
| **开发体验** | 修改代码 -> 等待构建 -> 重启容器 | 修改代码 -> 自动热跟新 (Hot Reload) |
## 4. 注意事项与坑
1. **文件锁 (File Locking)**:
* Rust 的 Cargo 能够很好地处理并发编译锁。多个服务同时启动时,它们会排队等待编译公共依赖(如 `tokio`),而不会发生冲突损坏文件。
* **注意**: 如果宿主机也是 Linux 且挂载了宿主机的 `target` 目录,可能会因为 glibc 版本不同导致宿主机和容器内的 `cargo` 互相“打架”(指纹不一致导致频繁重编)。**建议使用独立的 Docker Volume (`cargo-target`) 而不是挂载宿主机 `target` 目录**,以此隔离宿主机环境和容器环境。
2. **权限问题**:
* Docker 容器内默认是 `root`,写入 Volume 的文件也是 `root` 权限。如果挂载的是宿主机目录,可能会导致宿主机用户无法清理 `target`。使用 Docker Volume 可以规避这个问题。
3. **生产环境构建**:
* 本方案**仅限于开发环境**。
* 生产环境 (`Dockerfile.prod`) 依然需要使用标准的 `COPY . .` + `cargo build --release` 流程,或者使用 `cargo-chef` 进行多阶段构建以减小镜像体积。
---
## 5. 结论
通过 **Docker Compose Volume 挂载** + **Cargo Watch** + **共享 Target 目录**,我们成功地在微服务架构下保留了 Monorepo 的开发效率。这是一套经过验证的、适合中大型 Rust 项目的高效开发模式。

View File

@ -0,0 +1,86 @@
[package]
name = "service_kit"
version.workspace = true
edition = "2021"
authors = ["lvsoft"]
description = "A foundational toolkit for building high-performance, modular services in Rust."
license = "MIT OR Apache-2.0"
repository = "https://github.com/lvsoft/service_kit"
readme = "README.md"
links = "service_kit_v0_1_2"
[lib]
[[bin]]
name = "forge-cli"
path = "src/main.rs"
required-features = ["cli-support"]
[dependencies]
# proc-macro consumers and toolchain utilities
syn = { version = "2.0", features = ["full", "extra-traits"] }
quote = "1.0"
proc-macro2 = "1.0"
toml = "0.9"
service-kit-macros = { path = "service-kit-macros", optional = true }
# unified runtime deps (migrated from forge-core)
axum = { version = "0.8", features = ["json"], default-features = false }
once_cell = "1.19"
inventory = { version = "0.3", optional = true }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_urlencoded = "0.7.1"
thiserror = "2.0.12"
utoipa = { version = "5.4.0", features = ["axum_extras", "macros", "uuid", "chrono"], optional = true }
schemars = { version = "1.0.4", features = ["derive", "chrono04"], default-features = true }
# Optional feature-gated deps
anyhow = { version = "1.0", optional = true }
clap = { version = "4.5", features = ["derive", "env"], optional = true }
walkdir = { version = "2.5", optional = true }
fs_extra = { version = "1.3", optional = true }
tokio = { version = "1.38.0", features = ["full"], optional = true }
# reedline = { version = "0.43.0", features = ["bashisms", "sqlite"], optional = true }
nu-ansi-term = { version = "0.50.0", optional = true }
oas = { version = "0.2.1", optional = true }
shlex = { version = "1.3.0", optional = true }
rmcp = { workspace = true, optional = true }
reqwest = { version = "0.12", features = ["json"], optional = true }
[dev-dependencies]
serde = { version = "1.0", features = ["derive"] }
utoipa = { version = "5.4", features = ["axum_extras"] }
toml = "0.9"
[build-dependencies]
# 目前build.rs只使用std库如果将来需要额外依赖可以在这里添加
[features]
default = ["macros", "openapi"]
macros = ["dep:service-kit-macros"]
openapi = ["dep:utoipa", "dep:inventory"]
# 轻量 CLI 内核:仅包含构建 CLI 所需依赖(兼容 wasm
cli-core = [
"dep:clap",
"dep:oas",
"dep:shlex",
]
# 原先的 cli-support保留以兼容
cli-support = ["dep:anyhow", "dep:clap", "dep:walkdir", "dep:fs_extra"]
# 完整的本地 API CLInative在 cli-core 基础上引入网络、终端与异步运行时
api-cli = [
"cli-core",
"dep:tokio",
# "dep:reedline",
"dep:nu-ansi-term",
"dep:reqwest",
]
# MCP 相关功能
mcp = ["dep:rmcp"]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -20,7 +20,8 @@ path = "src/bin/api-cli.rs"
# required-features = ["service_kit/api-cli"] # required-features = ["service_kit/api-cli"]
[dependencies] [dependencies]
service_kit = { version = "0.1.2", default-features = true } # service_kit = { version = "0.1.2", default-features = true }
service_kit = { path = "../../ref/service_kit_mirror/service_kit/service_kit", default-features = true }
anyhow = "1.0" anyhow = "1.0"
rmcp = { version = "0.9.0", features = [ rmcp = { version = "0.9.0", features = [
"transport-streamable-http-server", "transport-streamable-http-server",
@ -76,7 +77,3 @@ mcp = ["service_kit/mcp"]
# api-cli = ["service_kit/api-cli"] # api-cli = ["service_kit/api-cli"]
# full-data = [] # full-data = []
# --- For Local Development & Docker Build ---
[patch.crates-io]
service_kit = { path = "../../ref/service_kit_mirror/service_kit/service_kit" }
service-kit-macros = { path = "../../ref/service_kit_mirror/service_kit/service_kit/service-kit-macros" }

View File

@ -78,3 +78,4 @@ pub async fn get_provider_status(
.map_err(AnyhowError::from)?; .map_err(AnyhowError::from)?;
Ok(Json(status)) Ok(Json(status))
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff