除了HTTP请求层,还可以在哪层实现拦截服务调用参数

问题

做拦截,基于http比如基于那个servelet里面做filter,还是信息上报像springboot,现在这个你想去实现可以用什么方式去实现?

  • 因为通过拦截http请求,http的一些web框架去做的。
  • 如果只是单纯记录一些比如业务信息,这个地方还可以什么方式做么?
  • 这里你想要拿到服务调用参数或者是返回值,是不是一定要在http这层做?
  • 那一开始通过什么方式写到异步队列里呢?可以通过以什么样的方式去做?
  • 比如说像你要去打一些日志?对吧,这种一般通过什么方式去实现?一种是刚才说的可能在web这一层去做拦截,还有可以是怎么做的? 想一下除了基于http拦截,还可以基于什么拦截?

回答

下面给出在各层拦截或记录调用参数/返回值时通常采取的方案及其适用的层次划分:

1. Web 层(HTTP 请求层)

  • 拦截器/过滤器
    • 实现方式:基于 Servlet Filter、Spring MVC 的 HandlerInterceptor、RestTemplate 拦截器或 Feign 拦截器。
    • 适用范围:主要针对外部用户请求或服务调用,记录 HTTP 请求的参数、头信息和响应数据。
    • 主要层次:属于 Web 层,处理客户端到服务端的 HTTP 通信。

2. 业务层(服务层)

  • AOP 切面

    • 实现方式:利用 Spring AOP 在业务方法上应用环绕通知,可捕获方法入参、返回值及异常信息。
    • 适用范围:记录关键业务逻辑的调用信息和参数传递,适用于内部业务处理流程。
    • 主要层次:处在业务层,用于拦截具体业务方法的执行,不依赖具体的传输协议。
  • 自定义包装器(Decorator 模式)

    • 实现方式:在业务调用前后,手动包装调用逻辑来记录和处理输入输出数据。
    • 适用范围:对于某些业务场景可能不希望使用全局 AOP,而采用局部包装方式实现日志记录。
    • 主要层次:同样属于业务层的解决方案。

3. 数据层(持久层)

  • ORM 框架拦截器
    • 实现方式:使用 MyBatis、Hibernate 等提供的拦截机制,记录 SQL 执行前后的参数、SQL 语句和结果。
    • 适用范围:主要用于监控数据库操作、优化 SQL 性能以及记录数据交互细节。
    • 主要层次:归属于数据访问层,对数据库操作进行监控和日志记录。

4. RPC 层(分布式服务调用层)

  • RPC 框架自带的拦截器
    • 实现方式:在调用第三方服务或微服务时,利用 Feign、Dubbo、gRPC 等框架提供的拦截器记录调用参数、链路信息及返回结果。
    • 适用范围:监控分布式系统中服务间的调用,记录跨服务调用的详细日志和上下文信息。
    • 主要层次:属于 RPC 通信层,针对服务间调用进行拦截和日志跟踪。
posted @ 2025-04-20 12:54  kuki'  阅读(29)  评论(0)    收藏  举报