# Ultra Pass Sidecar
> 功能描述: sidecar库文档,包含API说明、安装指南、使用示例、异构服务支持等
> @author: lzg
> @created: 2025-07-01 15:47:21
> @version: 1.0.0
Ultra Pass Python Sidecar 是一个简洁的Python微服务sidecar库,支持自动注册到Nacos和Feign风格调用。
## 功能特性
- ✅ **自动服务注册**:一键注册到Nacos服务发现中心
- ✅ **Feign风格调用**:类似Java Feign的简洁客户端调用
- ✅ **异构服务支持**:支持调用Java、Python等不同语言的服务
- ✅ **配置中心支持**:自动从Nacos配置中心拉取配置
- ✅ **心跳保活**:自动心跳机制,保持服务在线
- ✅ **优雅关闭**:支持信号处理,优雅注销服务
- ✅ **多框架支持**:支持Flask、FastAPI等主流框架
## 快速开始
### 1. 安装依赖
#### 方式一:安装所有依赖(推荐)
```bash
pip install ultra-pass-sidecar==0.0.14
```
#### 方式二:从源码安装
```bash
git clone https://github.com/****/ultra-pass-py-sidecar.git
cd ultra-pass-py-sidecar/ultra_pass_sidecar
pip install -e .
```
### 2. 配置文件
创建 `bootstrap.yml`:
```yaml
server:
port: 9202
application:
name: python-test-server
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 49.233.171.89:8848
ip: 10.12.6.236
config:
server-addr: 49.233.171.89:8848
file-extension: yml
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
```
### 3. 服务端使用
```python
from flask import Flask
from ultra_pass_sidecar import init_sidecar, config_local, config_remote
app = Flask(__name__)
@app.route('/api/hello/<name>')
def hello(name):
return {'message': f'Hello, {name}!'}
if __name__ == '__main__':
# 一行代码启动sidecar
init_sidecar(app)
# 从本地读取端口
port = config_local('server.port', 9202)
# 从配置中心读取其他配置
redis_host = config_remote('spring.data.redis.host', 'localhost')
app.run(host='0.0.0.0', port=port, debug=True)
```
### 4. 客户端使用
```python
import asyncio
from ultra_pass_sidecar import feign, get
@feign("python-test-server")
class HelloService:
@get("/api/hello/{name}")
async def hello(self, name: str):
pass
async def main():
service = HelloService()
result = await service.hello("World")
print(result)
if __name__ == '__main__':
asyncio.run(main())
```
### 5. 多框架支持示例
#### Flask应用
```python
from flask import Flask
from ultra_pass_sidecar import init_sidecar
app = Flask(__name__)
@app.route('/api/users/<user_id>')
def get_user(user_id):
return {'user_id': user_id, 'name': f'User{user_id}'}
if __name__ == '__main__':
init_sidecar(app) # 自动设置权限拦截器
app.run(host='0.0.0.0', port=9202)
```
#### FastAPI应用
```python
from fastapi import FastAPI
from ultra_pass_sidecar import init_sidecar
app = FastAPI()
@app.get("/api/users/{user_id}")
async def get_user(user_id: int):
return {'user_id': user_id, 'name': f'User{user_id}'}
if __name__ == '__main__':
init_sidecar(app) # 自动设置权限拦截器
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=9202)
```
#### Django应用
```python
# settings.py
INSTALLED_APPS = [
# ... 其他应用
'ultra_pass_sidecar',
]
# views.py
from django.http import JsonResponse
from ultra_pass_sidecar import init_sidecar
def get_user(request, user_id):
return JsonResponse({'user_id': user_id, 'name': f'User{user_id}'})
# 在Django启动时初始化
init_sidecar()
```
## 系统架构
### 线程架构图
```mermaid
graph TD
A[程序启动] --> B[主线程启动]
B --> C[Flask应用初始化]
C --> D[加载bootstrap.yml]
D --> E[注册路由]
E --> F[调用init_sidecar]
F --> G[创建子线程]
G --> H[子线程启动事件循环]
H --> I[启动Nacos客户端]
I --> J[注册服务到Nacos]
J --> K[创建心跳任务]
K --> L[启动配置中心]
L --> M[保持事件循环运行]
M --> N[心跳任务每10秒执行]
N --> O[服务保持在线]
style A fill:#e1f5fe
style B fill:#f3e5f5
style G fill:#fff3e0
style K fill:#e8f5e8
style N fill:#ffebee
```
### 并行执行时序图
```mermaid
sequenceDiagram
participant MT as 主线程
participant ST as 子线程
participant N as Nacos
participant H as 心跳任务
MT->>ST: 创建子线程
ST->>N: 注册服务
ST->>H: 创建心跳任务
loop 每10秒
H->>N: 发送心跳
N->>H: 心跳确认
end
MT->>MT: 处理HTTP请求
```
### 系统组件图
```mermaid
graph LR
subgraph "主线程"
A[Flask应用]
B[HTTP请求处理]
end
subgraph "子线程"
C[事件循环]
D[Nacos客户端]
E[配置中心]
F[心跳任务]
end
subgraph "外部服务"
G[Nacos注册中心]
H[配置中心]
end
A --> B
C --> D
C --> E
C --> F
D --> G
E --> H
F --> G
```
## API 参考
### 核心函数
#### `init_sidecar()`
初始化sidecar,自动注册服务到Nacos。
#### `feign(service_name: str)`
定义Feign客户端的装饰器。
#### `get(path: str)` / `post(path: str)`
HTTP请求装饰器。
#### `config_remote(config_key: str, default: Any = None)`
从Nacos配置中心获取配置值。
#### `config_local(config_key: str, default: Any = None)`
从本地bootstrap.yml获取配置值。
### 配置说明
| 配置项 | 说明 | 示例 |
|--------|------|------|
| `server.port` | 服务端口 | `9202` |
| `application.name` | 服务名称 | `python-test-server` |
| `cloud.nacos.discovery.server-addr` | Nacos地址 | `49.233.171.89:8848` |
| `cloud.nacos.discovery.ip` | 服务IP | `10.12.6.236` |
### 权限配置
```yaml
# 权限配置
auth:
enabled: true # 是否开启权限检查
fail_open: false # 容错机制,权限服务失败时的行为
exclude_paths: # 排除权限检查的路径
- /api/hello
- /api/health
- /static
timeout: 5000 # 权限检查超时时间(毫秒)
```
**Token获取方式:**
- **Authorization头**:`Authorization: Bearer <token>`
- **Cookie**:`token=<token>`, `access_token=<token>`
- **URL参数**:`?token=<token>`, `?access_token=<token>`
- **自定义头**:`X-Auth-Token: <token>`, `X-Token: <token>`
## 心跳机制
- **心跳间隔**:10秒
- **超时时间**:90秒(3次心跳失败后下线)
- **自动重连**:心跳失败时自动重试
- **优雅关闭**:程序退出时自动注销服务
## 技术栈
### 核心依赖
- **Python 3.8+** - 编程语言
- **Flask** - Web框架
- **aiohttp** - 异步HTTP客户端
- **PyYAML** - YAML配置文件解析
- **asyncio** - 异步编程支持
- **requests** - HTTP客户端库
- **python-dotenv** - 环境变量管理
### Flask生态系统
- **Flask** - 轻量级Web框架
- **Jinja2** - 模板引擎
- **Werkzeug** - WSGI工具库
- **Gunicorn** - 生产级WSGI服务器
- **uWSGI** - 高性能WSGI服务器
- **Gevent** - 异步网络库
- **Eventlet** - 网络应用框架
- **Flask-CORS** - 跨域资源共享
### 支持的Web框架
- **Flask** - 轻量级Web框架
- **FastAPI** - 现代高性能Web框架
- **Starlette** - ASGI框架
- **Uvicorn** - ASGI服务器
- **Django** - 全功能Web框架
- **Gunicorn** - WSGI服务器
- **Tornado** - 异步Web框架
### 可选依赖
- **SQLAlchemy** - ORM框架
- **Redis** - 缓存数据库
- **Prometheus** - 监控指标
- **Structlog** - 结构化日志
- **Pydantic** - 数据验证
- **Rich** - 终端美化
- **Click/Typer** - 命令行工具
### 开发工具
- **Pytest** - 测试框架
- **Black** - 代码格式化
- **Flake8** - 代码检查
- **MyPy** - 类型检查
## 安装选项
### 完整安装(推荐)
```bash
pip install ultra-pass-sidecar[all]
```
包含所有依赖,支持所有功能。
### 核心安装
```bash
pip install ultra-pass-sidecar
```
仅包含核心依赖,适合轻量级使用。
### 开发安装
```bash
pip install ultra-pass-sidecar[dev]
```
包含开发工具,适合贡献代码。
### 测试安装
```bash
pip install ultra-pass-sidecar[test]
```
包含测试工具,适合运行测试。
## 部署和运维
### 生产环境部署
#### 使用Gunicorn部署Flask应用
```bash
# 安装Gunicorn
pip install gunicorn
# 启动应用
gunicorn -w 4 -b 0.0.0.0:9202 --worker-class gevent demo_server:app
```
#### 使用uWSGI部署
```bash
# 安装uWSGI
pip install uwsgi
# 启动应用
uwsgi --http 0.0.0.0:9202 --wsgi-file demo_server.py --callable app --workers 4
```
#### 使用Docker部署
```dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 9202
CMD ["python", "demo_server.py"]
```
### 监控和日志
#### 健康检查
```bash
# 检查服务状态
curl http://localhost:9202/health
# 检查Nacos注册状态
curl http://localhost:8848/nacos/v1/ns/instance/list?serviceName=python-test-server
```
#### 日志配置
```python
import logging
from ultra_pass_sidecar import init_sidecar
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 启动sidecar
init_sidecar(app)
```
## 注意事项
1. **端口配置**:确保bootstrap.yml中的端口未被占用
2. **网络连接**:确保能访问Nacos服务器
3. **IP配置**:生产环境需要配置正确的服务IP
4. **心跳监控**:观察日志中的心跳信息确认服务在线
5. **权限配置**:生产环境建议启用权限检查
6. **跨域配置**:前端调用时可能需要配置CORS
## 许可证
MIT License
## 贡献
欢迎提交Issue和Pull Request!
Raw data
{
"_id": null,
"home_page": "https://github.com/yourusername/ultra-pass-py-sidecar",
"name": "ultra-pass-sidecar",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "microservice, sidecar, nacos, service-discovery, feign, flask, fastapi, async, http-client, configuration",
"author": "Luozhiguo",
"author_email": "luozhiguo@example.com",
"download_url": "https://files.pythonhosted.org/packages/7c/89/7270bc509f8ec2b63f6c43f3821f8e0978b2ea11fe71aa16784b8e96278d/ultra_pass_sidecar-0.0.42.tar.gz",
"platform": null,
"description": "# Ultra Pass Sidecar\n\n> \u529f\u80fd\u63cf\u8ff0: sidecar\u5e93\u6587\u6863\uff0c\u5305\u542bAPI\u8bf4\u660e\u3001\u5b89\u88c5\u6307\u5357\u3001\u4f7f\u7528\u793a\u4f8b\u3001\u5f02\u6784\u670d\u52a1\u652f\u6301\u7b49 \n> @author: lzg \n> @created: 2025-07-01 15:47:21 \n> @version: 1.0.0 \n\nUltra Pass Python Sidecar \u662f\u4e00\u4e2a\u7b80\u6d01\u7684Python\u5fae\u670d\u52a1sidecar\u5e93\uff0c\u652f\u6301\u81ea\u52a8\u6ce8\u518c\u5230Nacos\u548cFeign\u98ce\u683c\u8c03\u7528\u3002\n\n## \u529f\u80fd\u7279\u6027\n\n- \u2705 **\u81ea\u52a8\u670d\u52a1\u6ce8\u518c**\uff1a\u4e00\u952e\u6ce8\u518c\u5230Nacos\u670d\u52a1\u53d1\u73b0\u4e2d\u5fc3\n- \u2705 **Feign\u98ce\u683c\u8c03\u7528**\uff1a\u7c7b\u4f3cJava Feign\u7684\u7b80\u6d01\u5ba2\u6237\u7aef\u8c03\u7528\n- \u2705 **\u5f02\u6784\u670d\u52a1\u652f\u6301**\uff1a\u652f\u6301\u8c03\u7528Java\u3001Python\u7b49\u4e0d\u540c\u8bed\u8a00\u7684\u670d\u52a1\n- \u2705 **\u914d\u7f6e\u4e2d\u5fc3\u652f\u6301**\uff1a\u81ea\u52a8\u4eceNacos\u914d\u7f6e\u4e2d\u5fc3\u62c9\u53d6\u914d\u7f6e\n- \u2705 **\u5fc3\u8df3\u4fdd\u6d3b**\uff1a\u81ea\u52a8\u5fc3\u8df3\u673a\u5236\uff0c\u4fdd\u6301\u670d\u52a1\u5728\u7ebf\n- \u2705 **\u4f18\u96c5\u5173\u95ed**\uff1a\u652f\u6301\u4fe1\u53f7\u5904\u7406\uff0c\u4f18\u96c5\u6ce8\u9500\u670d\u52a1\n- \u2705 **\u591a\u6846\u67b6\u652f\u6301**\uff1a\u652f\u6301Flask\u3001FastAPI\u7b49\u4e3b\u6d41\u6846\u67b6\n\n## \u5feb\u901f\u5f00\u59cb\n\n### 1. \u5b89\u88c5\u4f9d\u8d56\n\n#### \u65b9\u5f0f\u4e00\uff1a\u5b89\u88c5\u6240\u6709\u4f9d\u8d56\uff08\u63a8\u8350\uff09\n```bash\npip install ultra-pass-sidecar==0.0.14\n```\n\n#### \u65b9\u5f0f\u4e8c\uff1a\u4ece\u6e90\u7801\u5b89\u88c5\n```bash\ngit clone https://github.com/****/ultra-pass-py-sidecar.git\ncd ultra-pass-py-sidecar/ultra_pass_sidecar\npip install -e .\n```\n\n### 2. \u914d\u7f6e\u6587\u4ef6\n\n\u521b\u5efa `bootstrap.yml`\uff1a\n\n```yaml\nserver:\n port: 9202\n\napplication:\n name: python-test-server\n\nprofiles:\n active: dev\n\ncloud:\n nacos:\n discovery:\n server-addr: 49.233.171.89:8848\n ip: 10.12.6.236\n config:\n server-addr: 49.233.171.89:8848\n file-extension: yml\n shared-configs:\n - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}\n```\n\n### 3. \u670d\u52a1\u7aef\u4f7f\u7528\n\n```python\nfrom flask import Flask\nfrom ultra_pass_sidecar import init_sidecar, config_local, config_remote\n\napp = Flask(__name__)\n\n@app.route('/api/hello/<name>')\ndef hello(name):\n return {'message': f'Hello, {name}!'}\n\nif __name__ == '__main__':\n # \u4e00\u884c\u4ee3\u7801\u542f\u52a8sidecar\n init_sidecar(app) \n \n # \u4ece\u672c\u5730\u8bfb\u53d6\u7aef\u53e3\n port = config_local('server.port', 9202)\n \n # \u4ece\u914d\u7f6e\u4e2d\u5fc3\u8bfb\u53d6\u5176\u4ed6\u914d\u7f6e\n redis_host = config_remote('spring.data.redis.host', 'localhost')\n app.run(host='0.0.0.0', port=port, debug=True)\n```\n\n### 4. \u5ba2\u6237\u7aef\u4f7f\u7528\n\n```python\nimport asyncio\nfrom ultra_pass_sidecar import feign, get\n\n@feign(\"python-test-server\")\nclass HelloService:\n @get(\"/api/hello/{name}\")\n async def hello(self, name: str):\n pass\n\nasync def main():\n service = HelloService()\n result = await service.hello(\"World\")\n print(result)\n\nif __name__ == '__main__':\n asyncio.run(main())\n```\n\n### 5. \u591a\u6846\u67b6\u652f\u6301\u793a\u4f8b\n\n#### Flask\u5e94\u7528\n```python\nfrom flask import Flask\nfrom ultra_pass_sidecar import init_sidecar\n\napp = Flask(__name__)\n\n@app.route('/api/users/<user_id>')\ndef get_user(user_id):\n return {'user_id': user_id, 'name': f'User{user_id}'}\n\nif __name__ == '__main__':\n init_sidecar(app) # \u81ea\u52a8\u8bbe\u7f6e\u6743\u9650\u62e6\u622a\u5668\n app.run(host='0.0.0.0', port=9202)\n```\n\n#### FastAPI\u5e94\u7528\n```python\nfrom fastapi import FastAPI\nfrom ultra_pass_sidecar import init_sidecar\n\napp = FastAPI()\n\n@app.get(\"/api/users/{user_id}\")\nasync def get_user(user_id: int):\n return {'user_id': user_id, 'name': f'User{user_id}'}\n\nif __name__ == '__main__':\n init_sidecar(app) # \u81ea\u52a8\u8bbe\u7f6e\u6743\u9650\u62e6\u622a\u5668\n import uvicorn\n uvicorn.run(app, host='0.0.0.0', port=9202)\n```\n\n#### Django\u5e94\u7528\n```python\n# settings.py\nINSTALLED_APPS = [\n # ... \u5176\u4ed6\u5e94\u7528\n 'ultra_pass_sidecar',\n]\n\n# views.py\nfrom django.http import JsonResponse\nfrom ultra_pass_sidecar import init_sidecar\n\ndef get_user(request, user_id):\n return JsonResponse({'user_id': user_id, 'name': f'User{user_id}'})\n\n# \u5728Django\u542f\u52a8\u65f6\u521d\u59cb\u5316\ninit_sidecar()\n```\n\n## \u7cfb\u7edf\u67b6\u6784\n\n### \u7ebf\u7a0b\u67b6\u6784\u56fe\n\n```mermaid\ngraph TD\n A[\u7a0b\u5e8f\u542f\u52a8] --> B[\u4e3b\u7ebf\u7a0b\u542f\u52a8]\n B --> C[Flask\u5e94\u7528\u521d\u59cb\u5316]\n C --> D[\u52a0\u8f7dbootstrap.yml]\n D --> E[\u6ce8\u518c\u8def\u7531]\n E --> F[\u8c03\u7528init_sidecar]\n F --> G[\u521b\u5efa\u5b50\u7ebf\u7a0b]\n G --> H[\u5b50\u7ebf\u7a0b\u542f\u52a8\u4e8b\u4ef6\u5faa\u73af]\n H --> I[\u542f\u52a8Nacos\u5ba2\u6237\u7aef]\n I --> J[\u6ce8\u518c\u670d\u52a1\u5230Nacos]\n J --> K[\u521b\u5efa\u5fc3\u8df3\u4efb\u52a1]\n K --> L[\u542f\u52a8\u914d\u7f6e\u4e2d\u5fc3]\n L --> M[\u4fdd\u6301\u4e8b\u4ef6\u5faa\u73af\u8fd0\u884c]\n M --> N[\u5fc3\u8df3\u4efb\u52a1\u6bcf10\u79d2\u6267\u884c]\n N --> O[\u670d\u52a1\u4fdd\u6301\u5728\u7ebf]\n \n style A fill:#e1f5fe\n style B fill:#f3e5f5\n style G fill:#fff3e0\n style K fill:#e8f5e8\n style N fill:#ffebee\n```\n\n### \u5e76\u884c\u6267\u884c\u65f6\u5e8f\u56fe\n\n```mermaid\nsequenceDiagram\n participant MT as \u4e3b\u7ebf\u7a0b\n participant ST as \u5b50\u7ebf\u7a0b\n participant N as Nacos\n participant H as \u5fc3\u8df3\u4efb\u52a1\n \n MT->>ST: \u521b\u5efa\u5b50\u7ebf\u7a0b\n ST->>N: \u6ce8\u518c\u670d\u52a1\n ST->>H: \u521b\u5efa\u5fc3\u8df3\u4efb\u52a1\n loop \u6bcf10\u79d2\n H->>N: \u53d1\u9001\u5fc3\u8df3\n N->>H: \u5fc3\u8df3\u786e\u8ba4\n end\n MT->>MT: \u5904\u7406HTTP\u8bf7\u6c42\n```\n\n### \u7cfb\u7edf\u7ec4\u4ef6\u56fe\n\n```mermaid\ngraph LR\n subgraph \"\u4e3b\u7ebf\u7a0b\"\n A[Flask\u5e94\u7528]\n B[HTTP\u8bf7\u6c42\u5904\u7406]\n end\n \n subgraph \"\u5b50\u7ebf\u7a0b\"\n C[\u4e8b\u4ef6\u5faa\u73af]\n D[Nacos\u5ba2\u6237\u7aef]\n E[\u914d\u7f6e\u4e2d\u5fc3]\n F[\u5fc3\u8df3\u4efb\u52a1]\n end\n \n subgraph \"\u5916\u90e8\u670d\u52a1\"\n G[Nacos\u6ce8\u518c\u4e2d\u5fc3]\n H[\u914d\u7f6e\u4e2d\u5fc3]\n end\n \n A --> B\n C --> D\n C --> E\n C --> F\n D --> G\n E --> H\n F --> G\n```\n\n## API \u53c2\u8003\n\n### \u6838\u5fc3\u51fd\u6570\n\n#### `init_sidecar()`\n\u521d\u59cb\u5316sidecar\uff0c\u81ea\u52a8\u6ce8\u518c\u670d\u52a1\u5230Nacos\u3002\n\n#### `feign(service_name: str)`\n\u5b9a\u4e49Feign\u5ba2\u6237\u7aef\u7684\u88c5\u9970\u5668\u3002\n\n#### `get(path: str)` / `post(path: str)`\nHTTP\u8bf7\u6c42\u88c5\u9970\u5668\u3002\n\n#### `config_remote(config_key: str, default: Any = None)`\n\u4eceNacos\u914d\u7f6e\u4e2d\u5fc3\u83b7\u53d6\u914d\u7f6e\u503c\u3002\n\n#### `config_local(config_key: str, default: Any = None)`\n\u4ece\u672c\u5730bootstrap.yml\u83b7\u53d6\u914d\u7f6e\u503c\u3002\n\n### \u914d\u7f6e\u8bf4\u660e\n\n| \u914d\u7f6e\u9879 | \u8bf4\u660e | \u793a\u4f8b |\n|--------|------|------|\n| `server.port` | \u670d\u52a1\u7aef\u53e3 | `9202` |\n| `application.name` | \u670d\u52a1\u540d\u79f0 | `python-test-server` |\n| `cloud.nacos.discovery.server-addr` | Nacos\u5730\u5740 | `49.233.171.89:8848` |\n| `cloud.nacos.discovery.ip` | \u670d\u52a1IP | `10.12.6.236` |\n\n### \u6743\u9650\u914d\u7f6e\n\n```yaml\n# \u6743\u9650\u914d\u7f6e\nauth:\n enabled: true # \u662f\u5426\u5f00\u542f\u6743\u9650\u68c0\u67e5\n fail_open: false # \u5bb9\u9519\u673a\u5236\uff0c\u6743\u9650\u670d\u52a1\u5931\u8d25\u65f6\u7684\u884c\u4e3a\n exclude_paths: # \u6392\u9664\u6743\u9650\u68c0\u67e5\u7684\u8def\u5f84\n - /api/hello\n - /api/health\n - /static\n timeout: 5000 # \u6743\u9650\u68c0\u67e5\u8d85\u65f6\u65f6\u95f4(\u6beb\u79d2)\n```\n\n**Token\u83b7\u53d6\u65b9\u5f0f\uff1a**\n- **Authorization\u5934**\uff1a`Authorization: Bearer <token>`\n- **Cookie**\uff1a`token=<token>`, `access_token=<token>`\n- **URL\u53c2\u6570**\uff1a`?token=<token>`, `?access_token=<token>`\n- **\u81ea\u5b9a\u4e49\u5934**\uff1a`X-Auth-Token: <token>`, `X-Token: <token>`\n\n## \u5fc3\u8df3\u673a\u5236\n\n- **\u5fc3\u8df3\u95f4\u9694**\uff1a10\u79d2\n- **\u8d85\u65f6\u65f6\u95f4**\uff1a90\u79d2\uff083\u6b21\u5fc3\u8df3\u5931\u8d25\u540e\u4e0b\u7ebf\uff09\n- **\u81ea\u52a8\u91cd\u8fde**\uff1a\u5fc3\u8df3\u5931\u8d25\u65f6\u81ea\u52a8\u91cd\u8bd5\n- **\u4f18\u96c5\u5173\u95ed**\uff1a\u7a0b\u5e8f\u9000\u51fa\u65f6\u81ea\u52a8\u6ce8\u9500\u670d\u52a1\n\n## \u6280\u672f\u6808\n\n### \u6838\u5fc3\u4f9d\u8d56\n- **Python 3.8+** - \u7f16\u7a0b\u8bed\u8a00\n- **Flask** - Web\u6846\u67b6\n- **aiohttp** - \u5f02\u6b65HTTP\u5ba2\u6237\u7aef\n- **PyYAML** - YAML\u914d\u7f6e\u6587\u4ef6\u89e3\u6790\n- **asyncio** - \u5f02\u6b65\u7f16\u7a0b\u652f\u6301\n- **requests** - HTTP\u5ba2\u6237\u7aef\u5e93\n- **python-dotenv** - \u73af\u5883\u53d8\u91cf\u7ba1\u7406\n\n### Flask\u751f\u6001\u7cfb\u7edf\n- **Flask** - \u8f7b\u91cf\u7ea7Web\u6846\u67b6\n- **Jinja2** - \u6a21\u677f\u5f15\u64ce\n- **Werkzeug** - WSGI\u5de5\u5177\u5e93\n- **Gunicorn** - \u751f\u4ea7\u7ea7WSGI\u670d\u52a1\u5668\n- **uWSGI** - \u9ad8\u6027\u80fdWSGI\u670d\u52a1\u5668\n- **Gevent** - \u5f02\u6b65\u7f51\u7edc\u5e93\n- **Eventlet** - \u7f51\u7edc\u5e94\u7528\u6846\u67b6\n- **Flask-CORS** - \u8de8\u57df\u8d44\u6e90\u5171\u4eab\n\n### \u652f\u6301\u7684Web\u6846\u67b6\n- **Flask** - \u8f7b\u91cf\u7ea7Web\u6846\u67b6\n- **FastAPI** - \u73b0\u4ee3\u9ad8\u6027\u80fdWeb\u6846\u67b6\n- **Starlette** - ASGI\u6846\u67b6\n- **Uvicorn** - ASGI\u670d\u52a1\u5668\n- **Django** - \u5168\u529f\u80fdWeb\u6846\u67b6\n- **Gunicorn** - WSGI\u670d\u52a1\u5668\n- **Tornado** - \u5f02\u6b65Web\u6846\u67b6\n\n### \u53ef\u9009\u4f9d\u8d56\n- **SQLAlchemy** - ORM\u6846\u67b6\n- **Redis** - \u7f13\u5b58\u6570\u636e\u5e93\n- **Prometheus** - \u76d1\u63a7\u6307\u6807\n- **Structlog** - \u7ed3\u6784\u5316\u65e5\u5fd7\n- **Pydantic** - \u6570\u636e\u9a8c\u8bc1\n- **Rich** - \u7ec8\u7aef\u7f8e\u5316\n- **Click/Typer** - \u547d\u4ee4\u884c\u5de5\u5177\n\n### \u5f00\u53d1\u5de5\u5177\n- **Pytest** - \u6d4b\u8bd5\u6846\u67b6\n- **Black** - \u4ee3\u7801\u683c\u5f0f\u5316\n- **Flake8** - \u4ee3\u7801\u68c0\u67e5\n- **MyPy** - \u7c7b\u578b\u68c0\u67e5\n\n## \u5b89\u88c5\u9009\u9879\n\n### \u5b8c\u6574\u5b89\u88c5\uff08\u63a8\u8350\uff09\n```bash\npip install ultra-pass-sidecar[all]\n```\n\u5305\u542b\u6240\u6709\u4f9d\u8d56\uff0c\u652f\u6301\u6240\u6709\u529f\u80fd\u3002\n\n### \u6838\u5fc3\u5b89\u88c5\n```bash\npip install ultra-pass-sidecar\n```\n\u4ec5\u5305\u542b\u6838\u5fc3\u4f9d\u8d56\uff0c\u9002\u5408\u8f7b\u91cf\u7ea7\u4f7f\u7528\u3002\n\n### \u5f00\u53d1\u5b89\u88c5\n```bash\npip install ultra-pass-sidecar[dev]\n```\n\u5305\u542b\u5f00\u53d1\u5de5\u5177\uff0c\u9002\u5408\u8d21\u732e\u4ee3\u7801\u3002\n\n### \u6d4b\u8bd5\u5b89\u88c5\n```bash\npip install ultra-pass-sidecar[test]\n```\n\u5305\u542b\u6d4b\u8bd5\u5de5\u5177\uff0c\u9002\u5408\u8fd0\u884c\u6d4b\u8bd5\u3002\n\n## \u90e8\u7f72\u548c\u8fd0\u7ef4\n\n### \u751f\u4ea7\u73af\u5883\u90e8\u7f72\n\n#### \u4f7f\u7528Gunicorn\u90e8\u7f72Flask\u5e94\u7528\n```bash\n# \u5b89\u88c5Gunicorn\npip install gunicorn\n\n# \u542f\u52a8\u5e94\u7528\ngunicorn -w 4 -b 0.0.0.0:9202 --worker-class gevent demo_server:app\n```\n\n#### \u4f7f\u7528uWSGI\u90e8\u7f72\n```bash\n# \u5b89\u88c5uWSGI\npip install uwsgi\n\n# \u542f\u52a8\u5e94\u7528\nuwsgi --http 0.0.0.0:9202 --wsgi-file demo_server.py --callable app --workers 4\n```\n\n#### \u4f7f\u7528Docker\u90e8\u7f72\n```dockerfile\nFROM python:3.9-slim\n\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\n\nCOPY . .\nEXPOSE 9202\n\nCMD [\"python\", \"demo_server.py\"]\n```\n\n### \u76d1\u63a7\u548c\u65e5\u5fd7\n\n#### \u5065\u5eb7\u68c0\u67e5\n```bash\n# \u68c0\u67e5\u670d\u52a1\u72b6\u6001\ncurl http://localhost:9202/health\n\n# \u68c0\u67e5Nacos\u6ce8\u518c\u72b6\u6001\ncurl http://localhost:8848/nacos/v1/ns/instance/list?serviceName=python-test-server\n```\n\n#### \u65e5\u5fd7\u914d\u7f6e\n```python\nimport logging\nfrom ultra_pass_sidecar import init_sidecar\n\n# \u914d\u7f6e\u65e5\u5fd7\nlogging.basicConfig(\n level=logging.INFO,\n format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n)\n\n# \u542f\u52a8sidecar\ninit_sidecar(app)\n```\n\n## \u6ce8\u610f\u4e8b\u9879\n\n1. **\u7aef\u53e3\u914d\u7f6e**\uff1a\u786e\u4fddbootstrap.yml\u4e2d\u7684\u7aef\u53e3\u672a\u88ab\u5360\u7528\n2. **\u7f51\u7edc\u8fde\u63a5**\uff1a\u786e\u4fdd\u80fd\u8bbf\u95eeNacos\u670d\u52a1\u5668\n3. **IP\u914d\u7f6e**\uff1a\u751f\u4ea7\u73af\u5883\u9700\u8981\u914d\u7f6e\u6b63\u786e\u7684\u670d\u52a1IP\n4. **\u5fc3\u8df3\u76d1\u63a7**\uff1a\u89c2\u5bdf\u65e5\u5fd7\u4e2d\u7684\u5fc3\u8df3\u4fe1\u606f\u786e\u8ba4\u670d\u52a1\u5728\u7ebf\n5. **\u6743\u9650\u914d\u7f6e**\uff1a\u751f\u4ea7\u73af\u5883\u5efa\u8bae\u542f\u7528\u6743\u9650\u68c0\u67e5\n6. **\u8de8\u57df\u914d\u7f6e**\uff1a\u524d\u7aef\u8c03\u7528\u65f6\u53ef\u80fd\u9700\u8981\u914d\u7f6eCORS\n\n## \u8bb8\u53ef\u8bc1\n\nMIT License\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\uff01 \n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u4e00\u4e2a\u7b80\u6d01\u7684Python\u5fae\u670d\u52a1sidecar\uff0c\u652f\u6301\u81ea\u52a8\u6ce8\u518c\u5230Nacos\u548cFeign\u98ce\u683c\u8c03\u7528\uff0c\u652f\u6301\u914d\u7f6e\u4e2d\u5fc3\uff0c\u652f\u6301\u6743\u9650\uff0c\u8d44\u6e90\u7ba1\u7406",
"version": "0.0.42",
"project_urls": {
"Bug Reports": "https://github.com/yourusername/ultra-pass-py-sidecar/issues",
"Documentation": "https://github.com/yourusername/ultra-pass-py-sidecar#readme",
"Homepage": "https://github.com/yourusername/ultra-pass-py-sidecar",
"Source": "https://github.com/yourusername/ultra-pass-py-sidecar"
},
"split_keywords": [
"microservice",
" sidecar",
" nacos",
" service-discovery",
" feign",
" flask",
" fastapi",
" async",
" http-client",
" configuration"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "ee5e06b074549ada3a09cebcdb8a9aa4bb8195a246be7e9fa22d45adf3f4939a",
"md5": "8bc6c9b2abd5e952372c9f91c9782343",
"sha256": "cfd6a619bea6ad0ac2c255f405727f056a63c441121a26c30110e6c33b787ff8"
},
"downloads": -1,
"filename": "ultra_pass_sidecar-0.0.42-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8bc6c9b2abd5e952372c9f91c9782343",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 21482,
"upload_time": "2025-07-11T09:46:35",
"upload_time_iso_8601": "2025-07-11T09:46:35.869557Z",
"url": "https://files.pythonhosted.org/packages/ee/5e/06b074549ada3a09cebcdb8a9aa4bb8195a246be7e9fa22d45adf3f4939a/ultra_pass_sidecar-0.0.42-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7c897270bc509f8ec2b63f6c43f3821f8e0978b2ea11fe71aa16784b8e96278d",
"md5": "30f65e3f37340c327e589267b0c20ec6",
"sha256": "1ee1ae4943ba9529fc1af18e12d4a9c62e3a4ef8e6c864ff7319989bd1f4cf80"
},
"downloads": -1,
"filename": "ultra_pass_sidecar-0.0.42.tar.gz",
"has_sig": false,
"md5_digest": "30f65e3f37340c327e589267b0c20ec6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 27856,
"upload_time": "2025-07-11T09:46:38",
"upload_time_iso_8601": "2025-07-11T09:46:38.656506Z",
"url": "https://files.pythonhosted.org/packages/7c/89/7270bc509f8ec2b63f6c43f3821f8e0978b2ea11fe71aa16784b8e96278d/ultra_pass_sidecar-0.0.42.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-11 09:46:38",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yourusername",
"github_project": "ultra-pass-py-sidecar",
"github_not_found": true,
"lcname": "ultra-pass-sidecar"
}