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 扩展开发的更多相关文章

  1. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  2. postgres扩展开发

    扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...

  3. Filter高级开发

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十三)——Filter高级开发 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以 ...

  4. PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)

    今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...

  5. 关于PHP扩展开发(收藏)

    一.Linux shell命令: ls –lh    查看文件大小 du –a    查看文件及文件夹大小 -------------------------- nginx ------------- ...

  6. DirectShow Filter的开发实践

    一.介绍 摄像头图像采集处理在业界有着多种成熟的方案.从老的DirectShow.Grabber技术,到新的Windows Media Foundation框架,网络上都有着丰富的参考资料.OpenC ...

  7. 【转发】NPAPI学习(Firefox和Chrome扩展开发 )

    NPAPI学习(Firefox和Chrome扩展开发 ) 2011-11-08 14:41:02 by [6yang], 1172 visits, 收藏 | 返回 Firefox和Chrome扩展开发 ...

  8. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  9. PHP扩展开发相关总结

    1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, ...

随机推荐

  1. 关于iOS设备的那些事

    首先推荐一个在用的库XYQuick 地址:https://github.com/uxyheaven/XYQuick idfa: 获取方式 [ASIdentifierManager sharedMana ...

  2. DevExpress v18.1新版亮点——DevExtreme篇(一)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExtreme JavaScript Controls v18.1 的新功能 ...

  3. MPX

    Pre-processing: MPX使用的滤波器是自适应性的‘Wiener’ filter.有时甚至不用MPX,因为尽管Wiener 所引起的扰乱是可以忽略的,有时发现滤波并不能很好地提高拾取的精度 ...

  4. SharePoint Framework 把你的客户端web部件连接到SharePoint

    博客地址:http://blog.csdn.net/FoxDave 把你的web部件连接到SharePoint来访问SharePoint中的功能和数据,为终端用户提供更完整的体验.本篇会基于之前构 ...

  5. Final阶段贡献分配规则及实施

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2479] 1.分配规则 final阶段开始,我们经过讨论,决定沿用alpha阶段 ...

  6. java基础学习之抽象类

    以下内容是自己学习后的一个备忘笔记,理解上肯定有很多问题,望有耐心的大神能给予指点,谢谢 定义:抽象是对事物的一个模糊定义,它主要对那些有共性功能但具体实现不同的对象进行抽象,提高代码的复用性和简洁性 ...

  7. C++中数组定义及初始化

    一.一维数组 静态 int array[100]; 定义了数组array,并未对数组进行初始化 静态 int array[100] = {1,2}: 定义并初始化了数组array 动态 int* ar ...

  8. L317 电子烟

    Why it’s so hard to talk about e-cigarette risks A growing proportion of American adults consider va ...

  9. Day1作业及默写

    1.简述变量命名规范 变量由字母, 数字,下划线搭配组合而成 不可以⽤数字开头,更不不能是全数字 不能是pythond的关键字, 这些符号和字母已经被python占⽤, 不可以更改 不要⽤中文 名字要 ...

  10. 爬虫系列5:scrapy动态页面爬取的另一种思路

    前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...