kxy-open-id-client
Python 客户端库,用于对接 KXY Open ID 服务,实现分布式 ID 分段分配。
特性
- 简洁易用的 API
- 支持同步和异步调用
- 完整的类型提示支持
- 详细的错误处理
- 基于 httpx 的高性能 HTTP 客户端
安装
使用 pip 安装
pip install kxy-open-id-client
从源码安装
git clone https://github.com/kxy/kxy-open-id-client.git
cd kxy-open-id-client
pip install -e .
快速开始
基础用法(同步)
from kxy_open_id_client import SegmentClient
# 创建客户端实例
client = SegmentClient(base_url="http://localhost:5801")
# 分配 ID 段
segment = client.allocate_segment(
system_code="my-system",
db_name="my_database",
table_name="users",
field_name="id",
segment_count=10000 # 可选,默认 10000
)
print(f"分配到的 ID 段: {segment.start} 到 {segment.end}")
# 输出: 分配到的 ID 段: 1 到 10000
# 工厂使用
client = SegmentClient(base_url="http://localhost:5801")
factory = IdGeneratorFactory(client, "my-system", "my_database")
# 动态获取生成器
user_id = factory.get_generator("users").next_id()
order_id = factory.get_generator("orders").next_id()
product_id = factory.get_generator("products").next_id()
异步用法
import asyncio
from kxy_open_id_client import SegmentClient
async def main():
client = SegmentClient(base_url="http://localhost:5801")
# 异步分配 ID 段
segment = await client.allocate_segment_async(
system_code="my-system",
db_name="my_database",
table_name="orders",
field_name="order_id",
segment_count=5000
)
print(f"分配到的 ID 段: {segment.start} 到 {segment.end}")
asyncio.run(main())
详细用法
客户端配置
from kxy_open_id_client import SegmentClient
client = SegmentClient(
base_url="http://localhost:5801", # 服务地址
timeout=30.0, # 请求超时时间(秒)
verify_ssl=True, # 是否验证 SSL 证书
headers={ # 自定义请求头
"X-Custom-Header": "value"
}
)
错误处理
from kxy_open_id_client import (
SegmentClient,
OpenIdAPIError,
OpenIdConnectionError,
OpenIdTimeoutError
)
client = SegmentClient(base_url="http://localhost:5801")
try:
segment = client.allocate_segment(
system_code="my-system",
db_name="my_database",
table_name="users",
field_name="id"
)
except OpenIdAPIError as e:
# API 返回错误响应
print(f"API 错误 {e.code}: {e.msg}")
if e.trace_id:
print(f"Trace ID: {e.trace_id}")
except OpenIdConnectionError as e:
# 连接失败
print(f"连接错误: {e}")
except OpenIdTimeoutError as e:
# 请求超时
print(f"请求超时: {e}")
ID 生成器(同步,线程安全)
from kxy_open_id_client import SegmentClient, IdGenerator
# 创建客户端实例
client = SegmentClient(base_url="http://localhost:5801")
# 创建 ID 生成器(线程安全)
id_gen = IdGenerator(
segment_client=client,
system_code="my-system",
db_name="my_database",
table_name="users",
field_name="id",
segment_count=10000 # 每次申请的 ID 数量
)
# 生成 ID(自动管理号段,线程安全)
for _ in range(5):
print(f"Generated ID: {id_gen.next_id()}")
# 输出: Generated ID: 1, 2, 3, 4, 5
ID 生成器(异步,协程安全)
import asyncio
from kxy_open_id_client import SegmentClient, AsyncIdGenerator
async def main():
# 创建客户端实例
client = SegmentClient(base_url="http://localhost:5801")
# 创建异步 ID 生成器(协程安全)
id_gen = AsyncIdGenerator(
segment_client=client,
system_code="my-system",
db_name="my_database",
table_name="orders",
field_name="order_id",
segment_count=10000
)
# 异步生成 ID
for _ in range(5):
id_value = await id_gen.next_id()
print(f"Generated ID: {id_value}")
asyncio.run(main())
多线程并发使用
import threading
from kxy_open_id_client import SegmentClient, IdGenerator
client = SegmentClient(base_url="http://localhost:5801")
id_gen = IdGenerator(
segment_client=client,
system_code="my-system",
db_name="my_database",
table_name="users",
field_name="id",
segment_count=10000
)
# 多线程并发生成 ID(线程安全)
def generate_ids(thread_id: int, count: int):
for _ in range(count):
id_value = id_gen.next_id()
print(f"Thread {thread_id}: Generated ID {id_value}")
threads = []
for i in range(5):
t = threading.Thread(target=generate_ids, args=(i, 10))
threads.append(t)
t.start()
for t in threads:
t.join()
API 参考
IdGenerator
线程安全的同步 ID 生成器。
__init__(segment_client, system_code, db_name, table_name, field_name, segment_count=10000)
创建 ID 生成器实例。
参数:
segment_client(SegmentClient): SegmentClient 实例system_code(str): 系统代码db_name(str): 数据库名称table_name(str): 表名field_name(str): 字段名segment_count(int): 每次分配的 ID 数量,默认 10000
next_id()
生成下一个 ID(线程安全)。
返回: int - 下一个可用的 ID
异常:
OpenIdAPIError: API 返回错误OpenIdConnectionError: 连接失败OpenIdTimeoutError: 请求超时
AsyncIdGenerator
协程安全的异步 ID 生成器。
__init__(segment_client, system_code, db_name, table_name, field_name, segment_count=10000)
创建异步 ID 生成器实例(参数同 IdGenerator)。
async next_id()
异步生成下一个 ID(协程安全)。
返回: int - 下一个可用的 ID
异常: 同 IdGenerator.next_id()
SegmentClient
__init__(base_url, timeout=30.0, verify_ssl=True, headers=None)
创建客户端实例。
参数:
base_url(str): KXY Open ID 服务的基础 URLtimeout(float): 请求超时时间,默认 30 秒verify_ssl(bool): 是否验证 SSL 证书,默认 Trueheaders(dict): 自定义请求头,可选
allocate_segment(system_code, db_name, table_name, field_name, segment_count=10000)
同步分配 ID 段。
参数:
system_code(str): 系统代码db_name(str): 数据库名称table_name(str): 表名field_name(str): 字段名segment_count(int): 分配的 ID 数量,默认 10000
返回: SegmentResponse 对象,包含 start 和 end 属性
异常:
OpenIdAPIError: API 返回错误OpenIdConnectionError: 连接失败OpenIdTimeoutError: 请求超时
allocate_segment_async(system_code, db_name, table_name, field_name, segment_count=10000)
异步分配 ID 段(参数和返回值同上)。
数据模型
SegmentRequest
system_code: strdb_name: strtable_name: strfield_name: strsegment_count: int (默认 10000,最大 2^63-1)
SegmentResponse
start: int - 段起始 IDend: int - 段结束 ID
ApiResponse[T]
code: int - 状态码 (0 表示成功)msg: str - 消息data: Optional[T] - 数据traceId: Optional[str] - 追踪 ID
开发
安装开发依赖
pip install -e ".[dev]"
运行测试
pytest
代码格式化
black kxy_open_id_client
类型检查
mypy kxy_open_id_client
许可证
MIT License
相关项目
- kxy-open-id - KXY Open ID 服务端
Metadata
Release files for kxy-open-id-client 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| kxy_open_id_client-0.2.1.tar.gz | 15.1 kB | Without provenance | Details for kxy_open_id_client-0.2.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| kxy_open_id_client-0.2.1-py3-none-any.whl | Python 3 | none | any | Details for kxy_open_id_client-0.2.1-py3-none-any.whl |
Total release size: 23.7 kB
Release files / kxy_open_id_client-0.2.1.tar.gz
| Download URL | kxy_open_id_client-0.2.1.tar.gz |
|---|---|
| Size | 15.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
23be690698bc09edb1921c3db46be3414ba07559a589c3da671d4374b9fd20eb
|
|
BLAKE2b-256 checksum How to use checksums |
43846fa0636facb8d0b3e4c500a968e3b03e2e36ba49d7af8f6f3250593bf568
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Release files / kxy_open_id_client-0.2.1-py3-none-any.whl
| Download URL | kxy_open_id_client-0.2.1-py3-none-any.whl |
|---|---|
| Size | 8.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f1acd7b79654f42f82a5478a9d4c8a9b6238c623a5ad82e033d46e5c026c01b1
|
|
BLAKE2b-256 checksum How to use checksums |
9f180a5143989bbd526ecd61c1a59e9f79f9c738a3d84e618626dbcd3fe54ac2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Security for kxy-open-id-client 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.