Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Chenzqk opened this issue Jul 2, 2024 · 11 comments
Open

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

Chenzqk opened this issue Jul 2, 2024 · 11 comments
Labels
documentation Improvements or additions to documentation

Comments

@Chenzqk
Copy link

Chenzqk commented Jul 2, 2024

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

@Barenboim
Copy link
Contributor

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

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

@Chenzqk
Copy link
Author

Chenzqk commented Jul 2, 2024

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

@Barenboim
Copy link
Contributor

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

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

@Chenzqk
Copy link
Author

Chenzqk commented Jul 2, 2024

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

@holmes1412
Copy link
Contributor

@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
Copy link
Author

Chenzqk commented Jul 2, 2024

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

@holmes1412
Copy link
Contributor

holmes1412 commented Jul 2, 2024

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

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

@Chenzqk
Copy link
Author

Chenzqk commented Jul 2, 2024

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

@Barenboim Barenboim added the documentation Improvements or additions to documentation label Jul 2, 2024
@holmes1412
Copy link
Contributor

holmes1412 commented Jul 2, 2024

@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
Copy link
Contributor

@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
Copy link
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

3 participants