Docker部署 apisix 并使用golang插件(自定义鉴权方式)

apisix 使用golang插件(自定义鉴权方式)

1. 安装apisix

1.1 下载部署文件(example目录)

github
百度网盘 提取码: keap

1.2 保存example目录,修改docker-compose.yaml

# 1.修改镜像版本
# 2.启动apisix
# 3.默认账号密码: admin/admin

在这里插入图片描述

调整镜像alpine为centos(后续使用插件需要)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 自定义golang插件

2.1 下载插件

github
百度网盘 提取码: vgnr

在这里插入图片描述

2.2 修改插件

首先进入目录,按照模板增加插件功能(增加自定义逻辑)
增加认证文件
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
在这里插入图片描述

3 使用golang自定义插件

3.1 修改apisix配置文件

进入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)

  1. 增加挂载目录,将的目录映射到apisix中(此处可以只挂在go-runner,我为了方便调试,直接挂载映射整个目录)
  2. 设置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
在这里插入图片描述

3.4 创建路由,并指定插件

  • 可以通过本地curl直接创建,也可以通过页面创建(body内容可以根据情况,自定义一些安全信息认证等功能)

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 结果测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用Docker安装Apisix的步骤: 1. 首先,确保已经安装了Docker。如果没有安装,请参考[Docker官方文档](https://docs.docker.com/engine/install/)进行安装。 2. 打开终端或命令行界面,运行以下命令拉取Apisix镜像: ```shell docker pull apache/apisix ``` 3. 创建一个名为`apisix`的网络,用于Apisix容器和其他容器之间的通信: ```shell docker network create apisix ``` 4. 创建一个名为`apisix`的目录,用于存储Apisix的配置文件和日志: ```shell mkdir -p /usr/local/apisix ``` 5. 在`apisix`目录下创建一个名为`config.yaml`的配置文件,并将以下内容复制到文件中: ```yaml etcd: host: - "http://etcd:2379" ``` 6. 在`apisix`目录下创建一个名为`docker-compose.yaml`的文件,并将以下内容复制到文件中: ```yaml version: '3' services: etcd: image: quay.io/coreos/etcd:v3.4.13 command: etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 networks: - apisix apisix: image: apache/apisix volumes: - /usr/local/apisix:/usr/local/apisix environment: - ETCD_HOSTS=http://etcd:2379 ports: - "9080:9080" - "9443:9443" networks: - apisix networks: apisix: external: true ``` 7. 在终端或命令行界面中,进入`apisix`目录,并运行以下命令启动Apisix容器: ```shell docker-compose up -d ``` 8. 等待一段时间,Apisix容器将会启动并运行。可以通过访问`http://localhost:9080`或`https://localhost:9443`来验证Apisix是否成功安装。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值