sogou/srpc

SRPC支持自定义拦截器吗

Chenzqk opened this issue · 11 comments

SRPC支持自定义拦截器吗,比如http请求和回复时先经过过滤器转换后发送

http请求和SRPC项目没有关系吧?

你的需求可以描述得更加详细吗。

构建SRPCServer或者HttpServer时,收到请求类似filter机制 拦截/业务解密等操作后,在经过Echo接口回调上来,SRPC有类似的功能吗

构建SRPCServer或者HttpServer时,收到请求类似filter机制 拦截/业务解密等操作后,在经过Echo接口回调上来,SRPC有类似的功能吗

你需要依据什么过滤呢?IP地址,还是消息内容?需求越具体越好。

以rutorial-17为例,srpc::HttpServer收到请求时,可能会根据数据报文、head信息做token认证,有没有一种机制类似java aop自定义切面机制,可以在回调process前通过回调完成认证流程,然后process中收到的都是认证通过的数据,将两块逻辑隔离

@Chenzqk hi,是支持的,filter就是做这类功能,使用AOP的模式做请求的过滤。

  1. 你可以通过派生RPCFilter,逻辑可以通过:server_begin() / server_end() / client_begin() / client_end()这四个虚函数中选择一个时机去实现。
  2. 它们如名称所示,分别在server 收完消息后process之前、process后回复前等时机做处理。你的需求比较适合写在server_begin()。
  3. 现在已经有trace和metrics功能,它们主要用于收到消息时做些记录、处理完后做一些整理和上报功能,本来也想做个鉴权模块,还没现成的可以给你参考。你可以先参考下trace的实现:https://github.com/sogou/srpc/blob/master/src/module/rpc_trace_filter.h
  4. 上面这些函数的返回值如果是false,理论上框架会终止当前请求的流程,不过由于鉴权模块还没有,所以这个返回值还没判断,如果你需要做filter,我把这个改动加上。

看目前http_server.cc中,只支持RPCModuleTypeTrace和RPCModuleTypeMetrics的filter设置,是只需要自定义RPCModule类型,修改add_filter,然后派生RPCFilter就可以了吗

是的,需要增加一个RPCModule,这个你可以模仿https://github.com/sogou/srpc/blob/master/src/http/http_module.h 加一个,也可以我加,毕竟module比较通用。

一个module代表一种处理切面,而filter代表多种具体做法。以metrics为例子就是采集起始信息,而filter可能可以上报prometheus或者OpenTelemetry,当前这个需求可能filter就是不同的认证方式。

好的,感谢!我这尝试一下看看

@Chenzqk 感谢!感觉你也做过类似的模块,这个需求确实你可以写写看,module是通用的,如果可以的话也欢迎提PR到srpc项目中!

另外又看了下,module如果没有特殊用途,也许用RPCModuleTypeEmpty就可以了。如果module有其他功能,需要被其他filter使用,就需要在框架代码:https://github.com/sogou/srpc/blob/master/src/rpc_basic.h#L140 加一个type,类似于这种:

enum RPCModuleType
{
	RPCModuleTypeEmpty	=  0,
	RPCModuleTypeTrace 	=  1,
	RPCModuleTypeMetrics	=  2,
	RPCModuleTypeLog	=  3,
	RPCModuleTypeAuth	=  4, // 之类的
};

@Chenzqk 感谢!感觉你也做过类似的模块,这个需求确实你可以写写看,module是通用的,如果可以的话也欢迎提PR到srpc项目中!

另外又看了下,module如果没有特殊用途,也许用RPCModuleTypeEmpty就可以了。如果module有其他功能,需要被其他filter使用,就需要在框架代码:https://github.com/sogou/srpc/blob/master/src/rpc_basic.h#L140 加一个type,类似于这种:

enum RPCModuleType
{
	RPCModuleTypeEmpty	=  0,
	RPCModuleTypeTrace 	=  1,
	RPCModuleTypeMetrics	=  2,
	RPCModuleTypeLog	=  3,
	RPCModuleTypeAuth	=  4, // 之类的
};

要不咱们把4定义成Custom算了。

@Chenzqk hi,上述的type已经改了,并且filter的返回值已经可以用来控制处理流程。
加了一个示例,如果有需要可以参考:https://github.com/sogou/srpc/blob/master/tutorial/tutorial-19-custom_filter.cc