acl 3.5.0 發佈,跨平臺網絡通信與服務器開發框架

acl 包括以下豐富的常用函數庫:

1、服務器框架:包括進程池模式、線程池模式、非阻塞模式、UDP通信模式、觸發器模式以及協程模式

2、網絡通信庫:阻塞/非阻塞網絡 IO 庫(其中 lib_acl_cpp 庫通過嵌入 polarssl 而具備了 SSL 通信能力)

3、HTTP 網絡庫:HTTP 客戶端/服務端庫,HTTP 服務端支持 HttpServlet 接口訪問方式;支持 HTTP cookies/session;HTTP 客戶端支持連接池及連接池集群;支持 Websocket

4、redis 客戶端庫:實現了 redis 客戶端命令中 12 個大類中的總共 150 多個命令,支持連接池及集群連接池方式

5、常見網絡應用庫: SMTP 客戶端庫/PING 庫/DNS 解析庫/memcache 客戶端庫/handler socket 客戶端庫/beanstalk 客戶端庫/disque 客戶端庫

6、郵件解析庫:mime解析庫/RFC2047/RFC2048/mime base64/mime qp/mime uucode 等

7、事件引擎:支持 select、poll(for unix)、epoll(for linux)、kqueue(for bsd)、devpoll(for solaris)、iocp(for win32)、win32 窗口消息(for win32)事件引擎

8、通用連接池庫:高效的連接池基礎類庫,支持豐富的功能

9、數據庫客戶端庫:對原生的數據庫客戶端庫進行了二次封裝,使編程更為簡易,功能更為豐富,支持連接池及連接池集群管理功能

10、xml/json 流式解析庫:區別於網上其它已有的 xml/json 解析庫,acl 中的 xml/json 解析庫採用有限狀態機方式解析數據,處理方式更為靈活

11、網絡協程庫:該庫將阻塞 IO 模式在底層通過上下文切換和事件觸發方式轉變為非阻塞模式,從而方便程序員快速編寫高併發、高性能的網絡服務

12、支持將 C++ struct 對象序列化與反序列化(序列化為 Json 對象及由 Json 對象反序列化)

示例:

1、lib_acl/samples: 該目錄下有大量的基於 lib_acl C 庫的示例

2、lib_protocol/samples: 該目錄下有大量的基於 lib_protocol C 庫的示例

3、lib_acl_cpp/samples: 該目錄下有大量的基於 lib_acl_cpp C++ 庫的示例

4、lib_fiber/samples:該目錄下有大量的基於協程的網絡客戶端/服務端示例

應用:

1、app/master: 該目錄為 acl 服務容器(acl_master)及常用工具

2、app/redis_tools: 該目錄下為 redis 集群管理、監控及智能創建工具

3、app/wizard:用來自動生成 acl 服務器框架的嚮導程序

4、app/master_dispatch:用於管理和分發客戶端連接的服務程序

5、app/gid:用來產生全局唯一整型 ID 的服務程序及客戶端庫

6、app/wizard_demo:為一些服務器測試程序

7、app/gson:json 序列化及反序列化代碼生成工具

本次升級為大版本升級,主要有以下改進:

1、網絡協程庫功能更加豐富、更加穩定,具備應用於複雜業務場景的能力;

2、完全支持 IPV6,內部自動識別 IPV4/IPV6 環境並自動適配;

3、Redis 客戶端庫支持 Redis5 stream 功能;

4、支持使用 Android Studio 3.3.2。

此外,還包括大量的新功能特性及問題修復。具體內容如下:

一、基礎 C 庫:lib_acl

.feature: acl_scan_dir.c 在掃描過程中為每個目錄添加目錄屬性,以便於應用可以獲得目錄的訪問時間等屬性

.feature: acl_scan_dir.c 中在掃描目錄過程中,如果遇到出錯情況則會繼續掃描下一個,以免提前結束掃描

.feature: acl_scan_dir.c 增加掃描過程中刪除空目錄功能,例子參照:scan_rmdir

.feature: acl_udp_server.c 增加配置項 udp_fatal_on_bind_err 來決定當無法綁定地址時,進程是否需要自動崩潰

.feature: acl_aio_server.c, acl_single_server.c, acl_threads_server.c, acl_trigger_server.c, acl_udp_server.c 支持進程崩潰時所產生 core 文件的大小,以及進程退出前可禁止產生 core 文件

.feature: acl_udp_server.c 可以通過配置項 master_reuseport 決定是否需要綁定地址

.feature: acl_bind_udp() 在綁定 UNIX 域套接口時不再需要有 @udp 後綴,內部會自動進行判斷是否是 UNIX 域套接口

.feature: 新增函數 acl_socket_alive 用來檢測所給套接字是否正常

.feature: 當創建監聽套接口時通過新增標誌位 ACL_INET_FLAG_EXCLUSIVE 來控制是否禁止地址複用,默認是允許地址複用

.feature: acl_cache2.c 中 acl_cache2_enter 在添加新元素時,如果緩衝區滿則按 LRU 算法將最老的元素刪除,以保證緩衝區空間大小

.feature: 網絡通信及域名解析全面支持 IPV6!

.bugfix: acl_threads_server.c,在 client_wakeup() 中調用 acl_access_permit() 時如果該函數返回 0 後再調用 ctx->serv_close() 時會導致服務崩潰,原因是調用 serv_close 中的參數順序不對

.bugfix: acl_udp_server.c 中 server_binding 綁定失敗時不應放在事件監控中

.bugfix: acl_json_utio.c, acl_json_build() 當數組成員為字符串類型時,應允許空串的存在

.bugfix: acl_udp_server.c, server_open() 在打開多個流對象時未將數組索引遞增,導致無法綁定多個地址

.bugfix: acl_inet_connect.c 中 acl_inet_connect_ex 函數不支持地址為域名

.bugfix: acl_host_port.c 中不支持只有 port 的解析方式

.bugfix: acl_cache2.c 中 acl_cache2_update 的過期時間添加有誤

.bugfix: acl_ifconf.c 中的 acl_ifconf_search 修正幾處地址匹配模式問題

.bugfix: acl_json_parse.c 在分析 Json 數據時,針對字符串對象,如果字符串值的開始部分為空格,則會被過濾掉,此問題已修復

.bugfix: acl_json_parse.c 不能處理空數組的情況

.bugfix: acl_write_wait.c 中使用 poll 方法時,針對 POLLHUP, POLLERR 應直接返回正常,讓 write 函數觸發異常行為

二、基礎網絡協議庫:lib_protocol

三、c++ 庫:lib_acl_cpp

.feature: scan_dir.cpp 增加刪除空目錄功能

.feature: thread::start() 增加同步啟動線程的控制參數;在異步創建線程時,如果創建者想通過 thread::thread_id() 獲得新線程的線程 ID 號時,原來的方式還有等待過程導致 1 秒延遲返回,現在通過 tbox 方式可以"立即"獲得線程 ID 號

.feature: http_request/http_client 類以 socket_stream 為參數的構造方法中,增加控制參數 stream_fixed,決定當對象銷燬時是否自動將 socket_stream 對象一起銷燬

.feature: connect_pool 支持放置非自己創建的連接對象,同時支持在 peek 連接時,僅從已有的連接中提取而不是創建新的連接

.feature: connect_manager 連接池管理器可以更好地支持協程的多線程模式,使用者僅需調用 connect_manager::bind_thread(true) 即可

.feature: redis_stream 功能模塊支持 Redis5 stream 功能

.feature: master_thread.cpp 增加 task_qlen() 方便用戶獲得當前線程池任務隊列中積壓的任務數; 增 threads_pool() 方法用來獲得 lib_acl C 庫中的線程池句柄

.feature: redis_client, redis_client_pool 在非集群模式下創建連接時自動選擇db

.feature: websocket::send_frame_data 在被循環調用時需檢查長度是否一致,且需要根據實際寫入的幀長度設置掩碼

.feature: server_socket 構造方法分開多個,避免使用時產生歧義

.feature: master_udp 增加 proc_on_unbind 虛方法,用於當套接口關閉前的回調

.feature: acl::string 添加 end_with 方法

.feature: server_socket 類的構造函數中新增標誌位 OPEN_FLAG_EXCLUSIVE 用來控制創建監聽套接口是否禁止地址複用,缺省是允許地址複用

.feature: acl::socket_stream 增加 sock_type 來判斷 socket 類型

.feature: 添加 sqlite_cursor 類,從而使 db_sqlite 支持 Sqlite 遊標功能

.feature: 添加 token_tree 類,該類封裝了 C 版的 256 叉匹配樹算法

.feature: tbox 模板類允許傳遞空消息對象

.feature: acl::string 支持更多與 std::string 之間的互相操作

.feature: acl::fstream 增加文件鎖方法

.feature: tbox 類完全由 C++ 模板類實現,不再依賴於 C 版中的消息隊列,代碼更簡潔清晰

.feature: thread_cond 類中的 wait 方法參加參數 locked,內部會先判斷該參數決定是否需要加鎖

.feature: connect_monitor 類增加三個虛方法:on_connected, on_refused, on_timeout

.feature: redis_client_cluster 增加新方法 get_password/get_passwords

.feature: connect_manager 增加 check_idle 用來檢測並釋放過期空閒連接

.bugfix: scan_dir.cpp 當掃描的節點為目錄時給的路徑有誤

.bugfix: connect_manager::check_idle() 當 pools_size 為 0 時應該直接返回

.bugfix: websocket::read_frame_data 被循環調用時,掩碼使用方式有誤

.bugfix: WebSocketServlet.cpp 中有多個成員變量未初始化

.bugfix: master_aio/master_threads 在添加 server_socket 時,應該加鎖

.bugfix: master_udp::service_on_bind 被多線程同時調用時,需要對成員變量 sstream_ 加鎖保護

.bugfix: db_mysql.cpp, 如果在執行操作的時候,發現跟mysql已經斷開鏈接了,就會重連,萬一在連接時間內都沒有重連成功,就會釋放掉MYSQL*指針,造成這個連接對象永不可用了。因為dbmysql::sane_mysql_query函數判斷conn_為null就直接返回了

--- young_hb

.bugfix: gson_helper.ipp 在處理空數組時有誤

.bugfix: json 序列化工具對 double/float 類型且值不帶小數部分時的支持不夠完善,通過在 acl::json_node::is_double 增加針對整數的支持得以解決

.bugfix: acl::HttpServlet 當 session 對象內部創建時,需在析構函數里將其釋放,否則會造成內存洩露

.bugfix: acl::thread 線程對象被創建時,默認採用非分離狀態,以便於和操作系統的 API 行為相近,原來採用的是分離狀態

.bugfix: redis_key::renamenx 返回值類型有誤

四、網絡協程庫:lib_fiber

.feature: 增加 tcp_keeper 類用來預創建 TCP 連接及連接保持,減少 TCP 三次握手造成的時延影響

.feature: 添加 fiber_cond.c 可用於協程和線程之間的條件變量

.feature: fiber_event.c 增加控制參數,可用於協程之間、線程之間及協程與線程之間的互斥

.feature: fiber_server.c 支持所生成 core 文件的大小及進程退出時不產生 core

.feature: 增加 fiber_tbox 類,可以在協程之間、線程之間及協程與線程之間傳遞對象

.bugfix: acl_fiber_cond.c 中 acl_fiber_cond_timedwait 和 acl_fiber_cond_wait 在釋放 fbase 對象時,必須在調用 acl_fiber_event_wait 之前,否則會引起句柄被

提前關閉問題

.bugfix: acl_fiber_cond.c 中如果多個線程調用同一個條件變量的的 acl_fiber_cond_timedwait 方法時,可能會存在超時值失效的情況

.bugfix: fiber_server.cpp 當有連接未斷開時,進程無法正常退出

.bugfix: fbase_event.c 中 fbase_event_wakeup/fbase_event_wait IO 如果遇到中斷信號,應該需要重啟 IO 過程

.bugfix: fiber_event.c 的方法 acl_fiber_event_notify 中需要用線程鎖對等待隊列(event->waiters)和原子數(event->atomic)進行保護,否則中間會有時間間隙,導致加鎖等待者(調用acl_fiber_event_wait)永久等待

.bugfix: fiber_event.c 修復鎖競爭問題

.bugfix: fiber_event.c 中的鎖存在幾處鎖競爭失效問題

.bugfix: event_iocp.c 中的 iocp_check 方法中的一處斷言有問題 -- [email protected]

.bugfix: getaddrinfo.c 修復一處 IPV6 相關問題

.bugfix: 使用 poll 方法時,在初始化參數時不需要設置 POLLERR, POLLHUP

.bugfix: acl_fiber_gethostbyname 在協程模式下是不安全的,會存在多個協程共用一個線程局部變量的問題,從而導致內存解析失敗,解決方式是使用協程局部變量


分享到:


相關文章: