- 打开 NATS 官方下载页面
- 找到最新版本,下载
nats-server.exe
(Windows 版本) - 将
nats-server.exe
放到任意文件夹(如C:\nats\
)
2️⃣ 启动 NATS 服务器
如果你是 手动下载的 nats-server.exe
:
powershell
复制
cd C:\nats\
nats-server.exe
默认情况下,NATS 服务器会监听 localhost:4222
端口。
已完成:Windows 下启动 NATS 服务器
import json
from jsonschema import validate, ValidationError
# 法院数据格式
court_schema = {
"type": "object",
"properties": {
"case_id": {"type": "string"},
"judge": {"type": "string"},
"status": {"type": "string"},
"verdict": {"type": "string"}
},
"required": ["case_id", "judge", "status"]
}
# 检察院数据格式
procuratorate_schema = {
"type": "object",
"properties": {
"case_id": {"type": "string"},
"prosecutor": {"type": "string"},
"charges": {"type": "string"},
"evidence": {"type": "array"}
},
"required": ["case_id", "prosecutor", "charges"]
}
# 司法部门数据格式
justice_schema = {
"type": "object",
"properties": {
"case_id": {"type": "string"},
"offender": {"type": "string"},
"rehabilitation_status": {"type": "string"}
},
"required": ["case_id", "offender", "rehabilitation_status"]
}
# 数据验证函数
def validate_data(data, schema):
try:
validate(instance=data, schema=schema)
return True
except ValidationError as e:
print(f"数据验证失败: {e.message}")
return False
import asyncio
from nats.aio.client import Client as NATS
# 连接 NATS 服务器
async def connect_nats():
nc = NATS()
await nc.connect("nats://localhost:4222")
return nc
async def publish_data(nc, subject, data):
""" 发送数据到 NATS """
message = json.dumps(data)
await nc.publish(subject, message.encode())
print(f"📤 已发送数据到 {subject}: {data}")
async def subscribe_data(nc, subject, schema):
""" 订阅特定主题的数据 """
async def message_handler(msg):
data = json.loads(msg.data.decode())
print(f"📥 收到数据 ({subject}): {data}")
if validate_data(data, schema):
print(f"✅ 数据有效,存入 {subject} 数据库")
else:
print(f"❌ 数据无效,丢弃")
await nc.subscribe(subject, cb=message_handler)
def transform_data(source_data, target_type):
""" 转换数据格式 """
if target_type == "court":
return {
"case_id": source_data["case_id"],
"judge": source_data.get("judge", "未知"),
"status": source_data.get("status", "进行中"),
"verdict": source_data.get("verdict", "未判决")
}
elif target_type == "procuratorate":
return {
"case_id": source_data["case_id"],
"prosecutor": source_data.get("prosecutor", "未知"),
"charges": source_data.get("charges", "未指控"),
"evidence": source_data.get("evidence", [])
}
elif target_type == "justice":
return {
"case_id": source_data["case_id"],
"offender": source_data.get("offender", "未知"),
"rehabilitation_status": source_data.get("rehabilitation_status", "未恢复")
}
else:
raise ValueError("未知的数据类型")
async def main():
nc = await connect_nats()
# 订阅不同的数据流
await subscribe_data(nc, "court", court_schema)
await subscribe_data(nc, "procuratorate", procuratorate_schema)
await subscribe_data(nc, "justice", justice_schema)
# 模拟发送不同数据
court_data = transform_data({"case_id": "C123", "judge": "张三", "status": "受理中"}, "court")
procuratorate_data = transform_data({"case_id": "C123", "prosecutor": "李四", "charges": "盗窃"}, "procuratorate")
justice_data = transform_data({"case_id": "C123", "offender": "王五", "rehabilitation_status": "完成"}, "justice")
await publish_data(nc, "court", court_data)
await publish_data(nc, "procuratorate", procuratorate_data)
await publish_data(nc, "justice", justice_data)
# 运行一段时间,等待接收消息
await asyncio.sleep(5)
await nc.close()
# 启动
if __name__ == "__main__":
asyncio.run(main())