dubbo过滤器的使用

241 阅读2分钟

dubbo过滤器的使用

  1. 配置步骤
    1. 编写Filter的实现类DubboProviderLogFilter
    2. 在SPI生效的目录中编写文件com.roy.config.DubboProviderLogFilter
    3. 在我们的服务中配置过滤器
  1. 具体生产者打印日志的demo
/**
 * @Description 当我们不配@Activate(group = "provider")的时候需要在serviceBean中配置过滤器
 * @Author roy.ding
 * @Date 2022/10/1 00:22:59
 */
@Activate(group = "provider")
public class DubboProviderLogFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        System.out.println(
                "打印日志:interface:" + invoker.getInterface().getSimpleName() + ";methodName:" + invocation.getMethodName()
                        + ";argument:" + invocation.getArguments());
        Result result = invoker.invoke(invocation);
        System.out.println("打印返回结果");
        System.out.println(result != null ? result.getValue() : "返回结果为空");
        return result;
    }
}
文件内容:
consumerLog=com.roy.config.DubboProviderLogFilter

@Service(filter = "consumerLog")
@Component
public class UserServiceImpl implements UserService {

 
   @Override
   public List<UserAddress> getUserAddressList(String userId) {
      System.out.println("UserServiceImpl2 is invoked.......");
      UserAddress address1 = new UserAddress(1, "江苏省苏州市version1.0", "1", "丁老板", "15371452705", "Y");
      UserAddress address2 = new UserAddress(2, "上海市浦东新区version1.0", "5", "丁老师", "15123452705", "N");
    
      return Arrays.asList(address1,address2);
   }

}
  1. 权限过滤器 3.1 服务消费者端
/**
 * @Description 权限校验的服务消费者端过滤器
 *              为服务消费者提供传递Token的功能
 * @Author roy.ding
 * @Date 2022/10/1 01:19:20
 */
@Activate(group = "consumer",value = "myAuthConsumer")
public class MyAuthConsumerFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        //塞入token
        putToken(invoker,invocation);
        //继续执行调用链
        return invoker.invoke(invocation);
    }

    //校验权限
    public void putToken(Invoker<?> invoker, Invocation invocation){
        String token = invoker.getUrl().getParameter("token");
        invocation.getAttachments().put("token",token);
    }
}


文件的具体配置: myAuthConsumer=com.roy.configuration.MyAuthConsumerFilter

@Service
public class OrderServiceImpl implements OrderService {

   @Reference(timeout = 2000, filter = "myAuthConsumer")
   private UserService userService;
   
   @Override
   public List<UserAddress> initOrder(String userId) {
      System.out.println("用户id:"+userId);
      //1、查询用户的收货地址
      List<UserAddress> addressList = userService.getUserAddressList(userId);
      return addressList;
   }
  
}

3.2 服务生产端

/**
 * @Description 权限校验的服务消费者端过滤器
 *              为服务消费者提供传递Token的功能
 * @Author roy.ding
 * @Date 2022/10/1 01:11:11
 */
@Activate(group = "provider")
public class MyAuthProviderFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        //校验权限
        checkAuth(invoker,invocation);
        //继续执行调用链
        return invoker.invoke(invocation);
    }

    //校验权限
    public void checkAuth(Invoker<?> invoker, Invocation invocation){
        String token = invocation.getAttachment("token");
        System.out.println("token : " + token);
        if(StringUtils.isBlank(token)){
            throw new RpcException("Token is blank.");
        }
    }
}


文件配置: myAuthProviderFilter=com.roy.config.MyAuthProviderFilter

  1. 3中权限过滤器生产端的简写
@Service
public class OrderServiceImpl implements OrderService {


   @Reference(timeout = 2000)
   //@Reference(timeout = 2000, parameters = {"token","320"})
   private UserService userService;
   
 
   @Override
   public List<UserAddress> initOrder(String userId) {
      System.out.println("用户id:"+userId);
      RpcContext.getContext().setAttachment("token","123456");
      //1、查询用户的收货地址
      List<UserAddress> addressList = userService.getUserAddressList(userId);
      return addressList;
   }
  
}