ultra-paas-sidecar


Nameultra-paas-sidecar JSON
Version 0.0.99 PyPI version JSON
download
home_pagehttps://github.com/yourusername/ultra-paas-py-sidecar
Summary一个简洁的Python微服务sidecar,支持自动注册到Nacos和Feign风格调用,支持配置中心,支持权限,资源管理
upload_time2025-09-12 09:09:04
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配置中心拉取配置
- ✅ **命名空间支持**:支持Nacos命名空间隔离
- ✅ **权限拦截器**:自动权限检查和token传递
- ✅ **心跳保活**:自动心跳机制,保持服务在线
- ✅ **优雅关闭**:支持信号处理,优雅注销服务
- ✅ **多框架支持**:支持Flask、FastAPI等主流框架
- ✅ **轻量级设计**:最小化依赖,只包含核心功能

## 快速开始

### 1. 安装依赖

```bash
pip install ultra-paas-sidecar==0.0.83
```

### 2. 配置文件

创建 `bootstrap.yml`:

```yaml
server:
  port: 9202

application:
  name: python-test-server
  code: 10001  # 应用代码,用于权限验证

profiles:
  active: dev

# 权限配置(可选)
auth:
  enabled: true     # 是否开启权限检查
  fail_open: false  # 容错机制,权限服务失败时的行为
  exclude_paths:    # 排除权限检查的路径
    - /api/hello
    - /api/health
    - /static
  timeout: 5000     # 权限检查超时时间(毫秒)

cloud:
  nacos:
    discovery:
      server-addr: 34.212.106.66:8848
      ip: 10.12.6.236
      namespace: upcloudx        # 命名空间
      username: nacos           # 用户名
      password: qrFt.jIrt4561#  # 密码
    config:
      server-addr: 34.212.106.66:8848
      file-extension: yml
      namespace: upcloudx        # 命名空间
      username: nacos           # 用户名
      password: qrFt.jIrt4561#  # 密码
      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. 权限服务定义

如果需要自定义权限服务,可以在子系统中定义:

```python
from ultra_pass_sidecar import feign, get

@feign("your-auth-service")  # 使用你的权限服务名称
class AuthPermissionService:
    """权限微服务接口"""
    
    @get("/external/auth/check")
    async def check_permission(self, url: str, code: str = None, token: str = None):
        """权限校验接口"""
        pass
    
    @get("/external/menu/resources")
    async def get_menu_resources(self, code: str):
        """获取菜单资源"""
        pass 

    @get("/external/user/info")
    async def get_user_info(self):
        """获取用户信息"""
        pass
```

### 6. 多框架支持示例

#### 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)
```

## 系统架构

### 线程架构图

```mermaid
graph TD
    A[程序启动] --> B[主线程启动]
    B --> C[Web应用初始化]
    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 C as 客户端
    participant S as Sidecar
    participant A as 权限服务
    participant N as Nacos
    
    C->>S: HTTP请求(带token)
    S->>S: 提取token
    S->>A: 调用权限服务
    A->>S: 权限验证结果
    alt 权限通过
        S->>C: 返回业务数据
    else 权限拒绝
        S->>C: 返回401错误
    end
```

## API 参考

### 核心函数

#### `init_sidecar(app=None)`
初始化sidecar,自动注册服务到Nacos。

**参数:**
- `app`: Web应用实例(Flask、FastAPI等),可选

#### `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` |
| `application.code` | 应用代码 | `10001` |
| `cloud.nacos.discovery.server-addr` | Nacos地址 | `34.212.106.66:8848` |
| `cloud.nacos.discovery.namespace` | 命名空间 | `upcloudx` |
| `cloud.nacos.discovery.username` | 用户名 | `nacos` |
| `cloud.nacos.discovery.password` | 密码 | `qrFt.jIrt4561#` |

### Token传递机制

Sidecar 会自动从以下位置获取 token 并传递给微服务:

1. **Authorization头**:`Authorization: Bearer <token>`
2. **Cookie**:`token=<token>`, `access_token=<token>`
3. **URL参数**:`?token=<token>`, `?access_token=<token>`
4. **自定义头**:`X-Auth-Token: <token>`, `X-Token: <token>`

**优先级**:Authorization头 > Cookie > URL参数 > 自定义头

## 心跳机制

- **心跳间隔**:10秒
- **超时时间**:90秒(3次心跳失败后下线)
- **自动重连**:心跳失败时自动重试
- **优雅关闭**:程序退出时自动注销服务

## 技术栈

### 核心依赖
- **Python 3.8+** - 编程语言
- **aiohttp** - 异步HTTP客户端
- **PyYAML** - YAML配置文件解析
- **nacos-sdk-python** - Nacos服务发现和配置中心
- **asyncio** - 异步编程支持

### Web框架支持
- **FastAPI>=0.100.0** - 现代高性能Web框架
- **Flask>=2.0.0** - 轻量级Web框架
- **Flask-CORS>=3.0.0** - 跨域资源共享
- **Uvicorn>=0.15.0** - ASGI服务器

### 开发工具
- **Pytest** - 测试框架
- **Black** - 代码格式化
- **Flake8** - 代码检查
- **MyPy** - 类型检查

## 安装选项

### 核心安装
```bash
pip install ultra-paas-sidecar
```

### 开发环境安装
```bash
pip install ultra-paas-sidecar[dev]
```

## 部署和运维

### 生产环境部署

#### 使用Gunicorn部署Flask应用
```bash
# 安装Gunicorn
pip install gunicorn

# 启动应用
gunicorn -w 4 -b 0.0.0.0:9202 --worker-class gevent demo_server:app
```

#### 使用Uvicorn部署FastAPI应用
```bash
# 启动应用
uvicorn demo_server:app --host 0.0.0.0 --port 9202 --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
```

#### 调试日志
Sidecar 会输出详细的调试信息,包括:
- 微服务调用信息
- 请求头、参数、token
- 响应状态和内容

## 注意事项

1. **端口配置**:确保bootstrap.yml中的端口未被占用
2. **网络连接**:确保能访问Nacos服务器
3. **IP配置**:生产环境需要配置正确的服务IP
4. **命名空间**:确保使用正确的Nacos命名空间
5. **权限配置**:生产环境建议启用权限检查
6. **Token格式**:确保token格式正确(JWT等)
7. **跨域配置**:前端调用时可能需要配置CORS

## 更新日志

### v0.0.83
- ✅ 支持Nacos命名空间隔离
- ✅ 支持Nacos用户名密码认证
- ✅ 优化token传递机制(Bearer格式)
- ✅ 清理无用依赖,大幅减少包大小
- ✅ 升级FastAPI到0.100.0版本
- ✅ 添加详细调试日志
- ✅ 修复权限服务调用问题

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/yourusername/ultra-paas-py-sidecar",
    "name": "ultra-paas-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/00/42/ecb1ff73e1e14e2f1b08046b2cd8a4352a86e946fc5caf25af7ee80fee03/ultra_paas_sidecar-0.0.99.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 **\u547d\u540d\u7a7a\u95f4\u652f\u6301**\uff1a\u652f\u6301Nacos\u547d\u540d\u7a7a\u95f4\u9694\u79bb\n- \u2705 **\u6743\u9650\u62e6\u622a\u5668**\uff1a\u81ea\u52a8\u6743\u9650\u68c0\u67e5\u548ctoken\u4f20\u9012\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- \u2705 **\u8f7b\u91cf\u7ea7\u8bbe\u8ba1**\uff1a\u6700\u5c0f\u5316\u4f9d\u8d56\uff0c\u53ea\u5305\u542b\u6838\u5fc3\u529f\u80fd\n\n## \u5feb\u901f\u5f00\u59cb\n\n### 1. \u5b89\u88c5\u4f9d\u8d56\n\n```bash\npip install ultra-paas-sidecar==0.0.83\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  code: 10001  # \u5e94\u7528\u4ee3\u7801\uff0c\u7528\u4e8e\u6743\u9650\u9a8c\u8bc1\n\nprofiles:\n  active: dev\n\n# \u6743\u9650\u914d\u7f6e\uff08\u53ef\u9009\uff09\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\ncloud:\n  nacos:\n    discovery:\n      server-addr: 34.212.106.66:8848\n      ip: 10.12.6.236\n      namespace: upcloudx        # \u547d\u540d\u7a7a\u95f4\n      username: nacos           # \u7528\u6237\u540d\n      password: qrFt.jIrt4561#  # \u5bc6\u7801\n    config:\n      server-addr: 34.212.106.66:8848\n      file-extension: yml\n      namespace: upcloudx        # \u547d\u540d\u7a7a\u95f4\n      username: nacos           # \u7528\u6237\u540d\n      password: qrFt.jIrt4561#  # \u5bc6\u7801\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. \u6743\u9650\u670d\u52a1\u5b9a\u4e49\n\n\u5982\u679c\u9700\u8981\u81ea\u5b9a\u4e49\u6743\u9650\u670d\u52a1\uff0c\u53ef\u4ee5\u5728\u5b50\u7cfb\u7edf\u4e2d\u5b9a\u4e49\uff1a\n\n```python\nfrom ultra_pass_sidecar import feign, get\n\n@feign(\"your-auth-service\")  # \u4f7f\u7528\u4f60\u7684\u6743\u9650\u670d\u52a1\u540d\u79f0\nclass AuthPermissionService:\n    \"\"\"\u6743\u9650\u5fae\u670d\u52a1\u63a5\u53e3\"\"\"\n    \n    @get(\"/external/auth/check\")\n    async def check_permission(self, url: str, code: str = None, token: str = None):\n        \"\"\"\u6743\u9650\u6821\u9a8c\u63a5\u53e3\"\"\"\n        pass\n    \n    @get(\"/external/menu/resources\")\n    async def get_menu_resources(self, code: str):\n        \"\"\"\u83b7\u53d6\u83dc\u5355\u8d44\u6e90\"\"\"\n        pass \n\n    @get(\"/external/user/info\")\n    async def get_user_info(self):\n        \"\"\"\u83b7\u53d6\u7528\u6237\u4fe1\u606f\"\"\"\n        pass\n```\n\n### 6. \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## \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[Web\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### \u6743\u9650\u68c0\u67e5\u6d41\u7a0b\n\n```mermaid\nsequenceDiagram\n    participant C as \u5ba2\u6237\u7aef\n    participant S as Sidecar\n    participant A as \u6743\u9650\u670d\u52a1\n    participant N as Nacos\n    \n    C->>S: HTTP\u8bf7\u6c42\uff08\u5e26token\uff09\n    S->>S: \u63d0\u53d6token\n    S->>A: \u8c03\u7528\u6743\u9650\u670d\u52a1\n    A->>S: \u6743\u9650\u9a8c\u8bc1\u7ed3\u679c\n    alt \u6743\u9650\u901a\u8fc7\n        S->>C: \u8fd4\u56de\u4e1a\u52a1\u6570\u636e\n    else \u6743\u9650\u62d2\u7edd\n        S->>C: \u8fd4\u56de401\u9519\u8bef\n    end\n```\n\n## API \u53c2\u8003\n\n### \u6838\u5fc3\u51fd\u6570\n\n#### `init_sidecar(app=None)`\n\u521d\u59cb\u5316sidecar\uff0c\u81ea\u52a8\u6ce8\u518c\u670d\u52a1\u5230Nacos\u3002\n\n**\u53c2\u6570\uff1a**\n- `app`: Web\u5e94\u7528\u5b9e\u4f8b\uff08Flask\u3001FastAPI\u7b49\uff09\uff0c\u53ef\u9009\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| `application.code` | \u5e94\u7528\u4ee3\u7801 | `10001` |\n| `cloud.nacos.discovery.server-addr` | Nacos\u5730\u5740 | `34.212.106.66:8848` |\n| `cloud.nacos.discovery.namespace` | \u547d\u540d\u7a7a\u95f4 | `upcloudx` |\n| `cloud.nacos.discovery.username` | \u7528\u6237\u540d | `nacos` |\n| `cloud.nacos.discovery.password` | \u5bc6\u7801 | `qrFt.jIrt4561#` |\n\n### Token\u4f20\u9012\u673a\u5236\n\nSidecar \u4f1a\u81ea\u52a8\u4ece\u4ee5\u4e0b\u4f4d\u7f6e\u83b7\u53d6 token \u5e76\u4f20\u9012\u7ed9\u5fae\u670d\u52a1\uff1a\n\n1. **Authorization\u5934**\uff1a`Authorization: Bearer <token>`\n2. **Cookie**\uff1a`token=<token>`, `access_token=<token>`\n3. **URL\u53c2\u6570**\uff1a`?token=<token>`, `?access_token=<token>`\n4. **\u81ea\u5b9a\u4e49\u5934**\uff1a`X-Auth-Token: <token>`, `X-Token: <token>`\n\n**\u4f18\u5148\u7ea7**\uff1aAuthorization\u5934 > Cookie > URL\u53c2\u6570 > \u81ea\u5b9a\u4e49\u5934\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- **aiohttp** - \u5f02\u6b65HTTP\u5ba2\u6237\u7aef\n- **PyYAML** - YAML\u914d\u7f6e\u6587\u4ef6\u89e3\u6790\n- **nacos-sdk-python** - Nacos\u670d\u52a1\u53d1\u73b0\u548c\u914d\u7f6e\u4e2d\u5fc3\n- **asyncio** - \u5f02\u6b65\u7f16\u7a0b\u652f\u6301\n\n### Web\u6846\u67b6\u652f\u6301\n- **FastAPI>=0.100.0** - \u73b0\u4ee3\u9ad8\u6027\u80fdWeb\u6846\u67b6\n- **Flask>=2.0.0** - \u8f7b\u91cf\u7ea7Web\u6846\u67b6\n- **Flask-CORS>=3.0.0** - \u8de8\u57df\u8d44\u6e90\u5171\u4eab\n- **Uvicorn>=0.15.0** - ASGI\u670d\u52a1\u5668\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### \u6838\u5fc3\u5b89\u88c5\n```bash\npip install ultra-paas-sidecar\n```\n\n### \u5f00\u53d1\u73af\u5883\u5b89\u88c5\n```bash\npip install ultra-paas-sidecar[dev]\n```\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\u7528Uvicorn\u90e8\u7f72FastAPI\u5e94\u7528\n```bash\n# \u542f\u52a8\u5e94\u7528\nuvicorn demo_server:app --host 0.0.0.0 --port 9202 --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#### \u8c03\u8bd5\u65e5\u5fd7\nSidecar \u4f1a\u8f93\u51fa\u8be6\u7ec6\u7684\u8c03\u8bd5\u4fe1\u606f\uff0c\u5305\u62ec\uff1a\n- \u5fae\u670d\u52a1\u8c03\u7528\u4fe1\u606f\n- \u8bf7\u6c42\u5934\u3001\u53c2\u6570\u3001token\n- \u54cd\u5e94\u72b6\u6001\u548c\u5185\u5bb9\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. **\u547d\u540d\u7a7a\u95f4**\uff1a\u786e\u4fdd\u4f7f\u7528\u6b63\u786e\u7684Nacos\u547d\u540d\u7a7a\u95f4\n5. **\u6743\u9650\u914d\u7f6e**\uff1a\u751f\u4ea7\u73af\u5883\u5efa\u8bae\u542f\u7528\u6743\u9650\u68c0\u67e5\n6. **Token\u683c\u5f0f**\uff1a\u786e\u4fddtoken\u683c\u5f0f\u6b63\u786e\uff08JWT\u7b49\uff09\n7. **\u8de8\u57df\u914d\u7f6e**\uff1a\u524d\u7aef\u8c03\u7528\u65f6\u53ef\u80fd\u9700\u8981\u914d\u7f6eCORS\n\n## \u66f4\u65b0\u65e5\u5fd7\n\n### v0.0.83\n- \u2705 \u652f\u6301Nacos\u547d\u540d\u7a7a\u95f4\u9694\u79bb\n- \u2705 \u652f\u6301Nacos\u7528\u6237\u540d\u5bc6\u7801\u8ba4\u8bc1\n- \u2705 \u4f18\u5316token\u4f20\u9012\u673a\u5236\uff08Bearer\u683c\u5f0f\uff09\n- \u2705 \u6e05\u7406\u65e0\u7528\u4f9d\u8d56\uff0c\u5927\u5e45\u51cf\u5c11\u5305\u5927\u5c0f\n- \u2705 \u5347\u7ea7FastAPI\u52300.100.0\u7248\u672c\n- \u2705 \u6dfb\u52a0\u8be6\u7ec6\u8c03\u8bd5\u65e5\u5fd7\n- \u2705 \u4fee\u590d\u6743\u9650\u670d\u52a1\u8c03\u7528\u95ee\u9898\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.99",
    "project_urls": {
        "Bug Reports": "https://github.com/yourusername/ultra-paas-py-sidecar/issues",
        "Documentation": "https://github.com/yourusername/ultra-paas-py-sidecar#readme",
        "Homepage": "https://github.com/yourusername/ultra-paas-py-sidecar",
        "Source": "https://github.com/yourusername/ultra-paas-py-sidecar"
    },
    "split_keywords": [
        "microservice",
        " sidecar",
        " nacos",
        " service-discovery",
        " feign",
        " flask",
        " fastapi",
        " async",
        " http-client",
        " configuration"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e83d8d42e828a18346d564f2d98836ff614604516188d1cfcf3443605a091d1e",
                "md5": "6f8402caa8e101243281d8d9ee3be5e6",
                "sha256": "e5c3dcaf071485e9950bff9a621f339ec214392daa188dda1e4eaf393eeadcbf"
            },
            "downloads": -1,
            "filename": "ultra_paas_sidecar-0.0.99-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "6f8402caa8e101243281d8d9ee3be5e6",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 24873,
            "upload_time": "2025-09-12T09:09:02",
            "upload_time_iso_8601": "2025-09-12T09:09:02.927841Z",
            "url": "https://files.pythonhosted.org/packages/e8/3d/8d42e828a18346d564f2d98836ff614604516188d1cfcf3443605a091d1e/ultra_paas_sidecar-0.0.99-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0042ecb1ff73e1e14e2f1b08046b2cd8a4352a86e946fc5caf25af7ee80fee03",
                "md5": "8d291889aa65b653d7abc56fb77cef0e",
                "sha256": "0f2b54044570f9b06c8c5759ae3980953e9b040656a26dc519163be0a805a80f"
            },
            "downloads": -1,
            "filename": "ultra_paas_sidecar-0.0.99.tar.gz",
            "has_sig": false,
            "md5_digest": "8d291889aa65b653d7abc56fb77cef0e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 24101,
            "upload_time": "2025-09-12T09:09:04",
            "upload_time_iso_8601": "2025-09-12T09:09:04.938683Z",
            "url": "https://files.pythonhosted.org/packages/00/42/ecb1ff73e1e14e2f1b08046b2cd8a4352a86e946fc5caf25af7ee80fee03/ultra_paas_sidecar-0.0.99.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-12 09:09:04",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yourusername",
    "github_project": "ultra-paas-py-sidecar",
    "github_not_found": true,
    "lcname": "ultra-paas-sidecar"
}
        
Elapsed time: 9.21270s