dubbo中的隐式参数

/ Dubbo / 2 条评论 / 597浏览

在dubbo中的服务提供方和服务调用方可以通过隐式参数进行传参,在某些场景中还是比较有用的。由于功能比较简单,下面我们看一下具体的代码。

UserInfoImpl:

/**
 * 接口实现类
 */
@Service
public class UserInfoImpl implements UserInfoService {

  public UserInfo getUserInfo(String name) {
    System.out.println(String.format("jilinwula: %s", RpcContext.getContext().getAttachment("jilinwula")));
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername(name);
    userInfo.setPassword("jilinwula");
    return userInfo;
  }

}

Consumer:

/**
 * 服务调用方
 */
public class Consumer {

  public static void main(String[] args) throws Exception {

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
        new String[]{"consumer.xml"});
    context.start();

    UserInfoService userInfoService = context.getBean("helloWorld", UserInfoService.class);

    RpcContext.getContext().setAttachment("jilinwula", "jilinwula.com");

    System.out.println(userInfoService.getUserInfo("吉林乌拉"));

  }
}

服务提供方日志:

2018-08-02 23:19:41:811DEBUG [ProductBossService,org.springframework.beans.factory.support.AbstractBeanFactory,251]: Returning cached instance of singleton bean 'lifecycleProcessor'
token:jilinwula.com
2018-08-02 23:20:10:620 WARN [ProductBossService,com.alibaba.dubbo.remoting.transport.AbstractServer,200]:  [DUBBO] All clients has discontected from /192.168.0.4:20880. You can graceful shutdown now., dubbo version: 2.6.0, current host: 127.0.0.1

备注:虽然服务提供方已经成功显示了服务调用方传递的参数,但有2点要注意,就是RpcContext参数设置必须在调方方法之前设置否则服务提供方是获取不到参数值的,另外有一点要注意的就是 dubbo框架预留了很多保留字段,我们在使用RpcContext传参时不要使用保留字段,否则服务提供方也是获取不到参数的。dubbo中的保留参数有:path、group、version、token、timeout等。

  1. ConsumerContextFilter会在调用后把附加参数清空。

    回复
    1. @是非

      谢谢指导,有关dubbo源码方面还没有看,准备先把基础使用掌握了, 在深入源码。

      回复