基于docker的apisix网关的java插件开发
基于docker的apisix网关的java插件开发
作者: fitz_i,未经博主允许不得转载。经许可的转载需注明作者和博客主页:https://blog.csdn.net/fitz_i
关于JDK版本
java运行及maven打包环境的jdk 均为jdk11 ,切记!
一、搭建docker环境
在安装目录下,克隆apisix官方的docker示例文件:
git clone https://github.com/apache/apisix-docker.git
拉取后进入
cd apisix-docker/example
可得到以下文件:

二、搭建分层镜像
apisix服务与java插件中通信是基于某个.sock的文件,所以官网给出这样的解释:

这意味着在docker里搭建的apisix容器,同时也需要有java的运行环境,才可以进行java插件的开发。
由于apisix的java插件开发需要继续 jdk11,并且刚才example目录下的docker-comse.yaml中,apisix的基础镜像并没有带jdk,所以这里我们搭建一个新的docker镜像。
前往oracle官网下载jdk-11,并将其拷贝至宿主机,与Dockerfile同级目录。
开始编写Dockerfile文件,来构建一个定制化的镜像。
# 路径自己选择
vim Dockerfile#进入文件后
#依赖镜像名称和ID
FROM apache/apisix:2.13.1-centos
#指定镜像创建者信息
MAINTAINER cisco
#将宿主机的文件拷贝到容器的具体目录中。这里使用ADD,拷贝后自动解压,如果不需要解压,可以使用COPY
ADD jdk-11.0.15_linux-x64_bin.tar.gz /jdk
## 配置jdk环境
ENV JAVA_HOME /jdk/jdk-11.0.15
ENV PATH ${JAVA_HOME}/bin:$PATH
这里选择的镜像源是apache/apisix:2.13.1-centos
最开始使用的是官网的apache/apisix:2.14.1-alpine,由于alpine源的原因, 在后续的开发的时候碰到了一些问题, 这里我们避免后续其他的“坑”,采用centos的。
继续在当前目录构建镜像
docker build -t apisix-jdk11 .

构建成功后,得到一个名为apisix-jdk11:latest的新镜像。返回到example目录,修改docker-compose.yaml内的 apisix镜像名。

执行
docker-compose -f docker-compose.yml up -d
此阶段可检查有无端口冲突,及处理。
查看docker容器运行状态
docker ps -a
无异常即可访问 http://宿主机ip:9000, 访问APISIX DashBoard,进行对应操作及配置。
三、基于Java的Ext-Plugin开发
可参考官网的文档: https://apisix.apache.org/docs/java-plugin-runner/next/development
给插件命名为TestExtPluginDemo,插件属性如下
{"validate_header": "token","rejected_code": "403"
}
在APISIX上配置一个路由/get,指定该路由需要使用的外部插件
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"uri":"/get","plugins":{"ext-plugin-pre-req":{"conf":[{"name":"TestExtPluginDemo","value":"{\"validate_header\":\"token\",\"rejected_code\":\"403\"}"}]}},"upstream":{"nodes":{"httpbin.org:80":1},"type":"roundrobin"}
}
需要注意的是,TestExtPluginDemo 的属性需要经过 json 转义,作为 string 类型进行配置。
(这里上游地址配置为 httpbin.org,方便调试)
克隆apisix-java-plugin-runner项目。
在runner-plugin模块中,org.apache.apisix.plugin.runner.filter的路径下编写插件。

在此路径下创建插件类,需实现PluginFilter接口,其中name()的返回值,将作为apisix的插件名称。
package org.apache.apisix.plugin.runner.filter;import com.google.gson.Gson;
import org.apache.apisix.plugin.runner.HttpRequest;
import org.apache.apisix.plugin.runner.HttpResponse;
import org.apache.logging.log4j.util.Strings;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Description:* @Author: cisco* @Date: 2022/6/22 11:25*/
@Component
public class TestExtPluginDemo implements PluginFilter {@Overridepublic String name() {//此处返回值为插件的名称return "TestExtPluginDemo";}@Overridepublic void filter(HttpRequest request, HttpResponse response, PluginFilterChain chain) {// parse `conf` to jsonString configStr = request.getConfig(this);Gson gson = new Gson();Map<String, Object> conf = new HashMap<>();conf = gson.fromJson(configStr, conf.getClass());// get configuration parametersString token = request.getHeader((String) conf.get("validate_header"));// token verification resultsif (!Strings.isNotBlank(token)) {String rejectedCode = (String) conf.get("rejected_code");response.setStatusCode(Integer.parseInt(rejectedCode));chain.filter(request, response);}chain.filter(request, response);}@Overridepublic List<String> requiredVars() {return null;}@Overridepublic Boolean requiredBody() {return null;}
}
编写完插件后,对项目进行打包。IDEA用户可以直接使用maven工具
./mvnw install
#或者
./mvnw package
然后你会看到dist目录下,生成一个apache-apisix-java-plugin-runner-0.2.0-bin.tar.gz

将其复制到docker的宿主机上,进行解压。再将解压后的jar包通过docker cp命令 复制到 docker容器内部
tar -xvf apache-apisix-java-plugin-runner-0.2.0-bin.tar.gz
docker cp apisix-java-plugin-runner.jar apisix-11:/opt/
修改外部挂载的 APISIX配置文件。位于apisix-docker/exaple/apisix_conf文件夹中的config.yaml
添加如下配置:
ext-plugin:cmd: ['java', '-jar', '/opt/apisix-runner-bin/apisix-java-plugin-runner.jar']
重启docker容器,进行测试。使用之前配置使用此插件的路由。
curl -H 'token: 123456' 192.168.56.102:9080/getcurl 192.168.56.102:9080/get
执行结果如下:

通过返回报文可知,java插件已生效。
觉得本文有用的话 点赞收藏支持一下,谢谢!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
