news 2026/5/24 6:23:06

9.2 太牛了!通用消息协议竟然这样设计?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
9.2 太牛了!通用消息协议竟然这样设计?

太牛了!通用消息协议竟然这样设计?

在WebSocket网关中,设计一个通用、灵活且高效的消息协议是至关重要的。一个好的消息协议不仅要满足当前业务需求,还要具备良好的扩展性,以适应未来可能的变化。本章将深入探讨如何设计一个优秀的通用消息协议。

1. 消息协议设计原则

设计消息协议时需要遵循一些基本原则,以确保协议的健壮性和可维护性。

1.1 设计目标

// ProtocolDesignGoals 协议设计目标typeProtocolDesignGoalsstruct{// 简单性 - 协议应该易于理解和实现Simplicitybool// 扩展性 - 协议应该支持未来的扩展Extensibilitybool// 兼容性 - 协议应该向后兼容Compatibilitybool// 高效性 - 协议应该具有较小的传输开销Efficiencybool// 可靠性 - 协议应该支持可靠的消息传输Reliabilitybool}

1.2 消息结构设计

// GenericMessage 通用消息结构typeGenericMessagestruct{// 消息ID,用于唯一标识一条消息IDstring`json:"id"`// 消息类型,区分不同种类的消息Typestring`json:"type"`// 消息路由,指示消息的处理路径Routestring`json:"route"`// 时间戳,记录消息的创建时间Timestamp time.Time`json:"timestamp"`// 发送者信息Sender*MessageSender`json:"sender,omitempty"`// 接收者信息Recipient*MessageRecipient`json:"recipient,omitempty"`// 消息体,包含具体的消息内容Payload json.RawMessage`json:"payload"`// 元数据,包含消息的附加信息Metadatamap[string]interface{}`json:"metadata,omitempty"`// 扩展字段,用于协议扩展Extensionsmap[string]interface{}`json:"extensions,omitempty"`}// MessageSender 消息发送者typeMessageSenderstruct{IDstring`json:"id"`Typestring`json:"type"`// user, system, serviceNamestring`json:"name,omitempty"`}// MessageRecipient 消息接收者typeMessageRecipientstruct{IDstring`json:"id"`Typestring`json:"type"`// user, group, broadcastNamestring`json:"name,omitempty"`}// MessageType 消息类型常量const(MessageTypeRequest="request"// 请求消息MessageTypeResponse="response"// 响应消息MessageTypeEvent="event"// 事件消息MessageTypeCommand="command"// 命令消息MessageTypeAck="ack"// 确认消息MessageTypeError="error"// 错误消息)

2. 协议编解码实现

实现高效的编解码机制是消息协议的核心部分。

2.1 消息编解码器

// MessageCodec 消息编解码器接口typeMessageCodecinterface{Encode(msg*GenericMessage)([]byte,error)Decode(data[]byte)(*GenericMessage,error)}// JSONMessageCodec JSON消息编解码器typeJSONMessageCodecstruct{}// NewJSONMessageCodec 创建JSON消息编解码器funcNewJSONMessageCodec()*JSONMessageCodec{return&JSONMessageCodec{}}// Encode 编码消息func(jmc*JSONMessageCodec)Encode(msg*GenericMessage)([]byte,error){returnjson.Marshal(msg)}// Decode 解码消息func(jmc*JSONMessageCodec)Decode(data[]byte)(*GenericMessage,error){varmsg GenericMessage err:=json.Unmarshal(data,&msg)iferr!=nil{returnnil,fmt.Errorf("failed to unmarshal message: %w",err)}return&msg,nil}// ProtoMessageCodec Protocol Buffers消息编解码器typeProtoMessageCodecstruct{}// NewProtoMessageCodec 创建Protocol Buffers消息编解码器funcNewProtoMessageCodec()*ProtoMessageCodec{return&ProtoMessageCodec{}}// Encode 编码消息func(pmc*ProtoMessageCodec)Encode(msg*GenericMessage)([]byte,error){// 转换为Protocol Buffers格式protoMsg:=&pb.Message{Id:msg.ID,Type:msg.Type,Route:msg.Route,Timestamp:msg.Timestamp.UnixNano(),Payload:[]byte(msg.Payload),}ifmsg.Sender!=nil{protoMsg.Sender=&pb.Sender{Id:msg.Sender.ID,Type:msg.Sender.Type,Name:msg.Sender.Name,}}ifmsg.Recipient!=nil{protoMsg.Recipient=&pb.Recipient{Id:msg.Recipient.ID,Type:msg.Recipient.Type,Name:msg.Recipient.Name,}}ifmsg.Metadata!=nil{metadataBytes,err:=json.Marshal(msg.Metadata)iferr!=nil{returnnil,fmt.Errorf("failed to marshal metadata: %w",err)}protoMsg.Metadata=metadataBytes}returnproto.Marshal(protoMsg)}// Decode 解码消息func(pmc*ProtoMessageCodec)Decode(data[]byte)(*GenericMessage,error){varprotoMsg pb.Message err:=proto.Unmarshal(data,&protoMsg)iferr!=nil{returnnil,fmt.Errorf("failed to unmarshal protobuf message: %w",err)}msg:=&GenericMessage{ID:protoMsg.Id,Type:protoMsg.Type,Route:protoMsg.Route,Timestamp:time.Unix(0,protoMsg.Timestamp),Payload:json.RawMessage(protoMsg.Payload),}ifprotoMsg.Sender!=nil{msg.Sender=&MessageSender
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 19:22:36

Spring Boot 3 步完成日志脱敏,简单实用~

在我们写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的。对于日志脱敏的方式有很多,常见的有:①使用conversionRule标签,继承MessageConverter ②书写一个脱敏工具类,在打印日志…

作者头像 李华
网站建设 2026/5/23 19:22:10

12.2 太牛了!批量传输技术竟然还能这样用?

太牛了!批量传输技术竟然还能这样用? 在WebSocket网关中,批量传输技术是提升系统吞吐量和降低网络开销的重要手段。通过将多个小消息合并为一个大消息进行传输,可以显著减少网络交互次数,提高传输效率。本章将深入探讨批量传输技术的实现原理和应用场景。 1. 批量传输概…

作者头像 李华
网站建设 2026/5/23 19:22:11

Spring AI Embedding 实战:从语义搜索到商品推荐系统

Spring AI Embedding 实战:从语义搜索到商品推荐系统 关键词:Spring AI / Embedding / 向量数据库 / PGVector / 推荐系统 / RAG 一、什么是 Spring AI Embedding Spring AI 中的 Embedding 技术核心在于将文本、图像等非结构化数据转化为高维向量(即 Embedding)。这些向量…

作者头像 李华
网站建设 2026/5/23 19:22:36

16.1 批量任务调度和心跳优化竟然还能这样做?

16.1 太震撼了!批量任务调度和心跳优化竟然还能这样做? 在分布式任务调度系统中,性能优化是确保系统能够处理大规模任务的关键。今天我们将深入探讨批量任务调度和心跳优化技术,这些技术能够显著提升系统的吞吐量和响应速度。 批量任务调度机制 批量任务调度是提升系统性…

作者头像 李华
网站建设 2026/5/23 19:30:52

java juc 01 进程与线程

进程和线程的概念 并行和并发的概念 线程基本应用ps :随便写写,今天就是开个新章对比维度进程(Process)线程(Thread)基本概念程序运行时的一个实例,用来加载指令、管理内存、管理 IO进程内部的一…

作者头像 李华
网站建设 2026/5/21 14:43:10

Ella陈嘉桦「艾拉主意」巡演南宁站两晚连唱 现场嗦粉打造出圈名场面

Ella 陈嘉桦「It’s Me 艾拉主意」巡演继长沙、杭州、广州、上海站后,持续保持场场秒罄、口碑爆棚的火爆势头。2026年2月7日至8日,这场音乐盛宴落地绿城南宁,于广西体育中心体育馆一连两晚盛大开唱。其中2月8日场是整轮巡演中的第十场演出&am…

作者头像 李华