diff --git a/README.md b/README.md index 2564b97..d22d1e7 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,47 @@ ## 使用方式 ```bash -docker-compose up --build +docker compose up --build ``` +## 📦 技术架构 +![架构图](docs/architecture.svg) + +**核心组件**: +- 服务发现:Consul +- API网关:Traefik with Let's Encrypt +- 消息队列:RabbitMQ +- 数据存储:PostgreSQL + Redis + +**通信协议**: +- RESTful API(80% 服务) +- gRPC(quant-service 与 data-service) + +## 🔧 环境变量 +```env +CONSUL_HTTP_ADDR=consul:8500 +ALPHAVANTAGE_API_KEY=your_key +``` + +## 📚 API 文档 +访问统一入口:`http://localhost/docs` + +## 🛠 开发指南 +```bash +# Python 服务 +pip install -r requirements.txt +uvicorn app:app --reload + +# C# 服务 +dotnet run +``` + +## 🤝 贡献规范 +1. 分支命名:feat/xxx, fix/xxx +2. 提交信息遵循 Conventional Commits +3. 提交 PR 前需通过 SonarQube 检测 + +## 📄 许可 +[MIT](LICENSE) + 访问入口:`http://localhost` 或你的服务器域名(如 AriStockAI.com) diff --git a/consul/config/consul.hcl b/consul/config/consul.hcl index d16b9e5..508eec9 100644 --- a/consul/config/consul.hcl +++ b/consul/config/consul.hcl @@ -1,5 +1,8 @@ -datacenter = "dc1" -data_dir = "/consul/data" -server = true -bootstrap_expect = 1 -ui = true \ No newline at end of file +ui_config { + enabled = true +} + +acl { + enabled = true + default_policy = "deny" +} \ No newline at end of file diff --git a/docs/architecture.drawio b/docs/architecture.drawio new file mode 100644 index 0000000..cadf852 --- /dev/null +++ b/docs/architecture.drawio @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/architecture.svg b/docs/architecture.svg new file mode 100644 index 0000000..1632c96 --- /dev/null +++ b/docs/architecture.svg @@ -0,0 +1,4 @@ + + + +
Consul 服务发现
Traefik 网关
微服务集群
基础设施层
微服务集群
📊 数据服务\n(Python)
🧮 量化服务\n(Python)
基础设施层
🖥️ 前端界面\n(Vue.js)
微服务集群
📊 数据服务(Python)
🧮 量化服务(Python)
😀 情绪分析(Python)
⭐ 推荐服务(C#)
👤 用户服务(C#)
\ No newline at end of file diff --git a/services/data-service/Dockerfile b/services/data-service/Dockerfile index da16c83..684ec1c 100644 --- a/services/data-service/Dockerfile +++ b/services/data-service/Dockerfile @@ -4,4 +4,4 @@ WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . -CMD ["python", "app.py"] +CMD ["sh", "-c", "aktools run --port 8001 & python register.py && wait"] diff --git a/services/data-service/app.py b/services/data-service/app.py index 18deafa..00a450b 100644 --- a/services/data-service/app.py +++ b/services/data-service/app.py @@ -1,5 +1,6 @@ from flask import Flask, jsonify import threading +import subprocess from register import register_to_consul app = Flask(__name__) @@ -14,4 +15,5 @@ def hello(): if __name__ == "__main__": threading.Thread(target=register_to_consul).start() + subprocess.Popen(["aktools", "run", "--port", "8001"]) app.run(host="0.0.0.0", port=8000) diff --git a/services/data-service/register.py b/services/data-service/register.py index c0083e3..c926e99 100644 --- a/services/data-service/register.py +++ b/services/data-service/register.py @@ -3,8 +3,8 @@ import requests def register_to_consul(): time.sleep(3) # 等待服务稳定再注册 - service_name = "data-service" # 替换为 quant-service/emotion-service 等 - port = 8000 # 替换为 8001, 8002 等 + service_name = "aktools-service" # AKTools 主服务 + port = 8001 # AKTools 端口 payload = { "Name": service_name, @@ -12,7 +12,7 @@ def register_to_consul(): "Address": service_name, # 容器名作为地址 "Port": port, "Check": { - "HTTP": f"http://{service_name}:{port}/health", + "TCP": f"{service_name}:{port}", "Interval": "10s" } } @@ -22,3 +22,6 @@ def register_to_consul(): print(f"[{service_name}] Registered to Consul") except Exception as e: print(f"❌ Consul register failed: {e}") + +if __name__ == "__main__": + register_to_consul() diff --git a/services/data-service/requirements.txt b/services/data-service/requirements.txt index 8ab6294..aa2ae89 100644 --- a/services/data-service/requirements.txt +++ b/services/data-service/requirements.txt @@ -1 +1,2 @@ -flask \ No newline at end of file +flask +aktools \ No newline at end of file diff --git a/traefik/traefik.yml b/traefik/traefik.yml index a6db39b..ebeb765 100644 --- a/traefik/traefik.yml +++ b/traefik/traefik.yml @@ -1,6 +1,7 @@ -api: - dashboard: true - entryPoints: web: - address: ":80" \ No newline at end of file + address: ":80" +http: + middlewares: + compress: + compress: true \ No newline at end of file