简介
Haproxy SPOE(流处理卸载引擎),它是作为HAProxy 1.7中的一项功能添加的。它在HAProxy 1.8和1.9中已经成熟。它提供了一种将实时流量发送到可以处理带外数据的外部程序的方法,该流处理卸载引擎是一种类型的过滤器,让您从HAProxy的访问实时数据。它允许将工作分担给自托管组件。完成工作的组件称为“流处理卸载代理”。它从SPOE过滤器接收数据。数据通过新的基于TCP的二进制协议(称为流处理卸载协议)在过滤器和代理之间交换。简单的来说,就是他可以过滤发送到haproxy的数据,并且可以引用外部服务对该数据进行处理并且可以返回结果。那么它到底有什么用?例如:
你有一个服务A,现在要对A服务进行部分功能的升级,升级后的我们称之为A+,但是为了确保A+是没有错的,那么我们需要指定部分用户分流到A+进行生产环境的测试,其他的用户还是使用服务A,那么再此情况下为了精确的指定那些用户到A+,那么我们就可以使用spoe过滤所有的请求,并且在外部程序中挑选我们要分流到A+的用户,返回给Haproxy。
工作原理
- SPOE:流处理卸载引擎
- SPOP:流处理卸载协议
- SPOA:流处理卸载代理
详细使用
1.在HAProxy配置文件添加配置,这将打开针对特定代理(例如frontend
)或backend
部分的流处理
frontend proxy
filter spoe [engine <name>] config <spoe-config-file>
例如:
frontend main
# ...
filter spoe engine ip-reputation config /Users/user01/volumes/haproxyTest/haproxy-local/spoe.conf
# ...
2.按照第一步配置的<spoe-config-file>创建spoe的配置文件并按照协议添加配置
// 它与您在HAProxy配置文件中设置的过滤器引擎名称匹配, 每个命名引擎都有自己的作用域。
[ip-reputation]
// 该行从文件的一部分开始,该文件定义了引擎与其代理进行通信的方式,Iprep-agent是spoe-agent的名称
spoe-agent iprep-agent
messages get-ip-reputation // 消息类型,消息类型在单独的spoe-message部分中定义
option var-prefix spoe // 定义代理设置变量时使用的前缀
timeout hello 3s
timeout idle 3s
timeout processing 3s
use-backend iprep-servers // spoa使用的backend
spoe-message get-ip-reputation // 定义消息类型
args ip=req.hdr(foo) // args <key>=<value>/args <value>,此实例中我们拿到的是request中header中的foo参数作为消息传递到spoa
event on-frontend-http-request // 告诉引擎何时拦截数据并发送消息。
更多有关spoe的语法配置请参考官方spoe语法文档,从haproxy获取参数请参考args配置
3.在haproxy配置文件中定义spoa的backend
# Backend used by the ip-reputation SPOE
backend iprep-servers
mode tcp
balance roundrobin
timeout connect 5s # greater than hello timeout
timeout server 3s # greater than idle timeout
option spop-check
server agent1 127.0.0.1:8090
4.在haproxy配置中添加配置处理从spoa返回的结果
# 如果返回的值小于20我们使用app2,否则使用默认的app1
use_backend app2 if { var(sess.spoe.ip_score) -m int lt 20 }
default_backend app1
backend app1
mode http
balance roundrobin
server app1 127.0.0.1:8081 check
backend app2
mode http
balance roundrobin
server app2 127.0.0.1:8082 check
- sess:spoa以session模式返回处理结果
- spoe:与spoe配置文件中定义代理变量的前缀相同
- ip_score:spoa代理服务返回值中所起的key的名字
代理代码(Spoa代码)
目前haproxy中已经实现spop协议的代理库开发语言包括: