github
百度网盘 提取码: keap
# 1.修改镜像版本
# 2.启动apisix
# 3.默认账号密码: admin/admin
调整镜像alpine为centos(后续使用插件需要)
github
百度网盘 提取码: vgnr
首先进入目录,按照模板增加插件功能(增加自定义逻辑)
增加认证文件
vim cmd/go-runner/plugins/auth.go
package plugins
import (
"encoding/json"
"net/http"
pkgHTTP "github.com/apache/apisix-go-plugin-runner/pkg/http"
"github.com/apache/apisix-go-plugin-runner/pkg/log"
"github.com/apache/apisix-go-plugin-runner/pkg/plugin"
)
func init() {
err := plugin.RegisterPlugin(&Auth{})
if err != nil {
log.Fatalf("failed to register plugin say: %s", err)
}
}
// Auth is a demo to show how to return data directly instead of proxying
// it to the upstream.
type Auth struct {
}
type AuthConf struct {
Body string `json:"body"`
}
// 此处必须实现三个方法Name,ParseConf,Filter
// 主要逻辑在Filter中
func (p *Auth) Name() string {
return "auth"
}
func (p *Auth) ParseConf(in []byte) (interface{}, error) {
conf := AuthConf{}
err := json.Unmarshal(in, &conf)
return conf, err
}
func (p *Auth) Filter(conf interface{}, w http.ResponseWriter, r pkgHTTP.Request) {
// 如果认证通过(不对请求做拦截,直接转发服务),直接return即可,不要 *** 作response对象
// 如果未通过,则可以在response增加http状态码,返回body等拦截返回
// 根据访问path做限制
// 1. 如果path等于/login表示原封不动转发到其他服务
if string(r.Path()) == "/login" {
// 直接return即可转发到路由配置的upstream中
return
// 如果path等于/auth则表示当前接口需要认证
} else if string(r.Path()) == "/auth" {
// 通过http调用内部认证,成功则正常返回,认证失败则返回异常信息,此处示例为认证失败
httpResponseCode := 409
if httpResponseCode == 200 {
// 如果认证接口返回200则认证通过,直接return转发接口
return
// 如果调用认证接口失败,则返回认证失败
} else {
// 不通过则构建响应对象,返回给前端
body := `"code":"409","desc":"auth err"`
// 自定义Header
w.Header().Add("X-Resp-A6-Runner", "Go")
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(409)
_, err := w.Write([]byte(body))
if err != nil {
log.Errorf("failed to write: %s", err)
}
return
}
}
// 其他接口则将path拦截,原封不动返回
w.Header().Add("X-Resp-A6-Runner", "Go")
_, err := w.Write(r.Path())
if err != nil {
log.Errorf("failed to write: %s", err)
}
return
}
2.3 编译插件(需要golang环境)
make build
进入example目录,修改配置文件,增加启动插件命令
cd example
vim apisix_conf/config.yaml
ext-plugin:
cmd: ["/usr/local/apisix/apisix-go-plugin-runner/go-runner", "run"]
3.2 修改apisix的启动文件(docker-compose.yml)
增加挂载目录,将的目录映射到apisix中(此处可以只挂在go-runner,我为了方便调试,直接挂载映射整个目录)设置apisix运行runner的环境变量配置vim docker-compose.yml
# 此处可以直接替换整个apisix配置
apisix:
image: apache/apisix:2.12.1-centos
restart: always
environment:
- APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sock
- APISIX_CONF_EXPIRE_TIME=3600
volumes:
- ./apisix-go-plugin-runner:/usr/local/apisix/apisix-go-plugin-runner
- ./apisix_log:/usr/local/apisix/logs
- ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
depends_on:
- etcd
##network_mode: host
ports:
- "9080:9080/tcp"
- "9091:9091/tcp"
- "9443:9443/tcp"
- "9092:9092/tcp"
networks:
apisix:
3.3 重启程序
docker-compose restart
curl创建
curl http://172.17.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/*",
"name": "auth",
"plugins": {
"ext-plugin-pre-req": {
"conf": [
{"name":"auth", "value":"{\"body\":\"hello\"}"}
]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"www.baidu.com": 1
}
}
}
'
页面创建
最后点击下一步提交即可
登录dashborad查看结果 4 结果测试
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)