[置頂] 2016年終總結

1、技術總結
(1)App/JavaWeb後臺系統
1.一、採用RestFul架構的SSM(Spring SpringMVC MyBatis)框架集成開發的App後臺系統,將用戶鑑權分離出來單獨的模塊,將用戶鑑權登陸狀態Token保存到Redis內存數據庫中,從而便於上層業務後臺系統彈性部署,提升系統的可用性和伸縮性,也爲API高併發訪問提供安全基礎。
1.二、後臺系統尤爲是Web或App後臺一般由後臺處理業務相關數據展現到前端頁面或返回Json字符串數據到客戶端。項目隨着業務發展和用戶數的增多一般會不斷重構,採用Maven進行項目構建和做爲項目管理工具,將項目製做成Maven多模塊,core模塊、service模塊、web模塊、common模塊、controller模塊等。
1.三、MVC模式分modle層、dao層、service層,controller層。model層用於將業務實體封裝成數據模型,dao層用於操做數據庫的接口層,service層用於調用dao層和外部系統的接口層,比較複雜的業務邏輯通常都按原子性操做封裝在service層,controller層主要用於控制分發,將業務處理結果的Json數據或前端頁面分發到客戶端訪問層。
1.四、工做到如今用過不少API,JSON格式和XML格式都有。總結使用經驗以爲JSON格式的更好用。JSON格式一般是更爲簡潔的(以致於傳輸的數據量更小),也更容易展示覆雜的對象(精確)並且能運行得像其餘格式同樣好。
1.五、用設備號/設備mac地址做爲Token:服務端接收到該參數後,便用一個變量來接收同時將其做爲Token保存在數據庫,並將該Token設置到session中,客戶端每次請求的時候都要統一攔截,並將客戶端傳遞的token和服務器端session中的token進行對比,若是相同則放行,不一樣則拒絕。
1.六、對於一些須要異步處理的,不要直接new一個thread,應當使用線程池。使用線程池的時候應當對線程數量大小合理設置,通常最大不超過50個,固然還須要考慮你的IO和CPU。容器類變量,若是變化比較大且頻繁,儘可能定義的時候設置初始容量大小,減小擴容帶來的消耗。分支判斷if…else的時候,最常符合的條件處理放在前面。對象比較的時候常量放前面,養成好習慣,減小空指針的出現。減小synchronized中等待處理的代碼,能放在外面就儘可能放在外面。
1.七、關於數據,通常查詢比較慢,頗有多是沒有建索引或者索引沒用到,多去檢查一下。兩個大表的關聯查詢,可使用二次訪問數據庫替代,先查出A表的數據,利用關聯字段再查B表的。不要一味想着一條sql搞定最好。堅定避免,查全表數據或者數量大的數據,返回list加載到內存中,一不當心查了100w數據,又查得比較頻繁,內存的爆了。有這種風險的改爲分頁查詢。不要select *,按需取列。多考慮避免事務裏面有長鏈接或者長事務,若是大量這種狀況出現佔用數據鏈接,會影響性能。一些無必要的邏輯能夠放到事務外執行。對字段的加減乘除處理放到sql,嚴格避免先get處理,而後運算在set到數據庫裏面,併發狀況很是容易致使失真。
1.八、方法裏面代碼不要太長,注意封裝,命名語義化,代碼整潔。
(2)、基於Netty底層通訊的消息推送系統的研發
2.一、NIO類庫的異步通訊框架架構特色是:異步非阻塞、基於事件驅動、高性能、高可靠性和高可定製性。
2.二、提供對多種編解碼框架的集成,包括谷歌的Protobuf、Jboss marshalling、Java序列化、壓縮編解碼、XML解碼、字符串編解碼等,這些編解碼框架能夠被用戶直接使用。
2.三、提供形式多樣的編解碼基礎類庫,能夠很是方便的實現私有協議棧編解碼框架的二次定製和開發。
2.四、基於職責鏈模式的Pipeline-Handler機制,用戶能夠很是方便的對網絡事件進行攔截和定製。
2.五、全部的IO操做都是異步的,用戶能夠經過Future-Listener機制主動Get結果或者由IO線程操做完成以後主動Notify結果,用戶的業務線程不須要同步等待。
2.六、隨着網站規模的不斷擴大,系統併發訪問量也愈來愈高,傳統基於Tomcat等Web容器的垂直架構已經沒法知足需求,須要拆分應用進行服務化,以提升開發和維護效率。從組網狀況看,垂直的架構拆分以後,系統採用分佈式部署,各個節點之間須要遠程服務調用,高性能的RPC框架必不可少,Netty做爲異步高性能的通訊框架,每每做爲基礎通訊組件被這些RPC框架使用。
2.七、阿里分佈式服務框架Dubbo的RPC框架使用Dubbo協議進行節點間通訊,Dubbo協議默認使用Netty做爲基礎通訊組件,用於實現各進程節點之間的內部通訊。其中,服務提供者和服務消費者之間,服務提供者、服務消費者和性能統計節點之間使用Netty進行異步/同步通訊。除了Dubbo以外,淘寶的消息中間件RocketMQ的消息生產者和消息消費者之間,也採用Netty進行高性能、異步通訊。
(3)、Jenkins持續集成
3.一、對Git、JIRA、Jenkins、GitLab、Maven等自動化的基於主幹分支開發方式的持續集成,Jenkins Maven自動測試、持續構建,Jenkins持續部署,持續交付等集成工具的安裝使用,及基於此基礎上的項目管理和項目交付。
3.二、Git主幹開發開發方式,每一個人在項目經理安排的任務下,基於需求開發,此時都基於develop建立一個特勤分支,如,develop-zhanghaiyang分支下開發本身的需求,本地開發完成經測試無誤合併到develop主幹分支,下面能夠通知測試人員測試剛開發的需求。
3.三、GitLab或開源中國Git託管或GitHub託管平臺均可以設置鉤子和Jenkins集成,Jenkins一旦檢測到設置好的分支有推送或合併響應會從新利用Maven進行構建和自動化測試,測試經過後進行從新部署,即實現需求到開發的持續集成,開發到測試的持續測試,測試到應用交付的持續交付。
3.四、JIRA是很優秀的開源的項目Bug跟蹤管理工具,從項目需求到開發測試交付的整個流程的bug跟蹤,便於各個層面的人員進行協調,減小項目開發過程當中開發人員與測試人員,產品經理與測試人員等溝通成本。
3.五、GitLab是相似於GitHub的代碼託管軟件,即Git服務器,著名的開源中國碼雲就是基於GitLab二次開發的優秀的Git代碼託管平臺。
(4)、Docker容器使用
4.一、簡化配置:這是Docker公司宣傳的Docker的主要使用場景。虛擬機的最大好處是能在你的硬件設施上運行各類配置不同的平臺(軟件、系統),Docker在下降額外開銷的狀況下提供了一樣的功能。它能讓你將運行環境和配置放在代碼中而後部署,同一個Docker的配置能夠在不一樣的環境中使用,這樣就下降了硬件要求和應用環境之間耦合度。
4.二、代碼流水線(Code Pipeline)管理:前一個場景對於管理代碼的流水線起到了很大的幫助。代碼從開發者的機器到最終在生產環境上的部署,須要通過不少的中間環境。而每個中間環境都有本身微小的差異,Docker給應用提供了一個從開發到上線均一致的環境,讓代碼的流水線變得簡單很多。
4.三、提升開發效率:不一樣的開發環境中,咱們都想把兩件事作好。一是咱們想讓開發環境儘可能貼近生產環境,二是咱們想快速搭建開發環境。理想狀態中,要達到第一個目標,咱們須要將每個服務都跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,咱們卻不想每次都須要網絡鏈接,每次從新編譯的時候遠程鏈接上去特別麻煩。這就是Docker作的特別好的地方,開發環境的機器一般內存比較小,以前使用虛擬的時候,咱們常常須要爲開發環境的機器加內存,而如今Docker能夠輕易的讓幾十個服務在Docker中跑起來。
4.四、隔離應用:有不少種緣由會讓你選擇在一個機器上運行不一樣的應用,好比以前提到的提升開發效率的場景等。咱們常常須要考慮兩點,一是由於要下降成本而進行服務器整合,二是將一個總體式的應用拆分紅松耦合的單個服務。
4.五、整合服務器:正如經過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker能夠整合多個服務器以下降成本。因爲沒有多個操做系統的內存佔用,以及能在多個實例之間共享沒有使用的內存,Docker能夠比虛擬機提供更好的服務器整合解決方案。
4.六、調試能力:Docker提供了不少的工具,這些工具不必定只是針對容器,可是卻適用於容器。它們提供了不少的功能,包括能夠爲容器設置檢查點、設置版本和查看兩個容器之間的差異,這些特性能夠幫助調試Bug。
4.七、多租戶環境:使用Docker,能夠爲每個租戶的應用層的多個實例建立隔離的環境,這不只簡單並且成本低廉,固然這一切得益於Docker環境的啓動速度和其高效的diff命令。
4.八、快速部署:在虛擬機以前,引入新的硬件資源須要消耗幾天的時間。虛擬化技術(Virtualization)將這個時間縮短到了分鐘級別。而Docker經過爲進程僅僅建立一個容器而無需啓動一個操做系統,再次將這個過程縮短到了秒級。這正是Google和Facebook都看重的特性。
(5)、網站架構設計
5.一、性能:性能是網站架構設計的一個重要方面,任何軟件架構設計方案都必須考慮可能帶來的性能問題。也正由於性能問題幾乎無處不在,因此優化網站性能的手段也很是多:瀏覽器端:能夠經過瀏覽器緩存、頁面壓縮傳輸、合理佈局頁面、減小Cookie傳輸等手段,甚至可使用CDN加速功能。應用服務器端:可使用服務器本地緩存和分佈式緩存,也能夠經過異步操做方式來加快響應,在高併發請求的狀況下,能夠將多臺應用服務器組成一個集羣共同對外服務,提升總體處理能力,改善性能。 數據庫服務器端:可用使用索引、緩存、SQL性能優化等手段,還可使用NoSQL數據庫來優化數據模型、存儲結構等。衡量網站性能有一系列指標,重要的有響應時間、TPS、系統性能計數器等,經過這些指標以肯定系統設計是否達到目標。
5.二、可用性:可用性即可以不間斷提供服務的時間。幾乎全部網站都承諾7×24小時可用,但事實上任何網站都不可能達到徹底的7×24,總會有一些故障時間,扣除這些故障時間,就是網站的可用時間。一些大型網站能夠作到4個9以上的可用性,也就是99.99%。網站高可用的主要手段就是冗餘,應用部署在多臺服務器上同時提供服務,數據存儲在多臺服務器上相互備份,任何一臺服務器都不會影響應用的總體能夠,一般的實現手段即把多臺服務器經過負載均衡設備組成一個集羣。 衡量一個系統架構設計是否知足高可用的目標,就是假設系統中任何一臺或者多臺服務器宕機時,以及出現各類不可預期的問題時,系統總體是否依然可用。
5.三、伸縮性:大型網站須要面對大量用戶的高併發訪問和存儲海量數據,網站經過集羣的方式將多臺服務器組成一個總體共同提供服務。所謂伸縮性是指經過不斷向集羣中加入服務器的手段來緩解不斷總體上市用戶併發訪問壓力和不斷增加的數據存儲需求。衡量架構伸縮性的主要標準就是是否可用多臺服務器構建集羣,是否容易向集羣中添加新的服務器。加入新的服務器後是否能夠提供和原來的服務器無差異的服務。集羣中可容納的總服務器數量是否有限制。
5.四、擴展性:不一樣於其餘架構要素主要關注非功能性需求,網站的擴展性架構直接關注網站的功能需求。網站快速發展,功能不斷擴展,如何設計網站的架構使其可以快速響應需求變化,是網站可擴展架構的主要目標。衡量網站架構擴展性好壞的主要標準就是在網站增長新的業務產品時,是否能夠實現對現有產品透明無影響,不一樣產品之間是否不多耦合等。網站可擴展架構的主要手段是事件驅動架構和分佈式服務。 事件驅動一般利用消息隊列實現,經過這種方式將消息生產和處理邏輯分隔開。 服務器服務則是將業務和可複用服務分離開來,經過分佈式服務框架調用。新增長產品可用經過調用可複用的服務來實現自身的業務邏輯,而對現有產品沒有任何影響。
5.五、安全性:互聯網是開放的,任何人在任何地方均可以訪問網站。網站的安全架構就是保護網站不受惡意訪問和攻擊,保護網站的重要數據不被竊取。衡量網站安全架構的標準就是針對現存和潛在的各類攻擊和竊密手段,是否有可靠的應對策略。
(6)、SQL規範與性能優化--主要針對Mysql
6.一、什麼是執行計劃:a.決定如何訪問表數據,是否經過索引,是否排序等。b.多表關聯是先訪問哪一個表。c.多表關聯時,使用哪一種鏈接方式,不過如今MySQL只有嵌套鏈接(嵌套循環,顧名思義就是將一個表爲出發點,將該表所有記錄逐條去遍歷另一張表的記錄)。
6.二、SQL執行順序:a.檢查語法是否正確。b.檢查表是否存在、權限是否知足等。c.根據統計信息(如data length,rows,index length、索引惟一度),生成較優的執行計劃。d.根據執行計劃,進行數據檢索、過濾、合併、排序等操做。訪問數據時,內存中如存在表數據,則直接進行操做;不然,從磁帶讀取表數據,放入內存,再進行操做;如內存不足,則內存中較冷數據涮出內存,再從內存中讀取數據。
6.三、索引:查詢的時候若是使用上了索引,能夠提升效率,由於創建了索引後,能夠理解爲數據字典的結構存儲,所以根據條件查詢的時候更加高效。下面看一下MySQL經常使用的索引類型的概念。普通索引:在建立普通索引時,不附加任何限制條件。這類索引能夠建立在任何數據類型中,其值是否惟一和非空由字段自己的完整性約束條件決定。創建索引之後,查詢時能夠經過索引進行查詢。例如,在student表的stu_id字段上創建一個普通索引。查詢記錄時,就能夠根據該索引進行查詢。惟一性索引:使用UNIQUE參數能夠設置索引爲惟一性索引。在建立惟一性索引時,限制該索引的值必須是惟一的。例如,在student表的stu_name字段中建立惟一性索引,那麼stu_name字段的值就必需是惟一的。經過惟一性索引,能夠更快速地肯定某條記錄。主鍵就是一種特殊惟一性索引。單列索引:在表中的單個字段上建立索引。單列索引只根據該字段進行索引。單列索引能夠是普通索引,也能夠是惟一性索引,還能夠是全文索引。只要保證該索引只對應一個字段 便可。多列索引:多列索引是在表的多個字段上建立一個索引。該索引指向建立時對應的多個字段,能夠經過這幾個字段進行查詢。可是,只有查詢條件中使用了這些字段中第一個字段時,索引纔會被使用。例如,在表中的id、name和sex字段上創建一個多列索引,那麼,只有查詢條件使用了id字段時該索引纔會被使用。
6.四、通常一張表索引不要超過5個,並且避免重複索引,並且也不是建了索引,根據索引字段條件查詢,索引就會起做用。
6.五、通常哪些場景會致使索引失效:a.使用like關鍵字匹配字符串第一個爲」%」的場景。b.條件中包含or、in、not in、<>關鍵字,默認不走索引的。c.訪問表上的數據行超出表總記錄數30%,變成全表掃描。d.查詢條件使用函數在索引列上,或者對索引列進行運算。e.多列索引中,第一個索引列使用範圍查詢,只能用到部份或沒法使用索引。f.多列索引中,第一個查詢條件不是最左索引列,上面多列索引概念中也有提到。
6.六、不能同時使用兩個索引,一個過濾數據,一個用於排序(主鍵除外)。DML語句若是使用索引,會致使lock全表;若是使用了非惟一索引,可能只是鎖住必定範圍。對此,建議更新/刪除數據儘可能用上索引,若是能夠最好用上主鍵或惟一索引,另外事務要及時提交。
6.七、關於事務:a.日誌記錄儘可能放在獨立事務裏面,避免後面的異常發生致使日誌丟失。b.上面已經幾回提到,儘早提交事務,避免事務過長,所以寫代碼的時候,一些能夠不放到事務的邏輯能夠移到外面,長事務看可否拆成兩個事務。
2、工做心得
(1)、和同事多維度溝通;學會使用筆記本如雲筆記本記錄平常工做過程和會議重點;常常總結思考理解思路;着重學習和工做效率,效率第一,質量第一。
(2)、多聽其餘同事和老闆上司的意見。
(3)、用發展的眼光和變化的眼光看待公司的業務和本身的掌握的技術及手頭上的工做。
(4)、心態決定一切,工做的價值在於本身的心態的控制和調節。
3、職業發展及2017規劃
(1)、先博然後淵:感受本身的技術點仍是理解的蠻多的,但感受不少都不夠深刻,將來是互聯網+時代,社會變遷很快,尤爲是信息爆炸的今天,東西太多,不願能都學的很通。因此將來應該偏向實用驅動,即若是在實際實用場景須要某個技術再去深刻學習,邊學邊用更能體現學以至用!
(2)、重視業務,積累業務和管理經驗:技術再牛不能解決實際業務問題都是啥流氓。另外對業務更理解有利於本身對項目管理工做更加順利的開展。做爲項目管理人員,項目的人員協調與時間安排規劃,責任越大,思考的問題就越多,遇到的問題處理經驗就越豐富。把控能力也比較強。
(3)、學會和更多的同窗同事交朋友:業餘時間多和同事大學同窗等交流共享,更有利於本身的多元化發展,及適當的拓展本身的朋友圈。
(4)、對不懂的東西保持學習心態:學習最能集中注意力的狀況是有着比較強的好奇心和求知慾。因此通常一些技術分享或者老員工討論的問題,可能不少概念知識你都不懂,這時候你就能夠去學習瞭解這些知識。或者你工做中遇到的問題,儘可能刨根問底的去弄清楚是什麼緣由致使的,不要一些老司機幫忙解決了就一了了之。或者是其餘同事遇到的問題,你均可以去了解一下。
(5)、2017注重技術的運用:技術和業務的結合,向項目資深管理方向邁進!在項目管理和技術方向上「五五分帳」,尤爲是多關注大公司資深管理方面的書籍和經驗。
(6)、2017技術類書單:
《重構》
《代碼整潔之道》
《Java併發編程的藝術》
《高性能Linux服務器構建實踐及性能調優與集羣應用》
《Java多線程編程核心技術》
《SOA與Rest》--用Rest構建企業級SOA解決方案
《Spring實踐》
《CentOS Linux系統運維》
《科技之巔》
《硅谷百年史》--共3冊
《VMWare虛擬化與雲計算應用案例詳解》
《Java經常使用算法手冊》
《Docker生產環境實踐指南》
《Docker技術入門與實踐》
《DevOps實踐》
《Java EE開發的顛覆者Spring Boot實戰》
《算法導論》
《分佈式服務框架原理與實踐》
《大話數據結構》
《神經網絡與機器學習》
《Redis設計與實現》
《用戶體驗要素》--以用戶爲中心的產品設計
《白話大數據與機器學習》
《高性能MySQL》
《Hadoop權威指南》
《數據挖掘與數據化運營實戰 思路、方法、技巧與應用》
《深刻理解計算機系統》
《數據結構與算法分析:Java語言描述》
《Spring技術內幕:深刻解析Spring架構與設計原理》
《機器學習》
相關文章
相關標籤/搜索