20170227玩呗娱乐
Java技術
1.完整描述SOA架構
1.1 什么是web服務(web service)
Web 服務是一個軟件接口,它描述了一組可以在網絡上通過標準化的 XML 消息傳遞訪問的操作.
Web Service 最基本的組成部分為服務的提供者(Service Provider)和服務的請求者(Service Requester),這兩端痛過XML格式進行通信。
1.2 Web服務三要素
WSDL:用于用于描述和定位網絡服務。WSDL中主要有如下元素,
<portType> 是最重要的一個元素,用來描述web服務支持的操作及相關信息。可以把該元素比作傳統編程語言中的一個函數庫(或一個模塊、或一個類),而把每個操作比作傳統編程語言中的一個函數。
<message> 用來定義一個操作(函數)的具體調用格式(函數名,參數名等等)
<portType>代碼片段:
1 <message name="getTermRequest"> 2 <part name="term" type="xs:string"/> 3 </message> 4 5 <message name="getTermResponse"> 6 <part name="value" type="xs:string"/> 7 </message> 8 9 <portType name="glossaryTerms"> 10 <operation name="getTerm"> 11 <input message="getTermRequest"/> 12 <output message="getTermResponse"/> 13 </operation> 14 </portType> View Code<binding> 描述要使用哪種方式將上面的端口<portType>進行綁定,一般可以綁定到SOA。
如果是綁定到SOA,則需要在<binding>使用<soap:binding>子標簽中使用定義SOAP協議內容。
在<soap:binding>中,通過style屬性指定rpc或者document, 通過transport 定義了要使用的 SOAP 協議(例如http),在<operator>則定義了每個端口提供的操作符。
一個<binding>代碼片段:
1 <message name="getTermRequest"> 2 <part name="term" type="xs:string" /> 3 </message> 4 5 <message name="getTermResponse"> 6 <part name="value" type="xs:string" /> 7 </message> 8 9 <portType name="glossaryTerms"> 10 <operation name="getTerm"> 11 <input message="getTermRequest" /> 12 <output message="getTermResponse" /> 13 </operation> 14 </portType> 15 16 <binding type="glossaryTerms" name="b1"> 17 <soap:binding style="document" 18 transport="http://schemas.xmlsoap.org/soap/http" /> 19 <operation> 20 <soap:operation 21 soapAction="http://example.com/getTerm" /> 22 <input> 23 <soap:body use="literal" /> 24 </input> 25 <output> 26 <soap:body use="literal" /> 27 </output> 28 </operation> 29 </binding> View Code?
UDDI(Universal Description, Discovery and Integration)即“通用描述、發現與集成服,?是一種目錄服務,企業可以使用它對 Web services 進行注冊和搜索
?
1.3 SOAP
按照 Web Service 的相關標準描述,服務的提供者應該首先通過 WSDL(Web Service Definition Language)和 UDDI (Universal Description, Discovery, and Integration)發布它所提供的服務到一個統注冊這些服務信息的存儲庫中去。這樣,服務的請求者就也可以通過 WSDL 和 UDDI 發現到服務提供者提供的服務,并可以通過應用的調用方法來使用這個服務了。
SOA的重點在于集成,重用,分布式。
面向服務的體系結構(Service-Oriented Architecture,SOA)是一種 IT 體系結構風格,支持將您的業務轉換為一組相互鏈接的服務或可重復業務任務,可在需要時通過網絡訪問這些服務和任務。
SOA 描述了服務的整個系統如何動態地相互查找,如何聚集在一起執行某些應用程序,以及如何按照多種方式進行組合。該模型鼓勵技術和軟件的重用,以及使用SOA模型實現分布式系統。
?
2.設計秒殺,考慮分布式事務和數據庫連接數限制, 說明應用程序級別的分布式事務控制。
優化方向:
a.將請求盡量攔截在系統上游。
主要是為了不要讓鎖沖突落到數據庫上面去。
這里需要在各個層次進行優化。
第一層是在客戶端優化,例如對瀏覽器,APP等,不應該將每一次提交都真正提交到應用程序,而是應該設置一些防作弊機制,攔截部分請求(例如提交完button就變灰,5分鐘才能提交一次等等)
第二層是在MVC層或者業務層,如果有攻擊者擁有大量動態IP進行for循環秒殺,應該按UID進行有效識別和攔截。但是如果攻擊者擁有大量肉雞(即,不僅有動態IP,而且有不同UID),用UID過濾就不起作用了。
第三層是在服務層攔截,對于上面挾持肉雞的攻擊是看作正常用戶的,這里不討論攻擊,只討論攔截,對于這種大訪問量,在服務層可以用隊列進行串行化訪問(分批),根據商品存量每次放出適當訪問請求就能有效控制服務層壓力。
對于第三層,可以用來確保寫請求不超過數據庫的連接限制。
第四層是利用緩存緩解讀請求(秒殺基本都是讀多寫少),讓大部分請求都能讀到混存,能有效緩解數據庫壓力。
第五層是異步操作,搶票成功后的付款采用異步方式返回。
通過上面一些列優化之后,能夠有效控制真正讀和寫數據庫的請求數量。當然也可以在業務規則層面先進行優化,例如12306分時分段售票。。。而此時對于數據庫來說,因為前面的大量工作攔截了大量請求,數據庫的壓力可以控制在安全范圍進行事務操作了。?
?
3.設計單點登錄,說明令牌生成機制及安全保障
?單點登錄的一般設計思路是,使用統一授權模塊生成token,寫入客戶端cookie,客戶端在登錄其他子站點時,將包含token的cookie發送至子站點,子站點再與統一授權模塊校驗合法性,合法則在子站點為用戶生成session表明授權成功,進行后續操作。
基于這種方式實現的單點登錄,cookie的安全性是一個很大問題。
?
有的系統會設計預登錄方式,即用戶第一次通過統一模塊進行授權時,如果授權通過,統一模塊再強制將客戶端重定向到各個子站點,即預先登錄各個子站點,各個子站點都會寫入session。
預登錄不僅可以簡化客戶端登陸流程,而且安全性更高,因為預登錄的時候,用的是統一模塊第一次發給客戶端的原始session-cookie在各個子站點進行授權(寫session),而不是各個子站點臨時為客戶端生成的session-cookie,
統一授權模塊在第一次發送sesion-cookie給客戶端的時候,完全可以在cookie中加入服務器端特有信息,達到難以偽造的目的,同時通過SSL通道進行cookie傳輸,保證cookie不會被攔截偷取。
?
另外,采用預登錄的方式,如果一個用戶已經登錄,則在各個子站點存在session[hash(uid+timestame+服務器數字簽名),],且在數據庫中也是登錄狀態。如果此時有人偽造用戶id和cookie去登錄,由于偽造的cookie與統一授權模塊分配的session-cookie并不相同,那么各個子站點就不會存在這個session[hash(uid+timestame+服務器數字簽名)],然而數據庫卻顯示此用戶一登陸,那么此時可以判斷次用戶異常(有惡意破解嫌疑)。
?
另外,即使hash(uid+timestame+服務器數字簽名),即使被盜取,也無法篡改,這是數字簽名的特征,基于這一點,讓timestame盡快失效可以提高安全性。
簽名過程
“發送報文時,發送方用一個哈希函數從報文文本中生成報文摘要,然后用自己的私人密鑰對這個摘要進行加密,這個加密后的摘要將作為報文的數字簽名和報文一起發送給接收方,接收方首先用與發送方一樣的哈希函數從接收到的原始報文中計算出報文摘要,接著再用發送方的公用密鑰來對報文附加的數字簽名進行解密,如果這兩個摘要相同、那么接收方就能確認該數字簽名是發送方的。
數字簽名有兩種功效:一是能確定消息確實是由發送方簽名并發出來的,因為別人假冒不了發送方的簽名。二是數字簽名能確定消息的完整性。因為數字簽名的特點是它代表了文件的特征,文件如果發生改變,數字摘要的值也將發生變化。不同的文件將得到不同的數字摘要。 一次數字簽名涉及到一個哈希函數、發送者的公鑰、發送者的私鑰。”
?
關于數字簽名和數字證書,可以參考 ??http://justjavac.iteye.com/blog/1144151
算法
1. 樹的按層次遍歷
思路,用一個FIFO隊列輔助,初始狀態是將樹的根節點放進隊列,
然后進行循環操作,跳出條件是隊列是否為空。
每次從隊列彈出(poll())一個元素,首先打印出這個節點,然后判斷是否有左孩子,如果有就將左孩子入隊列,接著判斷是否有右孩子,如果有也入隊列,如此循環,當隊列為空的時候,也就完成了層次遍歷。
1 public void levelTravel() { 2 LinkedList<Node> queul = new LinkedList<>(); 3 queul.push(root); 4 while (!queul.isEmpty()) { 5 Node tmpNode = queul.poll(); 6 System.out.print(tmpNode.value+"#"); 7 if(tmpNode.left != null) { 8 queul.push(tmpNode.left); 9 } 10 if(tmpNode.right != null) { 11 queul.push(tmpNode.right); 12 } 13 } 14 }?
2. 單鏈表,在不知道前一個節點地址的情況(但是知道后一個節點),如何刪除后一個節點。
把將要刪除節點的內存數據直接拷貝到后一個節點位置,然后釋放內存。
3.0~999,如何用數學方法快速計算有多少個數字里含有7
1+10+9+100+90+90 = 300
轉載于:https://www.cnblogs.com/fysola/p/6477694.html
總結
以上是生活随笔為你收集整理的20170227玩呗娱乐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA中String字符串比较equa
- 下一篇: SocketLog安装