Client library for KXY Open ID Service - ID segment allocation
Project description
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 服务端
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kxy_open_id_client-0.2.1.tar.gz.
File metadata
- Download URL: kxy_open_id_client-0.2.1.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23be690698bc09edb1921c3db46be3414ba07559a589c3da671d4374b9fd20eb
|
|
| MD5 |
86879e1effeaea5e770ee0f770fde725
|
|
| BLAKE2b-256 |
43846fa0636facb8d0b3e4c500a968e3b03e2e36ba49d7af8f6f3250593bf568
|
File details
Details for the file kxy_open_id_client-0.2.1-py3-none-any.whl.
File metadata
- Download URL: kxy_open_id_client-0.2.1-py3-none-any.whl
- Upload date:
- Size: 8.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1acd7b79654f42f82a5478a9d4c8a9b6238c623a5ad82e033d46e5c026c01b1
|
|
| MD5 |
4d9494f9c7e8a88f4fbb002a3b74886d
|
|
| BLAKE2b-256 |
9f180a5143989bbd526ecd61c1a59e9f79f9c738a3d84e618626dbcd3fe54ac2
|