李曉宇,韓飛馳,黃文世,許光輝,任博文,曲中水*,李秋實
(1.哈爾濱理工大學 計算機科學與技術學院,哈爾 濱150080;2.大慶市實驗中學,黑龍江 大慶 163711)
阿里云服務器(Elastic Compute Service,ECS)是一款高效、可靠的云計算服務,其可以為用戶帶來免硬件投入的服務器資源,使用起來更加便捷,同時也能夠幫助用戶構建更加穩(wěn)定、安全的應用,大大提高運維效率,降低IT 成本。ECS 具有性能卓越、穩(wěn)定可靠、彈性擴展的云計算特點。采用阿里云服務器ECS 作為數據存儲平臺,不僅可以有效降低成本,而且還能夠大大提升插座項目的運行效率。
使用阿里云ESC 其內部結構是一臺Linux 系統(tǒng)(centOS7),可安裝MySQL,Tomcat,Redis,Zookeeper 和RabbitMQ,本地電腦通過遠程連接(NaviCat、XShell)在輸入阿里云服務器公網IP 和端口,用戶名和密碼下即可與阿里云服務器連接(前提需在阿里云安全組中添加端口號、IP 和用戶信息)。在SpringBoot 中找到resource.yml,進行數據庫連接的相關配置(如url、username,password 等),如圖1 所示。
圖1 配置SringBoot 連接ECS 服務器數據庫
其中server 字段表示程序開啟Tomcat 后網站登錄顯示的服務端口號,此端口號可以為任意號碼,一般默認為8080,由于阿里云ECS 服務器部署了Tomcat后,其安全組中自帶Tomcat 的IP 地址為80,即網站HTTP 服務的端口,因此可通過程序配置對其進行修改為8080/8081,或者在阿里云服務器中使用指令:“iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080”實現對Tomcat 的IO 默認端口進行修改。Database 即為與數據庫連接地址,部署于阿里云中的程序數據庫,一般IP 地址為localhost:1663 即可,若使用服務器公網IP 加端口號,可能會導致數據庫連接不上拋出異常錯誤。
Ajax 是一種異步網絡請求處理技術,使用JavaScript 執(zhí)行,能夠在不跳轉、不刷新的狀況下,在網站后臺提供數據信息,并部分修改主頁信息內容。其原理是利用XMLHttp 對象將前臺數據傳遞到后端,后端接受到申請后,將要求的結論傳回前臺,完成數據信息的來回傳送,而無需頁面的回發(fā),從而提高網絡的效率和可靠性。利用這種方式,我們能夠做到無刷新。
1.2.1 實現流程
請求XMLHttpRequest 對象,自動打開請求地址并初始化信息,然后,發(fā)出請求信息,監(jiān)聽回調函數的運行情況,最后接收服務器返回的應答結論。
前端方面通過對操控對象設置IP 號,操控方式(GET/POST),后端使用注解(GetMapper(“IP”)或PostMapper(“IP”))方式,實現后端與前端的連接。若是返回另一頁面,則使用return“指定頁面.xml”進行返回,若是返回數據,則可通過ResultSeason 函數,將返回的主體進行返回,實現后端數據向前端進行傳遞,前端接收數據并顯示,以完成B/S 的基本框架。
1.2.2 Ajax 優(yōu)點
采用無刷新的頁面設計,可以有效地與服務器進行通信,大大縮短客戶時間,提升體驗。
采用異步技術與服務器進行交互,可以大大提高響應速度。
通過將原本主機上的任務遷移到服務器端,能夠利用服務器端的空閑資金,有效減少主機和服務的負荷,節(jié)儉空間和寬帶租用花費。
1.2.3 數據可視化
ECharts 是一個開源的可視化庫,采用JavaScript完成,能夠在PC 和手機機器上順暢執(zhí)行,并且兼容當前大多數網頁和瀏覽器(IE8/9/10/11、Chrome、Firefox、Safari 等),基本依靠矢量圖形庫[ZRender],帶來直接、豐富多彩的交互體驗,為用戶創(chuàng)造一種更加有效的數據可視化顯示方式,能夠根據個人需求定制的數據可視化圖表。
1.2.4 rem 適配
為了滿足各種頁面的需求,rem 適配方法被廣泛應用。rem 是一種比較長度單位,能夠在各種寬度的顯示屏上按比例縮放,從而使根元件(即html 元素)的font-size 計算值得到相應的倍率。通過調整html 的font-size,根據各個顯示屏的寬度,以相同的比率動態(tài)調整,并將px 更換為rem,能夠有效地改變根元件的字體大小,從而達到良好的視覺效果,使用戶能夠獲得更加流暢的體驗。
項目的數據傳輸使用RabbitMQ 來進行消息隊列和消息確認機制[1],RabbitMQ 的本質如圖2 所示。
圖2 RabbitMQ 原理圖
RabbitMQ 即為一個中間代理,在生產者發(fā)布消息時,需經過Exchange 交換機,然后根據自身的交換類型以及和Queue 的Binding Key 來決定消息的去向。RabbitMQ 采用TCP 的傳輸機制,即RabbitMQ 支持消息確認ACK。
ACK 是一種客戶端反饋機制,其從RabbitMQ 收到消息并處理完成后,RabbitMQ 會根據消息的內容和特征,將其從隊列中刪除,以確保消費者能夠及時獲取服務器上的信息。如果消費者因為網絡不穩(wěn)定等原因無法接收到ACK 反饋,RabbitMQ 會將其再次放入隊列中,并將其推發(fā)給其他上線的消費者,以確保消費者服務器故障時,能夠及時獲得有效的幫助和支持,沒有任何消息或任務被遺漏。
RabbitMQ 支持消息的持久化[2],保證了當Rabbit-MQ 在沒有客戶端訪問時因自動關閉而導致原本消息內容丟失。開啟方法為:
1)boolean durable = true;
2)channel.queueDeclare(“hello”,durable,false,false,null);
除此之外,RabbitMQ 還支持負載均衡,我們使用prefetchcount=1 這個設置,其告訴RabbitMQ,不要一次將多個消息發(fā)送給同一個消費者(即客戶端)。保證只有當消費者處理完成當前消息并反饋后,才會收到另外一條消息或任務,避免負載不均衡(雖然阿里云ESC服務器自帶負載均衡,但是雙重的負載均衡可以二次保護系統(tǒng),防止其崩潰)。
Spring Cache 是一種抽象的緩存類型,可以支撐多種類型的緩存,如Redis、EHCache 等,并且可以通過給出各種注解來精簡緩存的應用,從而更好地支撐各種方式。Redis 有5 種數據結構,分別為string,list,set、hash、zset。zset 是一個廣泛應用的有序列表,相似于Java 中的SortedSet 和HashMap,但其內部體現運用了一個更具復雜性的跳躍表構造。這種構造使用隨機策略,可以確定新元素能夠被分配到第幾層。Redis不僅擁有可靠的過期時間,而且還能夠根據不同的數據結構來設置過期時間,例如hash架構的過期時間可能是某個hash 對象的過期,而不僅僅是某個子key 的過期[3]。
Redis 是一款開源的、采用C 語言的非關系型數據庫,能夠以key-value 的方式儲存信息,這使得其能夠在內存中實現高性能的儲存,與傳統(tǒng)的關系型數據庫有著本質的不同。非關系型數據庫不僅僅是某種數據結構化存儲方法的集合體,還必須遵循一些基本的要求,比如sql 標準、事務處理、表結構等,以確保數據信息的安全性和可靠性。
Redis 的主要優(yōu)點在于:①數據存儲在內存中,具有極快的存取速度和強大的并發(fā)處理能力。②支持更多的value 類型,包括string、list、set、zset 以及哈希類型,這些類型可以更有效地存儲和管理數據。③Redis的存在,大大補充了Memcached 等key-value 數據庫的缺陷問題,在某些情況下,可以為關系數據庫(如MySQL)提供有效的支持;④Redis 支持數據集群,能夠實現大量數據的主從一致和負荷平衡。主服務器能夠與任意數量的從服務器進行數據交換,而從服務器則能夠與其他主服務器進行連接。
緩存對于數據庫而言是至關重要的,若大量緩存失效,那么所有的訪問均由數據庫承擔,此現象稱作雪崩。當緩存失效時,會對底層系統(tǒng)造成巨大沖擊。為避免這種情況,許多系統(tǒng)都會采用加鎖或隊列請求的方法來確保數據庫不會被同時讀取。另一種簡單的方法是將緩存的過期日期分散開,比如說加入某個隨機值(1~5 min),以保證每個緩存的過期日期的重疊率大大降低。這樣一來可以有效地減少雪崩效應對底層系統(tǒng)的沖擊,并確保數據庫的安全性。很難有任何集體失效的事件發(fā)生。枷鎖代碼如圖3 所示。
圖3 枷鎖排隊
Redis 緩存擊穿是一種常見的數據庫系統(tǒng)故障,它可能是由于存取的key 相應的信息在Redis 中過期,導致大規(guī)模并發(fā)申請無法及時響應,從而導致數據庫系統(tǒng)崩潰。因此,為了避免這種情況的發(fā)生,應該采取有效的措施來防止Redis 緩存擊穿,以確保數據安全,一種常用的方法是采用mutex。這意味著,當緩存失效時,不要立刻訪問數據庫,轉而利用緩存軟件中的一些功能(例如Redis 的SETNX 或Memcache 的ADD)來設置mutex key。返回值為true 時,就可以繼續(xù)使用緩存。
Zookeeper 是一款開源的分布式程序協(xié)同業(yè)務,像航班調度員一樣幫助管理天空中各個航班的飛機。在Apache Hbase 和Apache Solr 的散布式集群中均用到了Zookeeper。Zookeeper 是HaDoop 項目的一種重要組成部分,他提供了一系列強大的功能,包括分配信息管理、名稱服務、分布式鎖定和集群信息管理等[4]。
Zookeeper 是一種分布式服務管理架構,以觀察者模型為基礎,負責管理存儲和管理工作所有關注的信息,并接收觀察者的申請。如果上述信息發(fā)生,Zookeeper 將立即告知已登錄的觀察者,以便他們能夠作出適當的反映,以便實施集群中Master/Slave 管理模式。如圖4 所示。
圖4 Zookeeper 結構
Zookeeper 的特點:①Zookeeper 是一組由管理者和伴隨者構成的群體,其中管理者負責發(fā)動投票并做出決策,同時也會定期更新系統(tǒng)狀況;伴隨者則負責管理接受用戶請求,并將數據及時反饋給用戶,在選擇管理者的進程中參加表決,以確保操作系統(tǒng)的有效運行。②從同一個client 發(fā)出的更新請求應當按照其發(fā)送順序進行處理,以確保數據的準確性和及時性。③實時性,client 可以在短時間內獲取最新的數據。
本文闡述了客戶端以及服務端連接阿里云ECS 服務器數據庫的主要方式,以及客戶端在操作服務器時所用到幾項技術。通過Navicat 的連接,RabbitMQ 的中間處理,Redis 緩存的查詢和負載均衡,json 格式的數據傳輸,http 前端經過js 和Ajax[5]在Tomcat[6]的中間處理下與后端的連接,讓我們可以通過本地遠程連接操控服務器的運行,以及信息的處理,最后將項目程序成品壓縮成war 包放入服務器中,實現自主運行。