本文主要总结Elasticsearch 自定义 REST 接口的插件开发流程。
本插件逻辑比较简单,主要用来返回包含指定前缀的节点列表。
插件主要包括两部分的内容,一部分用来对插件的注册,另一部分负责对业务逻辑的处理
插件注册部分:
public class CustomerRestActionPlugin extends Plugin implements ActionPlugin {
public CustomerRestActionPlugin(){
super();
System.out.println("Plugin for node name search");
}
@Override
public List<Class extends RestHandler>> getRestHandlers() {
return Collections.singletonList(CustomerRestAction.class);
}
}
业务逻辑处理部分:
@Override
protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient nodeClient) throws IOException {
final String nodePrefix = restRequest.param("prefix", "");
return (channel) -> {
nodeClient.admin().cluster().prepareNodesInfo().all().execute(new RestBuilderListener(channel) {
@Override
public RestResponse buildResponse(NodesInfoResponse nodesInfoResponse, XContentBuilder xContentBuilder) throws Exception {
List nodes = new ArrayList();
for (NodeInfo nodeInfo : nodesInfoResponse.getNodes()) {
if (nodePrefix.isEmpty()) {
nodes.add(nodeInfo.getNode().getName());
} else if (nodeInfo.getNode().getName().startsWith(nodePrefix)) {
nodes.add(nodeInfo.getNode().getName());
}
}
xContentBuilder.startObject().field("nodes", nodes).endObject();
return new BytesRestResponse(RestStatus.OK, xContentBuilder);
}
});
};
}
通过以下命令生成压缩包,压缩包中主要包括jar文件,配置文件等。
mvn clean package
通过执行该命令,在target/release目录下会生成名称为elasticsearch-esext-5.1.1.zip的压缩包
执行已下命令,查看返回结果
curl -XGET 'localhost:9200/_masting/nodes?prefix=test'
完整代码,可从 https://github.com/Eric-aihua/esext.git 获取