protobuf cloudevents 集成使用

就是一个简单的示例学习,使用了python

protobuf 定义

  • proto
syntax = "proto3";

package cloudevents;

message CloudEvent {
  string id = 1;
  string source = 2;
  string type = 3;
  string specversion = 4;
  string time = 5;
  string datacontenttype = 6;
  string data = 7; 
}
  • 生成代码
protoc --python_out=. cloudevent.proto

fastapi 集成cloudevents模型数据

  • fastapi 代码
from fastapi import FastAPI, HTTPException, Request
from cloudevents.http import from_http
app = FastAPI()

@app.post("/cloudevent")
async def receive_cloudevent(request: Request):
    try:
        print("Received CloudEvent request headers",request.headers)
        body = await request.body()
        print("Received CloudEvent request body",body)
        event = from_http(request.headers, body)
        print(f"Received CloudEvent: {event}")
        return {"message": "CloudEvent received successfully", "event": event}
    except Exception as e:
        print(f"Failed to process CloudEvent: {str(e)}")
        raise HTTPException(status_code=400, detail=f"Failed to process CloudEvent: {str(e)}")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
  • 本地生成protobuf cloudevents 消息
import cloudevent_pb2 
import json
import time
import requests
from google.protobuf.json_format import MessageToDict
from cloudevents.http import CloudEvent
from cloudevents.conversion import to_binary
event = cloudevent_pb2.CloudEvent(
    id="12345",
    source="example.com",
    type="com.example.someevent",
    specversion="1.0",
    time=str(time.time()),  # 当前时间戳
    datacontenttype="application/json",
    data=json.dumps({"message": "Hello, CloudEvents!"})  # 事件的数据
)
# 序列化事件到二进制
serialized_event = event.SerializeToString()

# 假设我们现在接收到事件并反序列化
received_event = cloudevent_pb2.CloudEvent()
received_event.ParseFromString(serialized_event)
# 打印反序列化的事件
print(f"Received CloudEvent ID: {received_event.id}")
print(f"Received CloudEvent Source: {received_event.source}")
print(f"Received CloudEvent Type: {received_event.type}")
print(f"Received CloudEvent Data: {received_event.data}")

# CloudEvent 包装数据
event = CloudEvent(attributes=MessageToDict(received_event), data=json.loads(received_event.data))
# Creates the HTTP request representation of the CloudEvent in structured content mode
headers, body = to_binary(event)

# POST
requests.post("http://localhost:8000/cloudevent", data=body, headers=headers)

说明

以上是一个简单集成测试,主要是记录下

参考资料

https://pypi.org/project/cloudevents/

https://github.com/cloudevents/sdk-python

https://protobuf.dev/

posted on 2025-05-06 08:00  荣锋亮  阅读(33)  评论(0)    收藏  举报

导航