sogou / srpc

RPC framework based on C++ Workflow. Supports SRPC, Baidu bRPC, Tencent tRPC, thrift protocols.
Apache License 2.0
1.95k stars 386 forks source link

SRPC支持自定义拦截器吗 #395

Open Chenzqk opened 4 months ago

Chenzqk commented 4 months ago

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

Barenboim commented 4 months ago

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

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

Chenzqk commented 4 months ago

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

Barenboim commented 4 months ago

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

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

Chenzqk commented 4 months ago

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

holmes1412 commented 4 months ago

@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,我把这个改动加上。
Chenzqk commented 4 months ago

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

holmes1412 commented 4 months ago

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

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

Chenzqk commented 4 months ago

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

holmes1412 commented 4 months ago

@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, // 之类的
};
Barenboim commented 4 months ago

@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算了。

holmes1412 commented 3 months ago

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