skipper filter 扩展开发
skipper 的扩展包含filter类型的,以及Predicates ,当然script(lua)脚本也是
这次主要是filter类型的开发
filter 接口约定
- 格式
filter 至少需要包含spec&&filter 类型
spec 包含用户初始化filter 必备的参数,spec 必须实现的方法
Name() string
CreateFilter([]interface{}) (filters.Filter,error)
filter 的实现必须满足Filter 接口的
Request(filters.FilterContext)
Response(filters.FilterContext)
对于需要进行资源清理的,使用Close 方法
参考代码模版
type myFilter struct{}
func NewMyFilter() filters.Spec {
return &myFilter{}
}
func (spec *myFilter) Name() string { return "myFilter" }
func (spec *myFilter) CreateFilter(config []interface{}) (filters.Filter, error) {
return NewMyFilter(), nil
}
func (f *myFilter) Request(ctx filters.FilterContext) {
// change data in ctx.Request() for example
}
func (f *myFilter) Response(ctx filters.FilterContext) {
// change data in ctx.Response() for example
}
简单demo
实现比较简单,就是在请求header中添加一个token 值
- 代码位置
直接放到代码的filters目录中

- 代码说明
很简单,就是在response 阶段添加token,如果请求没有token,会自动生成一个,有的话,根据参数校验是否是正确的,进行参数回写
实际上是基于cors的简单改写,没什么实际的意义,就是测试的。
package myfilter
import (
"github.com/zalando/skipper/filters"
)
const (
name = "myfilterToken"
defaultToken = "dalongrong"
)
type basicSpec struct {
}
type filter struct {
allowTokens []string
}
func NewDefaultToken() filters.Spec {
return &basicSpec{}
}
func (a filter) Response(ctx filters.FilterContext) {
if len(a.allowTokens) == 0 {
ctx.Response().Header.Add(defaultToken, "default-rongfengliang")
return
}
token := ctx.Request().Header.Get(defaultToken)
if token == "" {
return
}
for _, o := range a.allowTokens {
if o == token {
ctx.Response().Header.Add(defaultToken, o)
return
}
}
}
// Request is a noop
func (a filter) Request(filters.FilterContext) {}
// CreateFilter takes an optional string array.
// If any argument is not a string, it will return an error
func (spec basicSpec) CreateFilter(args []interface{}) (filters.Filter, error) {
f := &filter{}
for _, a := range args {
if s, ok := a.(string); ok {
f.allowTokens = append(f.allowTokens, s)
} else {
return nil, filters.ErrInvalidFilterParameters
}
}
return f, nil
}
func (spec basicSpec) Name() string { return name }
- 注册filter
buildin代码中添加注册
import (
+ "github.com/zalando/skipper/filters/myfilter"
)
func MakeRegistry() filters.Registry {
+ myfilter.NewDefaultToken(),
构建&&使用
注意有依赖包的问题,注意合理上网
- 构建
make build
- 使用
./bin/skipper -address :9999 -inline-routes 'r: * -> setQuery("lang", "pt")->myfilterToken() -> "http://10.15.0.80"'
- 测试效果

说明
因为新版本使用了golang 的mod 所以会有版本的要求,使用docker 进行构建可能会更方便,其中官方文档有
比较详细的如果开发一个filter,包含测试,文档
参考资料
http://opensource.zalando.com/skipper/reference/development/#how-to-develop-a-filter
https://github.com/rongfengliang/skipper-docker-build
skipper filter 扩展开发的更多相关文章
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- postgres扩展开发
扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...
- Filter高级开发
孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十三)——Filter高级开发 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以 ...
- PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)
今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...
- 关于PHP扩展开发(收藏)
一.Linux shell命令: ls –lh 查看文件大小 du –a 查看文件及文件夹大小 -------------------------- nginx ------------- ...
- DirectShow Filter的开发实践
一.介绍 摄像头图像采集处理在业界有着多种成熟的方案.从老的DirectShow.Grabber技术,到新的Windows Media Foundation框架,网络上都有着丰富的参考资料.OpenC ...
- 【转发】NPAPI学习(Firefox和Chrome扩展开发 )
NPAPI学习(Firefox和Chrome扩展开发 ) 2011-11-08 14:41:02 by [6yang], 1172 visits, 收藏 | 返回 Firefox和Chrome扩展开发 ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- PHP扩展开发相关总结
1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, ...
随机推荐
- (C/C++学习笔记) 一. 基础知识
一. 基础知识 ● 程序和C/C++ 程序: 根据Wirth (1976), Algorithms + Data Structures = Programs. Whence C: 1972, Denn ...
- css经验之谈
//清除浮动 .clear { zoom:1; }.clear:after { content:''; display:block; clear:both; }.fl { float:left; }. ...
- 无法获取 vmci 驱动程序版本: 句柄无效
https://jingyan.baidu.com/article/a3a3f811ea5d2a8da2eb8aa1.html 将 vmci0.present = "TURE" 改 ...
- DevExpress v18.1新版亮点——Data Access篇
用户界面套包DevExpress v18.1日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Data Access v18.1 的新功能,快来下载试用新版本 ...
- MyEclipse教程:使用UML创建模块库——第二部分(一)
MyEclipse 在线订购年终抄底促销!火爆开抢>> [MyEclipse最新版下载] UML2建模文件存储在建模存储库中,建模可用于生成Java代码,或者可以从代码生成模型. 本教程介 ...
- Word2Vec实现原理(Hierarchical Softmax)
由于word2vec有两种改进方法,一种是基于Hierarchical Softmax的,另一种是基于Negative Sampling的.本文关注于基于Hierarchical Softmax的改进 ...
- 使用git下载源码及数据文件
初学git,用来下载github上的数据和源代码,具体步骤如下. 1.百度搜索git并下载:本想从github直接下载安装,无奈国外服务器的下载速度太慢,建议国内的直接搜索下载完整安装版. 2.完成g ...
- ES6 class的继承-学习笔记
1.简介 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多. 子类必须在constructor方法中调用super方法,否则新建实例时会报错. ...
- easyUI 下拉组件转义
<labelclass="label"for="belongWidget">归属组件:</label> <inputid=&quo ...
- Spring Batch框架流程的简单介绍
Spring Batch流程介绍: 上图描绘了Spring Batch的执行过程.说明如下: 每个Batch都会包含一个Job.Job就像一个容器,这个容器里装了若干Step,Batch中实际干活的也 ...