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 在協程模式下是不安全的,會存在多個協程共用一個執行緒區域性變數的問題,從而導致記憶體解析失敗,解決方式是使用協程區域性變數
軟體下載連結:https://gitee.com/acl-dev/acl