网上大多讲解了dubbo提供者(provider)拦截器的配置方式,却没有对消费端(consumer)端拦截器的使用进行详细说明,本问提供了一个最简的消费端拦截器配置demo。
废话不多说,直接开始
使用消费端拦截器的目的:发送dubbo请求时携带参数,如:appId,token等
直接上代码(新手建议直接拷贝代码,调试成功再重命名)
第一步:检查dubbo依赖版本。注意:dubbo必须时2.7.3以上版本,否则没有ListenableFilter
...... 2.7.3
org.apache.dubbo dubbo-spring-boot-starter2.7.3
第二步:创建过滤器类(xxx.ConsumerFilter)
package xxx;
import com.zdzy.freight.common.InterceptorCom;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
//dubbo消费者拦截器
@Activate(group = CommonConstants.CONSUMER, order = -10000)
public class ConsumerFilter extends ListenableFilter {
@Autowired
InterceptorCom interceptorCom;
public ConsumerFilter() {
super.listener = new ConsumerContextListener();
}
@Override
public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
if (invocation instanceof RpcInvocation) {
((RpcInvocation) invocation).setInvoker(invoker);
}
try {
RpcContext.removeServerContext();
return invoker.invoke(invocation);
} finally {
RpcContext.removeContext();
}
}
static class ConsumerContextListener implements Listener {
@Override
public void onResponse(Result appResponse, Invoker> invoker, Invocation invocation) {
RpcContext.getServerContext().setAttachments(appResponse.getAttachments());
}
@Override
public void onError(Throwable t, Invoker> invoker, Invocation invocation) {
System.out.println("dubbo消费者拦截器发生了异常");
}
}
}
第三步:配置文件(yml)
dubbo
consumer:
filter: consumerFilter
第四步:resource下创建目录(meta-INF.dubbo.internal )和文件(org.apache.dubbo.rpc.Filter),并设置内容为:consumerFilter=xxx.ConsumerFilter
meta-INF / dubbo / internal / org.apache.dubbo.rpc.Filter
经过以上四步,dubbo的消费端拦截器就配置完成



