acl库介绍

上传人:laiq****ong 文档编号:242872001 上传时间:2024-09-10 格式:PPTX 页数:36 大小:542.96KB
返回 下载 相关 举报
acl库介绍_第1页
第1页 / 共36页
acl库介绍_第2页
第2页 / 共36页
acl库介绍_第3页
第3页 / 共36页
点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2013/7/22,#,单击此处编辑母版标题样式,ACL,介绍,-,郑树新,目录,ACL,是什么,ACL,应用场景,ACL,谁在用,ACL,模块划分,ACL,服务器框架,ACL,通信模块,ACL,日志模块,ACL,编程示例,ACL,编译安装,ACL,相关资源,ACL,是什么?,ACL,(全称,Advanced C Library,),是一组跨平台的,C/C+,网络通讯及服务器框架库,目前支持的平台:,Windows/Linux,/,BSD/Solaris/MAC,ACL,还包括网络应用常用的功能库,如:,xml,,,json,,,http,,,icmp,,,dns,,,memcache,,,mime,,,smtp,,,mysql/sqlite,,,handlersocket,,,beanstalk,,多种编码(如:,base64/mime base64,,,urlcode,,,qp,,,hex,,,charset,,,etc,),常用数据结构(如:,hash,,,array,,,ring,,,fifo,,二分块查找,,stack,,,avl,,,etc,),线程池,,etc,ACL,的设计原则:从实用角度 出发,结合常见应用场景,为开发者提供快速开发、稳定可靠的通信框架及服务框架,应用场景,一、服务器编程:,Linux/Unix,平台下常见服务器编程(含,mysql/sqlite,数据库编程),二、网络编程:阻塞方式(,ssl,),/,非阻塞方式(,ssl),,支持常见的通信协议如下:,三、,WIN32,界面相关的网络编程,协议,http,smtp,icmp,memcache,beanstalk,handlersocket,dns,客户端,服务端,谁在用,ACL,?,某财经类网站:行情服务器,缓存服务器等,某企业应用:反垃圾网关,用户认证等,某企业应用:,IM,服务端,邮件服务端等,某些小的团队及个人:游戏服务端、视频服务等,一些爱好者(如淘宝的:, lib_dict:,实现了,KEY-VALUE,的字典式存储库,该库还依赖于,BDB, CDB,以及,tokyocabinet,库,(C,语言),5) lib_tls:,封装了,openssl,库,(C,语言,),6),lib_rpc,:目前仅支持,google protocol-buffer(C+),大量示例:,1,),acl/samples:,主要是,lib_acl /lib_protocol,库的例子,2,),acl/lib_acl_cpp/samples:,主要是,lib_acl_cpp,库的例子,lib_acl,基础库,stdlib,:,配置文件、日志记录、网络,/,文件流读写、内存管理、常用数据结构、字符串处理、目录遍历等,net,:,客户端,/,服务端接口、,DNS,查询、网络套接字、常用,TCP,控制等,aio,:,非阻塞,IO,模块,(,读、写、连接、监听,),master,:,服务器编程框架(进程池模式、多进程多线程模式、多进程非阻塞模式、多进程触发器模式),thread,:,线程、线程池、线程锁等,event,: IO,事件引擎(支持,select,、,poll,、,epoll,、,kqueue,、,devpoll,、,iocp,、,win32,消息,),json/xml,:,支持,josn/xml,编解码,db,:,内存,DB,库、,mysql,客户端库、,zdb,数字,K-V,库,unit_test,:,配置选项驱动的单元测试模块,Lib_acl,结构体全景图,lib_protocol,库,http,协议库:比较完整的,HTTP,协议库,支持,HTTP1.0/1.1,版本数据传输、协议解析等功能,可用于客户端,也可用于服务端;同时支持阻塞及非阻塞方式传输,smtp,协议库,:,客户端传输库,支持,SASL,身份验证,icmp/ping,:,客户端库,支持阻塞及非阻塞方式,lib_acl_cpp,库,stdlib,:,含字符串处理、字符集转换,(Linux,下封装了,iconv,库,,win32,下封装了平台相关库)、,xml/json,编解码、日志、,md5,、,zlib,封装等,stream,:,网络,/,文件流,支持阻塞非阻塞方式及,ssl,加密传输、客户端,/,服务端套接字,http,:,功能丰富的,HTTP,协议库,支持客户端,/,服务端模式,,http cookie/session,管理、类似,Java HttpServlet,编程接口、,HTTP mime,格式等,master,:,服务器框架库,支持进程池,(master_proc,类,),、多进程多线程,(master_threads,类,),、多进程非阻塞,(master_aio),、触发器,(master_trigger),四种服务器方式,mime,:,完整的流式,mime,解析库,含,mime,、,rfc2047,、,rfc822,等格式解析,ipc,:,阻塞非阻塞模式通讯的交互接口,支持,win32,窗口消息,queue,:,磁盘文件队列管理模块,其它常用协议客户端库:,db,:,数据库操作客户端库,(,支持,mysql/sqlite),,支持连接池,memcache,: memcached,协议的客户端库,支持长连接重试,hsocket,: mysqld,的,nosql,插件,handlersocket,的客户端库,支持连接池及连接重试,beanstalk:,消息队列服务,beanstalkd,的客户端库,支持连接池及连接重试,Lib_acl_cpp,功能类全景图,ACL,服务框架,ACL,的服务器框架模块是在,Postfix,的,master,框架基础上改造而来,,Postfix,的服务器框架主要有以下特点:,1,、稳定:主控进程,(master),监控所有子进程的运行状态,子进程异常行为可控,2,、安全:子进程以普通用户身份运行,3,、协作:主控进程与子进程通过管道进行协作,主控进程按需分配新的子进程,4,、资源可控:子进程为半驻留服务方式,可在完成一定任务量或空闲一定时间后主动退出,5,、模块化:每种服务为独立程序,有多个服务器模型根据需要选择,master,主控进程流程图,master,子进程流程图,ACL,服务器框架特点,功能点,Postfix master,acl_master,半驻留服务模式,支持,支持,安全控制,严格的用户权限控制,严格的用户权限控制,配置方式,所有服务配置在同一个配置文件中,一个服务一个配置文件,进程池模式,支持,支持,触发器模式,支持,支持,非阻塞模式,功能一般,功能强大,线程池模式,不支持,支持,在线升级,支持,支持,预启动,不支持,支持,最小进程数控制,不支持,支持,最大进程数控制,支持,支持,监控子进程报警机制,不支持,支持,ACL,服务器框架特点,功能点,Postfix master,acl_master,开发过程调试功能,不太方便,方便(便于使用,valgrind,检查内存问题),客户端连接访问控制,应用自己保证,框架自动支持,单一进程监听多个端口,不支持,支持,单一进程同时监听,TCP,及域套接口,不支持,支持,子进程运行身份控制,支持,支持,日志记录方式,支持,syslog,支持,syslog-ng,;允许用户注册自己的日志处理过程;允许同时写入多个目标日志对象中,子进程崩溃是否允许产生,core,文件,?,通过配置项控制,便于快速消除错误,ACL,通信模块,一、,ACL,的通信模块分类:,1,、处理方式:阻塞式,IO,与非阻塞,IO,2,、处理对象:,TCP,流与文件流,二、,lib_acl(C,库,),及,lib_acl_cpp(C+),1,、,lib_acl: ACL_VSTREAM,为最基础的流对象,(acl_vstream.h, acl_vstream.c),,支持,TCP/,文件流;,ACL_ASTREAM,为非阻塞网络流,(aio,模块,),2,、,lib_acl_cpp: stream,流模块下封装了,lib_acl,库的阻塞,/,非阻塞流模块,同时支持,ssl,加密传输,(,结合,polarssl),三、,ACL,网络流使开发者,1,、不必关心底层复杂冗余的处理细节,2,、常用的读写操作:读指定长度、读一行,(,兼容,n,及,rn),、读标志串、超时读、探测读;写固定长度、按格式写、写一行、写一组数据;阻塞,/,非阻塞读写、加密传输等,ACL,阻塞,IO,流,(C+),ACL,非阻塞,IO,流,(C+),Acl,常用网络应用客户端库,一、常用网络客户端端库,http,、,mysql,、,beanstalk,、,memcache,、,handlersocket,、,smtp,二、客户端库支持长连接及重连功能,(smtp/handlersocket,除外,),三、支持连接池的客户端库:,mysql,、,beanstalk,ACL,日志模块,ACL,分级日志示例,(C,接口,),ACL,分级日志示例,(C+,接口,),ACL,日志输出目标,ACL,分级日志示例,(C,接口,),/,分组日志接口,/*,初始化日志类别记录 *,/,const char *str = 101:2; 103:4; 105:3;,/*,记录所有类别值为,101,级别小于等于,2,、类别值为,102,级别小于等于,4,、类别值为,105,级别小于等于,3,的日志内容 *,/,acl_debug_init(str);,.,/*,下面的日志因符合类别值,101,级别值,= 2,而被记录 *,/,acl_debug(101, 2)(%s(%d): log time: %ld, _FILE_, _LINE_, time(NULL);,/*,下面日志符合类别,105,的记录级别 *,/,acl_debug(105, 1)(%s(%d): log time: %ld, _FILE_, _LINE_, time(NULL);,/*,下面的日志因不符合类别值,103,的记录级别条件而被忽略 *,/,acl_debug(103, 5)(%s(%d): log time: %ld, _FILE_, _LINE_, time(NULL);,/*,下面日志的类别值,102,因不存在而被忽略 *,/,acl_debug(102, 1)(%s(%d): log time: %ld, _FILE_, _LINE_, time(NULL);,/,/,其它的日志记录接口,acl_msg_info,、,acl_msg_warn,、,acl_msg_error,、,acl_msg_fatal,ACL,分级日志示例,(C+,接口,),/,通用日志记录接口,logger(const char* fmt, );,logger_warn(const char* fmt, );,logger_error(const char* fmt, );,logger_fatal(const char* fmt, );,/,分组分级日志记录接口,logger_debug(DEBUG_LABLE, DEBUG_LEVEL, const char* fmt, );,ACL,日志输出目标,一、可以同时输出至多个目标对象,const char *logs = “./log1.log|./log2.log”;,acl_msg_open(logs, “myproc”);,Or,acl:logger_open(logs, “myproc”);,二、可以与,syslog-ng,结合,充分利用,syslog-ng,的特性,const char* logs = “./log1.log|UDP:192.168.1.1:12345|TCP:192.168.1.2:12345”;,三、允许以接口注册方式集成第三方日志库,ACL_API void acl_msg_register(ACL_MSG_OPEN_FN open_fn, ACL_MSG_CLOSE_FN close_fn, ACL_MSG_WRITE_FN write_fn, void *ctx);,ACL,编程示例,一、一个简单的网络客户端,二、一个简单的网络服务端,三、,ACL,线程池示例,四、,ACL,的流式编程示例,五、基于,acl_master,框架服务器程序,一个简单的网络客户端,bool client_request(),const char* addr = “127.0.0.1:8190”; /,服务器地址,(ip:port, domain:port),int conn_timeout = 10, rw_timeout = 30; /,连接超时及读写超时时间,(,秒,),acl:socket_stream conn; /,客户端连接流对象,if (conn.open(addr, conn_timeout, rw_timeout) = false) /,连接服务器,printf(“connect server %s failedrn”, addr);,return false;,if (conn.format(“hello worldrn”) = -1) /,向服务端写入一行数据,printf(“write one line to %s errorrn”, addr);,return false;,acl:string buf; /,缓冲区对象,if (conn.gets(buf, true) = false) /,从服务器读取一行数据,且去除尾部的,n,或,rn,printf(“get line from %s errorrn”, addr);,return false;,return true;,一个简单的网络服务端,void echo_server(),const char* addr = “127.0.0.1:8190”;,acl:server_socket server;,if (server.open(addr) = false) /,监听本地地址,printf(“open addr %s failed(%s)rn”, addr, acl:last_serror();,return false;,while (true) /,循环接收客户端连接,acl:socket_stream* client = server.accept();,if (client = NULL),printf(“server accept failed %srn”,acl:last_serror();,break;,echo_client(*client); /,处理客户端请求,delete client; /,删除客户端,/,处理客户端请求,void,echo_client(acl:socket_stream& client),a,cl:string buf;,/,读一行客户端发来的数据,i,f (client.gets(buf, false) = false),printf(“gets from client errorrn”);,/,向客户端写一行数据,else if (clinet.write(buf) = -1),printf(“write to client errorrn”);,Acl,线程池示例,/*,*,创建半驻留线程池的过程,*,return acl_pthread_pool_t*,新创建的线程池句柄,*,/,static acl_pthread_pool_t *create_thread_pool(void),acl_pthread_pool_t *thr_pool; /*,线程池句柄 *,/,int max_threads = 100; /*,最多并发,100,个线程 *,/,int idle_timeout = 10; /*,每个工作线程空闲,10,秒后自动退出 *,/,acl_pthread_pool_attr_t attr; /*,线程池初始化时的属性 *,/,/*,初始化线程池对象属性 *,/,acl_pthread_pool_attr_init(,acl_pthread_pool_attr_set_threads_limit(,acl_pthread_pool_attr_set_idle_timeout(,/*,创建半驻留线程句柄 *,/,thr_pool = acl_pthread_pool_create(,assert(thr_pool);,return (thr_pool);,/*,子线程执行过程,*/,static void thread_fun(void *arg),char *ptr = (char*) arg;,printf(arg string: %srn, ptr);,free(ptr);,void test(void),acl_pthread_pool_t *thr_pool= create_thread_pool();,char *ptr = strdup(hello world!);,acl_pthread_pool_add(thr_pool, thread_fun, ptr);,acl_pthread_pool_destroy(thr_pool); /,销毁线程池,更简单的创建线程池接口:,/*,*,更简单地创建线程对象的方法,*,param threads_limit int,线程池中最大并发线程数,*,param idle_timeout int,工作线程空闲超时退出时间,(,秒,),,如果为,0,则工作线程永不退出,*,return acl_pthread_pool_t*,如果不为空则表示成功,否则失败,*,/,ACL_API acl_pthread_pool_t *acl_thread_pool_create(int threads_limit, int idle_timeout);,ACL,的流式编程示例,(xml,为例,),acl:xml parser; / xml,解析器,const char* data = “”, *ptr = data;,char buf2;,while (*ptr),buf0 = *ptr;,buf1 = 0;,parser.update(buf); /,每次仅输入部分,xml,数据,ptr+;,/,提取目标结点数据值,const acl:xml_node* node = parser. getFirstElementByTags(“root/tag1”);,if (node != NULL) ,const char* name = (*node)“name”;,if (name != NULL),printf(“name: %srn”, name);,ACL,库中支持流式处理的类,xml,:,xml,数据格式流式解析处理器;,json,:,json,数据格式流式解析处理器;,mime_code/mime_base64/mime_uucode/mime_xxcode/mime_quoted_printable,:邮件数据格式编码,/,解码的流式处理器;,charset_conv,:字符集转码处理器;,zlib_stream,:流式压缩,/,解压处理器;,mime,:邮件,mime,数据的流式解析处理器;,rfc2047,:邮件,mime rfc2047,编码的流式解析处理器;,md5,:,md5,生成器;,stream/,目录下的,IO,输出流处理器;,.,基于,acl_master,框架服务器程序,一、首先根据需求选择服务器模板,1,、进程池模板:一个连接一个进程,优点:安全、稳定,一个进程崩溃最多影响一个客户端连接,不影响其它客户端连接;编程简单,缺点:无法支持高并发,当客户端为慢连接时系统资源浪费严重;无法承担高负载业务,2,、多进程多线程模板:每一个进程由一组线程处理前端客户端连接,优点:支持一定的高并发,线程池中的线程只有当连接有数据时才会被占用;编程简单,缺点:进程崩溃,会导致与之相连的所有连接都被断掉;用户声明的全局变量需要注意线程安全性,3,、多进程非阻塞模板:每一个进程的一个线程可以处理高并发连接,该线程只占一个,CPU,,为了使用多核,可以同时启动多个进程,优点:支持非常高的并发,处理效率最高(就象,nginx),缺点:一个进程崩溃影响所有连接;编程复杂,4,、触发器模板:可以处理一些定时类的业务,服务器程序的快速生成,用,acl,库中提供的服务器生成向导快速生成服务器程序(参考:, conn),中添加业务逻辑,手工运行进行调试:,./echo_server alone,修改,echo_server.cf,配置文件并按文章, all; make install,,则在,dist/include/,下存放,lib_acl, lib_protocol, lib_acl_cpp,三个库的头文件;同时在,dist/lib/linux64|linux32,下存放,lib_acl.a, lib_protocol.a, lib_acl_cpp.a,三个库;在,dist/master/libexec/linux64|linux32,下存放,acl_master,主控程序,二、,windows,下编译,目前支持,vc2003, vc2010, vc2012,三种编译器编译,更多内容请参考:, NULL, 5),的第三个参数设为,1,(即运行一次进程便退出),运行:,valgrind -tool=memcheck -leak-check=yes -v ./echo_server alone,,服务进程输出:,listen on: 127.0.0.1:8888,手工,telnet 127.0.0.1 8888,输入几行数据后退出,如果,valgrind,输出如下结果则证明没有内存问题,ACL,相关资源,ACL,工程下载:, svn,:,svn:/ API,文档:,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!