使用Context传递控制消息

ServiceComb提供了Context在微服务之间传递数据。Context是key/value对,只能够使用String类型的数据。由于Context会序列化为json格式并通过HTTP Header传递,因此也不支持ASCII之外的字符,其他字符需要开发者先自行编码再传递。Context在一次请求中,会在请求链上传递,不需要重新设置。access log的trace id等功能都基于这个特性实现的。

场景描述

  • 在认证场景,Edge Service认证通过以后,需要将会话ID、用户名称等信息传递给微服务,实现鉴权等逻辑
  • 灰度发布场景,需要结合自定义的tag实现引流,tag信息需要传递给微服务

使用参考

  • 在Hanlder中获取和设置Context
    Handler包含了Invocation对象,可以直接调用invocation.addContext和invocation.getContext设置。

  • 在服务接口中获取Context
    通过接口注入

  1. public Response cseResponse(InvocationContext c1)

或者

  1. ContextUtils.getInvocationContext()
  • 在Edge Service中设置Context
    通过重载EdgeInvocation
  1. EdgeInvocation edgeInvocation = new EdgeInvocation() {
  2. protected void createInvocation() {
  3. super.createInvocation();
  4. this.invocation.addContext("hello", "world");
  5. }
  6. };