需求
在项目开发过程中使用apisix java插件,ext-plugin-pre-req
对应前置插件,ext-plugin-post-resp
对应后置插件,前置插件中有filter
方法用于记录接口请求信息(请求参数、请求时间等),后置插件中有postFilter
方法用于记录上游服务的响应信息(响应参数、响应时间等),一个请求通过apisix路由匹配,会触发执行java插件,在java插件中记录接口请求日志信息,在高并发的情况下记录日志,就需要将filter
方法和postFilter
方法获取的日志信息串联起来,最终插入到elasticsearch
中,这时就需要一个唯一的request_id
。
核心代码
@Override
public void filter(HttpRequest request, HttpResponse response, PluginFilterChain chain) {
logger.info("【进入前置拦截过滤器】");
String requestId = request.getVars("request_id");
}
@Override
public void postFilter(PostRequest request, PostResponse response, PluginFilterChain chain) {
logger.info("【进入后置拦截过滤器】");
String requestId = request.getVars("request_id");
}
/**
* If you need to fetch some Nginx variables in the current plugin, you will need to declare them in this function.
* @return a list of Nginx variables that need to be called in this plugin
*/
@Override
public List<String> requiredVars() {
List<String> vars = new ArrayList<>();
vars.add("remote_addr");
vars.add("server_port");
vars.add("request_id");
return vars;
}
这里的request_id
是从nginx中获取的。