作者: fitz_i,未经博主允许不得转载。经许可的转载需注明作者和博客主页:https://blog.csdn.net/fitz_i
java运行及maven打包环境的jdk 均为jdk11
,切记!
在安装目录下,克隆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,进行对应操作及配置。
可参考官网的文档: 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 {
@Override
public String name() {
//此处返回值为插件的名称
return "TestExtPluginDemo";
}
@Override
public void filter(HttpRequest request, HttpResponse response, PluginFilterChain chain) {
// parse `conf` to json
String configStr = request.getConfig(this);
Gson gson = new Gson();
Map<String, Object> conf = new HashMap<>();
conf = gson.fromJson(configStr, conf.getClass());
// get configuration parameters
String token = request.getHeader((String) conf.get("validate_header"));
// token verification results
if (!Strings.isNotBlank(token)) {
String rejectedCode = (String) conf.get("rejected_code");
response.setStatusCode(Integer.parseInt(rejectedCode));
chain.filter(request, response);
}
chain.filter(request, response);
}
@Override
public List<String> requiredVars() {
return null;
}
@Override
public 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/get
curl 192.168.56.102:9080/get