1.3 上下文对象
上下文对象
上下文对象(Context
)是一个类似于 Map<String, Object>
的结构,用户可以用字符串做 Key
,放入任何类型的数据。因为该对象不需要在客户端和服务端进行传输,所以它当中存放的数据,不必是可序列化类型。
上下文对象具有判断某个 Key
是否存在的功能,但是在不同语言实现时,可以根据各自语言的特性在语法或方法命名上有所不同。
上下文对象还应具有一个 clone
方法,该方法名在大小写上,可以根据不同语言有所区别。
在调用中,每个调用都具有自己独立的上下文对象,
客户端上下文对象(ClientContext
)继承自上下文对象(Context
),它在客户端进行调用前由用户创建,或者在客户端进行调用时被自动创建,也就是从客户端调用的入口处被创建。它增加了一些专属于客户端的属性,例如:
- 客户端对象(
client
) - 服务地址(
uri
) - 调用返回值类型(
returnType
) - 调用超时时长(
timeout
) - 请求头部(
requestHeaders
) - 响应头部(
responseHeaders
)
每种语言在实现时,这些属性在命名上可能会有大小写上的区别。
在插件处理器中,可以通过调用原始上下文对象上的 clone
方法创建多个上下文对象副本,然后通过修改副本上下文对象上的服务地址(uri
)属性,将一个调用变为对多个不同服务的调用。
服务端上下文对象(ServiceContext
)也继承自上下文对象(Context
),它在服务端由 Handler
对象创建,也就是在服务端的入口处被创建。它增加了一些专属于服务端的属性,例如:
- 服务对象(
service
) - 服务处理器对象(
handler
) - 服务方法(
method
) - 客户端地址(
remoteAddress
) - 服务端地址(
localAddress
) - 请求头部(
requestHeaders
) - 响应头部(
responseHeaders
)
每种语言在实现时,这些属性在命名上可能会有大小写上的区别。其中客户端地址和服务端地址属性在不同的语言中因为类型差别较大,所以命名上没有统一要求。
从上面的描述中我们可以看到,不论客户端还是服务端的上下文对象中,都包含有请求头部(requestHeaders
)和响应头部(responseHeaders
)这两个属性。这两个属性比较特殊,它们也是一个类似于 Map<String, Object>
的类型,但是客户端的请求头部(requestHeaders
)会跟随请求一起发送给服务端,而服务端的响应头部(responseHeaders
)会跟随响应一起发送给客户端,因此,这两个属性中添加的数据必须是可序列化的类型。
用户也可以自定义上下文对象类型,但是必须继承自客户端上下文对象(ClientContext
)或服务端上下文对象(ServiceContext
)。自定义上下文对象类型可以在插件处理器中对现有的上下文对象进行包装然后传递到下一层去。但是通常不需要这样做,直接使用 key-value
方式在现有上下文对象中存取用户数据是更通用的做法。