16.1.5 协议声明

当Avro用于RPC时,Avro使用协议描述远程过程调用RPC接口。和模式一样,它们是用JSON文本来定义的。协议是带有以下属性的JSON对象:

protocol,协议名称的字符串(必须)。

namespace,限定名称的可选字符串。

doc,描述协议的可选字符串。

types,指定类型(记录、枚举、固定型和错误)定义的可选列表。错误的定义和记录一样,只不过错误使用"error"而记录使用"record",要注意不允许对指定类型的向前引用。

messages,一个可选的JSON对象,其键是消息名称,值是对象,任意两个消息不能拥有相同的名称。

模式中定义的名称和命名空间规则也同样适用于协议。下面介绍的协议消息可以拥有以下属性:

doc,消息的可选描述。

request,指定的类型化的参数模式列表(这和记录声明中的字段有相同的形式)。

response,响应模式。

error union,所声明的错误模式的联合(可选)。有效的联合会在声明的联合前面加上"string",允许传递未声明的“系统”错误。例如,如果声明的错误联合是["AccessError"],那么有效的联合是["string","AcessError"]。如果没有错误声明,那么有效的错误联合是["string"]。使用有效联合错误可以序列化,且协议的JSON声明只能包含声明过的联合。

one-way,布尔参数(可选)。

处理请求参数列表相当于处理没有名称的记录。既然读取的记录字段列表和写入的记录字段列表可以不同,那么调用者和响应者的请求参数也可以不同,这种区别的解决方法与记录字段间差异的解决方式相同。只有当回应的类型是“null”并且没有错误列出的时候,one-way参数才为真。

下面来举一个简单的HelloWorld协议的例子,它可以定义为:


{

"namespace":"com.acme",//名称的限定

"protocol":"HelloWorld",//协议名称

"doc":"Protocol Greetings",//协议的说明

"types":[

{"name":"Greeting","type":"record","fields":[

{"name":"message","type":"string"}]},

{"name":"Curse","type":"error","fields":[

{"name":"message","type":"string"}]}],

"messages":{//消息

"hello":{

"doc":"Say hello.",

"request":[{"name":"greeting","type":"Greeting"}],

"response":"Greeting",

"errors":["Curse"]

}

}

}