多态架构通过接口契约、动态绑定和元数据驱动实现协议解耦,统一ProtocolHandler接口及业务语义结构体,各协议适配器仅做翻译,运行时按配置动态路由,并收敛错误模型为AppError。

多态架构在微服务统一数据网关中实现多协议高效适配,核心不是让代码“看起来像多态”,而是用接口契约隔离协议差异、靠运行时动态绑定解耦调度逻辑、借元数据驱动避免硬编码。它把“支持新协议”从改代码变成加配置、加实现类、注册服务三步动作。
定义统一协议抽象接口
所有协议必须收敛到同一套业务语义接口,不暴露传输细节:
- 声明ProtocolHandler接口,含handle(RequestContext)和formatResponse(Resp)两个方法,参数与返回值均为纯业务结构体(如UserQueryReq、OrderResult)
- 禁止在接口中出现http.Status、grpc.Code、mqtt.QoS等协议专属字段
- RequestContext封装traceID、userID、locale等跨协议通用上下文,由各适配器在入口注入
为每种协议构建轻量适配器
每个协议对应一个独立实现类,只做“翻译”,不掺业务逻辑:
- HTTPAdapter:解析*http.Request → 构造UserQueryReq → 调用service.Query() → 将OrderResult序列化为JSON并写入http.ResponseWriter
- GRPCAdapter:实现UserServiceServer接口 → 把pb.UserQueryRequest转为UserQueryReq → 调用相同service → 错误统一映射为status.Errorf(codes.InvalidArgument, ...)
- MQTTAdapter:监听主题,收到原始payload后交由MessageTranslator转成标准UserQueryReq → 执行service → 将结果按MQTT规范封装并发布
运行时按协议类型动态路由
网关不写if protocol == "grpc",而靠策略工厂+配置中心完成精准分发:
- 启动时从Nacos/Apollo加载协议启用列表:http: {enabled: true, port: 8080}、mqtt: {enabled: true, broker: "tcp://127.0.0.1:1883"}
- 定义ProtocolFactory,根据请求头X-Protocol或路径前缀(如/grpc/)获取对应ProtocolHandler实例
- Spring中用@Primary标注默认handler,其他通过Map<String, ProtocolHandler>注入,避免@Qualifier硬绑定
共享错误模型与可观测性
不同协议对错误的表达方式不同,需统一收敛再映射:
- 定义AppError结构体,含Code(业务码)、HTTPStatus、GRPCCode、MQTTReasonCode
- service层只抛出AppError,绝不返回errors.New("xxx")或fmt.Errorf
- 各adapter根据自身协议选择对应字段:HTTP返回HTTPStatus + JSON body;gRPC返回GRPCCode + detail;MQTT发布带reason code的CONNACK或PUBACK

















