dubbo过滤器的使用
- 配置步骤
1. 编写Filter的实现类DubboProviderLogFilter
2. 在SPI生效的目录中编写文件com.roy.config.DubboProviderLogFilter
3. 在我们的服务中配置过滤器
- 具体生产者打印日志的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);
}
}
- 权限过滤器 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
- 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;
}
}