4 CHN 12 AOP面向切面编程
ProTankerAlfa edited this page 2024-05-20 01:29:57 -03:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

English | 简体中文

AOP(面向切面编程)是实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离从而使得业务逻辑各部分之间的耦合度降低提高程序的可重用性同时提高了开发的效率。

限于C++语言的特性Drogon没有提供像Spring那样灵活的AOP方案而是一种简单的AOP所有插入点都是内建于框架中的用户可以通过框架的AOP系列接口注册特定的处理程序到插入点上。

内建插入点

Drogon提供了7个插入点供用户使用当应用程序运行至插入点的时候会依次调用用户注册的处理程序Advice。关于插入点的说明如下

  • Beginning: 顾名思义该插入点在程序开始时到达具体地说所有注册在这个插入点上的处理程序会在app().run()方法运行完毕后立即执行。在这个插入点上所有的controllerfilterplugindatabase client 都构建完毕了用户可以在这里得到想要的对象引用或进行一些其他初始化工作该插入点上的advice只运行一次调用类型是void(),注册接口是registerBeginningAdvice;

  • NewConnection: 注册到这个插入点上的处理程序会在每个新TCP连接建立时运行Advice 的调用类型是bool(const trantor::InetAddress &, const trantor::InetAddress &)其中第一个参数是TCP连接的远端地址第二个参数是本地地址注意返回类型是bool如果用户返回false相应的连接将被断开。注册的接口是registerNewConnectionAdvice;

  • HttpResponseCreation: 注册到这个插入点上的处理程序会在每个HTTP Response对象创建时运行Advice的调用类型是void(const HttpResponsePtr &)其中的参数就是新创建的对象用户可以在这个处理程序中对所有Response进行一些统一的操作比如添加某个特殊的header等这个插入点会影响所有的Response包括404或任何drogon内部产生的错误响应也包括应用产生的所有响应。注册的接口是registerHttpResponseCreationAdvice;

  • Sync: 这个插入点的位置在Http请求处理的最前端用户可以在这里通过返回一个非空的Response对象来拦截这个请求Advice调用类型是HttpRequestPtr(const HttpRequestPtr &),注册接口是registerSyncAdvice;

  • Pre-Routing: 这个插入点的位置在框架为客户端的请求寻找相应的处理器之前Advice的调用类型有两个void(const HttpRequestPtr &,AdviceCallback &&,AdviceChainCallback &&)void(const HttpRequestPtr &), 前一个和Filter的doFilter方法的调用类型完全一致实际上它们的运行方式也是一样的请参考中间件和过滤器用户可以通过这种Advice拦截客户端请求或者让它通过后一种调用类型没有拦截能力不过消耗更低如果用户不打算拦截请选择这种 Advice 注册。注册的接口是registerPreRoutingAdvice;

  • Post-Routing: 这个插入点的位置在找到处理器之后和HTTP方法检测及过滤器处理之前Advice的调用类型和上个插入点一致注册接口是registerPostRoutingAdvice;

  • Pre-Handling: 这个插入点的位置在通过了所有过滤器之后和处理器处理之前Advice的调用类型和上个插入点一致注册接口是registerPreHandlingAdvice;

  • Post-Handling: 这个插入点的位置在处理器处理完成生成Response之后和发送给客户端之前Advice的调用类型是oid(const HttpRequestPtr &, const HttpResponsePtr &),注册接口是registerPostHandlingAdvice;

AOP示意图

下图展示了上述的后面四个插入点在HTTP Request处理流程中的位置其中的红色圆点代表插入点绿色的箭头路径都代表异步调用。

13 性能测试