1.可靠性
可擴展性,服務降級,負載均衡
應用擴展
1.垂直擴展,方式:提高機器硬件,缺點,成本昂貴,擴展能力有限
2.水平擴展,方式:增長節點,優勢:升級過程平花,硬件成本低,理論上無線擴展,肯定:會增長系統的複雜度,維護成本高,服務須無狀態的,可分佈式的
數據庫擴展
1.垂直拆分,一個庫數據量太大,將業務緊密,表間關聯密切的表劃分在一塊兒;
2.水平拆分,一個表的數據量太大,一表拆多表,根據查詢使用狀況肯定規則
mysql單表容量不要超過5000萬,正常業務不要超過1000萬
spring動態數據源
分表組件,googledb shard,公司也有
考慮點
數據量,增加速度,QPS,切分規則
負載均衡
nginx反向代理服務器,http轉發
策略
random,隨機
roundrobin,輪詢
leastactive,優先向處理較快的服務器
IPHash 根據IP來作hash,
ConsistentHash 根據內容作hash,機器有結果的localcache,請求直接打到該服務器
健康檢查
Healthcheck.html
按期檢查url是否能訪問到,檢查服務器狀態是否存活
服務降級
對提供的服務進行分級,核心服務具備更高的優先級,不重要的服務降級
功能開關
qconfig
2.性能
緩存,併發,池化,異步
性能優化的目標是聲明
響應時間
吞吐量
影響性能的因素有那些
cpu,內存,磁盤,網絡,javaGC
hashmap的連表rehash可能致使收尾相連致使死循環
如何判斷哈希算法好壞
分散性
平衡性
單調性
synchronized(一直等待)/reentrantLock(有timeout)
可重入鎖,互斥
ReadWriterLock讀寫鎖
讀鎖是一種共享鎖,寫鎖是一種排他鎖,寫鎖和讀鎖有級別,
獲取寫鎖要等待全部讀鎖都釋放
緩存
hashmap
ConcurrentHashMap
Guava Cache
memcached 集羣
水平擴展
若是機器增長,hash值映射怎麼辦
一致性hash
redis,數據結構豐富
操做豐富 可持久化,若是分佈式優先級隊列sorted set
序列化
概念,將對象的狀態信息轉換爲能夠存儲或者傳輸形式的過程
json
java serilization 顯式指定id
Hessian
少用枚舉
池化技術
場景 可服用資源,資源建立代價大
類型:線程池 executor 鏈接池jdbc dbcp c3p0 對象池 spring
鏈接池的參數
不推薦用Executors建立,而是ThreadPoolExecutor
弊端是
fixedThreadpool和singleThreadpool會產生oom
其餘注意事項
建立線程或線程池 時請指定有意義的線程名,方便出錯時回溯
縣城內要catch異常,記錄日誌和監控
使用countDOwnlatch 進行異步轉同步操做,縣城退出前必須調用countdown
如何合理地估算線程池大小,假設N爲cpu核數
1.純cpu計算應用 N
2.IO密集型應用
上限 ((線程等待時間+縣城CPU時間)/縣城cpu時間)×cpu數目
下線 qps
異步
前端輪詢,後端異步
Future/CountDownLatch
消息隊列
QMQ/Kafka/AMQ/rabbitmq
QMQ和kafka區別,QMQ的消息在消息中心推送出去,KAfka是存在消息中心
HTTp
async-http-client
Apache httpComponents
Dubbo異步調用、參數回調(調用須要注意,防止被調用方掛掉)
推薦圖書 web性能權威指南
web安全
機密:持卡人資料,薪資信息,員工手機號
敏感信息:
內部:研究方法,培訓資料,客戶資料,財務數據
敏感信息打碼
證件號,前4位至後3位之間的隱藏處理,手機號碼前3位至後4位之間的隱藏處理,郵箱前3位至@之間的隱藏處理,銀行卡信息後4位之外的隱藏處理
通用web安全問題
sql注入
用戶輸入的內容拼接到sql語句中,一塊兒提交給數據庫執行,改變原sql語句執行邏輯,甚至能夠得到數據庫服務器的系統權限;
JDBC方案,採用預處理執行sql,preparedStatement,採用佔位符,數據庫將用戶輸入值替代?,不參加數據庫語句的編譯
mybatis
統一使用#{},不使用$
針對like查詢,在程序中對參數拼接%符號,並在sql配置中使用#{}接受
針對orderby和groupby,使用枚舉限定查詢參數,在sql配置中使用foreach生成orderby和groupby參數
身份認證安全-驗證碼安全
短信驗證碼調用次數限制,橫線限制,對ip和瀏覽器進行限制,縱向限制,對同一個用戶進行限制
短信驗證嗎失效策略,錯誤次數,時間,
圖片驗證碼失效策略,
業務邏輯安全-身份認證邏輯
查詢用戶信息應該經過cookie確認身份,禁止使用user=%s或者id=%s這種參數查詢
身份cookie驗證_q,_v,_t或者_s,禁止取cookie中的username做爲用戶在線標識
業務邏輯安全-支付校驗邏輯
帳戶安全不等於支付安全
越權問題-緣由和分類
越權訪問,實際上就是指權限控制上出了問題,
在web應用中,訪問控制能夠分爲兩大類
垂直權限管理 低權限用戶訪問到了高權限用戶能訪問的資源
水平權限管理 同一級別的用戶能相互訪問
越權問題-方案
對於後臺程序,默認應該拒絕無受權用戶的訪問
受權帳號的角色級別要區分明確,避免縱向越權
應用程序是否驗證,用戶有權限訪問資源
應用程序是否能保證,當前用戶訪問的資源是隻受權給該用戶的資源,避免水平越權;
從用戶的加密認證cookie中獲取當前用戶的id,而且須要在執行的sql語句中加入當前用戶id做爲條件語句;
SSRF(Server-side request forgery)服務端請求攻擊
內部url接口任意讀取漏洞,能夠通俗的理解爲外部用戶藉助一些proxy功能的接口,實現了http代理功能,這種狀況下若是proxy沒有作任何限制,則容許外部用戶經過接口讀取任何的內部http服務;
緣由:url麼有作過任何限制,致使能夠直接請求內部的任何url接口去查詢信息
URL任意跳轉
web應用程序接受到用戶提交的url參數後,沒有對參數作「可信任url」的驗證,就向用戶瀏覽器返回跳轉到該url的指令
XSS攻擊
croess site script 跨站腳本攻擊,它是指惡意攻擊者往web頁面裏插入惡意js代碼,當用戶瀏覽該頁時,嵌入web中的代碼會被執行,從而達到惡意攻擊用戶的特殊目的,xss屬於被動式攻擊,由於其被動且很差利用,因此常常被忽略;
危害:盜取用戶cookie以及瀏覽器信息,僞造用戶身份進行操做,衍生url跳轉漏洞,網頁掛馬,控制受害者的機器對其餘網站發起攻擊,xss蠕蟲
輸出轉碼:除下列狀況外,必須對輸出到客戶端的變量進行相應的編碼轉義,不容許直接輸出;
content-type:application/javascript
content-type:text/javascript
content-type:application/json
參數校驗
java使用ESAPI.encoder().encodeForxxxx 方法針對不一樣的語境,對輸出標籤進行編碼;
cookie設置httponly,防止cooie跨域
文件上傳
web應用程序在處理用戶上傳的文件時,沒有判斷文件的擴展名是否在容許的範圍內,就把文件保存在服務器上,致使惡意用戶能夠上傳任意文件,甚至上傳惡意腳本木馬到web服務器
緣由:未判斷上傳文件擴展名,未考慮邏輯錯誤,上傳目錄有執行權限;
文件下載
處理用戶請求下載文件時容許用戶提交任意文件路徑,並把服務器上對應的文件直接發給用戶,好比../../
形成任意文件下載的威脅;
惡意用戶會利用變換目錄或文件地址,來下載服務器上的敏感文件
產生緣由,未判斷用戶輸入參數有效性
權限判斷
解決上傳下載問題,驗證用戶參數,限制../,權限判斷,使用常量
CSRF cross-site request forgery 跨站請求僞造,因爲目標站無token/referer限制,致使攻擊者能夠用戶的身份完成操做達到各類目的
其本質是攻擊者能輕易猜解到用戶的參數
Refer限制
CSRFtoken,加一個猜不到的參數,攻擊者就很難構造了
若是代理商須要訪問內網後臺,開放proxy以前須要作好權限控制和白名單
對目標url中的字串匹配不能防止url任意跳轉問題,須要提取域名來作比較;
圖片上傳時,除了文件名的後綴校驗,還要對文件內容進行校驗;由於有些木馬能夠隱藏在圖片文件中;;
穿上和下載目錄只存放靜態文件,禁止開放執行權限
安全問題
常見的坑
編碼
所有使用utf8,可能有外部網站傳入gbk編碼的參數
Bom頭問題(windows問題) 保存utf8會多加一些
svn diff 不要使用烏龜(不會提示文件編碼改變)
外部資源響應慢
常見外部資源
database/cahe
dubbo
mq
http
外部依賴有問題時系統被拖死
解決辦法
加監控
外部依賴必須設置合理超時時間
定時任務中斷
常見緣由,異常沒有catch或着catch有問題
後果,定時任務在某個特殊的時候,就中止不運行了
解決辦法,catch住全部異常,使用qschedule
分佈式環境使用本地cache
後果產生內容不一致的狀況
解決辦法,redis 使用memcached
錯誤的數據更新方式
一批數據的全量更新(好比memcached)
採用刪除所有,批量添加新數據
後果
雖然可能很快,可能在幾秒以內能夠完成,可是這個時間縫隙內數據就是有問題的、
解決辦法,採用更新的方式;
緩存null值
問題,緩存null,覺得未命中緩存
後果,數據庫被一直打穿
解決辦法,緩存的值要合理設計,null這種要另作處理
ThreadLocal在線程池環境下,使用後不清理
後果,內存泄露,數據錯誤
解決辦法 避免使用或每次使用先後清理
分頁查詢
問題,批量分頁查詢沒有限制最大個書
後果,惡意利用拖死服務器
解決辦法
實現分頁功能,要有默認值和最大值
故障平臺
接口規範
接口數據格式變動須要事先通知調用方
接口狀態枚舉變動須要通知調用方
1.應用的申請、查找,廢棄
2.維護應用開發人員列表
3.token管理下發
4.維護應用和實際運行機器的映射關係
5.監控及警報開關
6http及dubbo的訪問限制管理
7日誌收集相關配置
common基礎類是什麼(web必須依賴)
TCDev提供的一套基礎依賴庫
提供了公用組件共同的依賴,qconfig,qmq
提供了一些經常使用的功能
commonc-core最經常使用的依賴,提供應用中心和監控的接入
common-http 提供通過TCDev封裝的同步和異步http client
common-web 提供http監控,標準httpAPI返回實現
common-rpc 以插件的方式爲dubbo提供一些加強功能
common-block 提供http和dubbo的限流功能