ultra-pass-sidecar


Nameultra-pass-sidecar JSON
Version 0.0.42 PyPI version JSON
download
home_pagehttps://github.com/yourusername/ultra-pass-py-sidecar
Summary一个简洁的Python微服务sidecar,支持自动注册到Nacos和Feign风格调用,支持配置中心,支持权限,资源管理
upload_time2025-07-11 09:46:38
maintainerNone
docs_urlNone
authorLuozhiguo
requires_python>=3.8
licenseMIT
keywords microservice sidecar nacos service-discovery feign flask fastapi async http-client configuration
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.42733s