8. 编解码

Example: iterator-go

当前rpcx提供了四种内置的编解码器,你也可以定义你自己的编解码器, 如Avro等:

// SerializeType defines serialization type of payload.
type SerializeType byte
const (
    // SerializeNone uses raw []byte and don't serialize/deserialize
    SerializeNone SerializeType = iota
    // JSON for payload.
    JSON
    // ProtoBuffer for payload.
    ProtoBuffer
    // MsgPack for payload
    MsgPack
)

服务会使用和客户端一样的编解码器,客户端使用JSON, 服务也返回 JSON 格式的数据。 rpcx 默认使用 msgpack 编解码器。

var DefaultOption = Option{
    Retries:        3,
    RPCPath:        share.DefaultRPCPath,
    ConnectTimeout: 10 * time.Second,
    Breaker:        CircuitBreaker,
    SerializeType:  protocol.MsgPack,
    CompressType:   protocol.None,
}

你可以设置你的option, 选择你自己的编解码器:

func NewXClient(servicePath string, failMode FailMode, selectMode SelectMode, discovery ServiceDiscovery, option Option) 
  • SerializeNone:这种编解码器不会对数据进行编解码,并且要求数据是 []byte 类型的数据。
  • JSON:JSON是一个通用的数据交换的格式,可以应用在很多语言中。对性能要求不是非常高的场景,可以使用这种编解码。
  • Protobuf:Example: protobufProtobuf 是一个高性能的编解码器, 由Google出品, 应用在很多项目中。
  • MsgPack:默认的编解码器messagepack 是另外一种高性能的编解码器, 也是跨语言的编解码器。
  • 定制编解码器:这个例子 gob 使用 gob作为编解码器。
下一节:在分布式架构中, 如SOA或者微服务架构,你不能担保服务调用如你所预想的一样好。有时候服务会宕机、网络被挖断、网络变慢等,所以你需要容忍这些状况。