一、微服務實現分布式服務架構
以springboot、springcloud為主的微服務解決方案
?問題一:為什么用微服務?
?六大優勢
-1、復雜度可控:在將應用分解的同時,規避了原本復雜度無止境的積累。每一個微服務專注于單一功能,并通過定義良好的接口清晰表述服務邊界。由于體積小、復雜度低,每個微服務可由一個小規模開發團隊完全掌控,易于保持高可維護性和開發效率。
-2、獨立部署:由于微服務具備獨立的運行進程,所以每個微服務也可以獨立部署。當某個微服務發生變更時無需編譯、部署整個應用。由微服務組成的應用相當于具備一系列可并行的發布流程,使得發布更加高效,同時降低對生產環境所造成的風險,最終縮短應用交付周期。
-3、技術選型靈活:微服務架構下,技術選型是去中心化的。每個團隊可以根據自身服務的需求和行業發展的現狀,自由選擇最適合的技術棧。由于每個微服務相對簡單,當需要對技術棧進行升級時所面臨的風險較低,甚至完全重構一個微服務也是可行的。
-4、容錯:當某一組建發生故障時,在單一進程的傳統架構下,故障很有可能在進程內擴散,形成應用全局性的不可用。在微服務架構下,故障會被隔離在單個服務中。若設計良好,其他服務可通過重試、平穩退化等機制實現應用層面的容錯。
-5、擴展:單塊架構應用也可以實現橫向擴展,就是將整個應用完整的復制到不同的節點。當應用的不同組件在擴展需求上存在差異時,微服務架構便體現出其靈活性,因為每個服務可以根據實際需求獨立進行擴展。
-6、功能特定:一個微服務一般完成某個特定的功能,比如消息管理、客戶管理等等。每一個微服務都有自己的業務邏輯和適配器。一些微服務還會發布API給其它微服務和應用客戶端使用。其它微服務完成一個Web UI,運行時,每一個實例可能是一個云VM或者是Docker容器。
##### 問題二:SpringCloud是什么?
>Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring并沒有重復制造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
##### 問題三:為什么選擇Spring Cloud,及它的前景怎樣?:
>Spring Cloud對于互聯網公司來說是一種福音,它是最先進的分布式解決方案之一,發源于美國。使用Spring Cloud一站式解決方案能在從容應對業務發展的同時大大減少開發成本。同時,隨著近幾年微服務架構和Docker容器概念的火爆,也會讓Spring Cloud在未來越來越“云”化的軟件開發風格中立有一席之地,尤其是在目前五花八門的分布式解決方案中提供了標準化的、全站式的技術方案,意義可能會堪比當前Servlet規范的誕生,有效推進服務端軟件系統技術水平的進步。
### 二、容器化打造DevOps智能自動運維
>其實軟件本應是美的,而美的軟件應該是簡單的,正所謂道生一,一生二,二生三,三生萬物。
>以docker、kubenetes為主
##### 問題一:為什么要容器化?
-1.更快速的交付和部署
>對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。
>開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之后,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,并讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
-2.更高效的虛擬化
>Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
-3.更輕松的遷移和擴展
>Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。 這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。
-4.更簡單的管理
>使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化并且高效的管理。
#### 問題二:為什么使用kubernetes?
>Kubernetes作為Docker生態圈中重要一員,是Google多年大規模容器管理技術的開源版本,是產線實踐經驗的最佳表現[G1] 。無論是公有云還是私有云甚至混合云,Kubernetes將作為一個為任何應用,任何環境的容器管理框架無處不在。正因為如此, 目前受到各大巨頭及初創公司的青睞,如Microsoft、VMWare、Red Hat、CoreOS、Mesos等,紛紛加入給Kubernetes貢獻代碼。隨著Kubernetes社區及各大廠商的不斷改進、發展,Kuberentes將成為容器管理領域的領導者。
##### 使用kubernetes帶來的好處
Kubernetes是Google開源的容器集群管理系統,其提供應用部署、維護、 擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用,其主要功能如下:
-1.使用Docker對應用程序包裝(package)、實例化(instantiate)、運行(run)。
-2.以集群的方式運行、管理跨機器的容器。
-3.解決Docker跨機器容器之間的通訊問題。
-4.Kubernetes的智能自我修復機制使得容器集群總是運行在用戶期望的狀態。
當前Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平臺,除此之外,也可以直接運行在物理機上。
### 三.大數據
>當數據量達到一定量級時,存在兩個問題:
>第一:如何存儲及容錯,當某塊硬盤損壞時,如何保證數據能夠恢復;
>第二:如何計算,能在大量的數據中,抓取出有效地數據,并轉化成我們需要的數據,為我們提供決策,或者完善系統。此時,大數據技術便是不二選擇。
>存儲框架包括:Hadoop,HBase,Kudo等。
>計算框架包括:Storm,Spark,Hive,Impala,Kylin,AllUnix等。
####以推薦系統為例:
使用如下技術:
Flume + Hadoop + Kafka + Storm
#####從如下三個方面進行著手:
-1.日志收集
在應用機器中部署flume_agent進程,負責對單擊的日志收集工作, 并將日志以一定的策略發送給中心服務器。
此時,我們可以收集用戶的瀏覽行為,并歸類。
-2.日志存儲
中心服務器將接收到flume_agent發送的日志,并將日志根據路由規則寫到相應的存儲里,如永久存儲的HDFS里,或者Kafka(Kafka里存儲7天/15天的日志)里,并給Storm系統提供實時日志流。
此時,將所有的用戶瀏覽行為存儲到日志中心。
-3.日志分析
Strom通過控制節點(Nimbus節點)將所有任務(Topology)分片,分成一個個Task,并將Task和工作節點(Supervisor節點)相關的信息提交到 zookeeper集群上,Supervisor會去zookeeper集群上認領自己的Task,通知自己的Worker進程進行Task的處理。 Storm可以將結果不做保存,放在內存中,也可以每次都更新數據庫,也可以采用NoSQL存儲。最后,可通過Storm UI來監控。
此時,通過Storm將用戶行為分析存儲入口,作為應用系統的推薦基礎數據。
大數據也是人工智能等技術的基礎,很多應用業務也是基于大數據發展的。
### 四.性能監控告警
>為了達到全鏈路跟蹤、立體化監控的、智能化管理的效果,我們從三個方面,九個維度著手,以多種開源軟件組合并深度開發。
#### 三個方面:
-1.機器:這個會包括機器的CTL,網絡的負載,網絡的內存。
-2.服務: 從服務的角度來說,服務的穩定性,服務的吞吐量,服務的響應時間。
-3.業務:再頂層一些就是業務,包括用戶的訪問量,我們的承擔量及基于大數據下的用戶行為分析,智能推送。
#### 九個維度:
-1.Web端進行監控
-2.客戶端監控
-3.日志監控
-4.JVM監控
-5.數據庫監控
-6.RPC Server
-7.DB client
-8.服務器監控
-9.網絡監控
#### 多種開源軟件:
##### 利器1:日志收集平臺:ELK
-1.可提高用戶響應速度。通過ELK篩選出數據庫慢查詢日志,開發再對語句進行優化,則可提高數據庫響應時間,進而提高用戶響應時間。
-2.可提高聆客軟件可用率。當有故障時,可用ELK快速查詢所需要的日志,查看故障原因,縮短故障定位時間,進而提高可用率。
-3.可總結聆客網頁的正常狀態百分比。通過ELK篩選nginx狀態碼結果,繪制狀態碼扇形圖,可清晰知道網頁訪問有多少是正常的。
-4.可定位聆客用戶的地圖分布。通過ELK抓取用戶訪問的公網IP,再繪制Tile map地圖,則可在地圖上清楚看來聆客在全國各地的分布,定位客戶來源。
-5.可優化聆客系統。通過開發、運維定期查看ELK上的圖表、周報,可發現隱藏問題(例如某個nginx路徑訪問持續過長、數據庫有暫未影響功能的error等),進行排除,從而減少潛在的隱患,及優化系統。
##### 利器2:性能監控平臺:zabbix
>zabbix是一個基于WEB界面的提供分布式系統監視以及網
絡監視功能的企業級的開源解決方案。
zabbix能監視各種網絡參數,保證服務器系統的安全運營;并提供靈活的通知機制以讓系統管理員快速定位/解決存在的各種問題。
##### 利器3:持續集成平臺:Jenkins
>目前持續集成(CI)已成為當前許多軟件開發團隊在整個軟件開發生命周期內側重于保證代碼質量的常見做法。它是一種實踐,旨在緩和和穩固軟件的構建過程。并且能夠幫助您的開發團隊應對如下挑戰:
-l.軟件構建自動化 :配置完成后,CI系統會依照預先制定的時間表,或者針對某一特定事件,對目標軟件進行構建。
-2.構建可持續的自動化檢查 :CI系統能持續地獲取新增或修改后簽入的源代碼,也就是說,當軟件開發團隊需要周期性的檢查新增或修改后的代碼時,CI系統會不斷確認這些新代碼是否破壞了原有軟件的成功構建。這減少了開發者們在檢查彼此相互依存的代碼中變化情況需要花費的時間和精力。
-3.構建可持續的自動化測試 :構建檢查的擴展部分,構建后執行預先制定的一套測試規則,完成后觸發通知(Email,RSS等等)給相關的當事人。
-4.生成后后續過程的自動化 :當自動化檢查和測試成功完成,軟件構建的周期中可能也需要一些額外的任務,諸如生成文檔、打包軟件、部署構件到一個運行環境或者軟件倉庫。這樣,構件才能更迅速地提供給用戶使用。
##### 利器4:運維自動化平臺:Ansible
ansible是新出現的自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
### 5.代碼管理與規范
>隨著功能的增加,開發人員的增多,代碼越來越難以維護,人員越來越難以協同。管理難度呈幾何式上升,引進成熟可靠的管理工具勢在必行
##### 工具1:代碼管理迭代平臺:GitLab
GitLab 是一個用于倉庫管理系統的開源項目。使用Git作為代碼管理工具,并在此基礎上搭建起來的web服務。
可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能,能夠瀏覽源代碼,管理缺陷和注釋。可以管理團隊對倉庫的訪問,它非常易于瀏覽提交過的版本并提供一個文件歷史庫。團隊成員可以利用內置的簡單聊天程序(Wall)進行交流。它還提供一個代碼片段收集功能可以輕松實現代碼復用。
##### 工具2:服務契約(代碼即文檔:swagger+java???doc)
-1.Swagger 可以生成一個具有互動性的API控制臺,開發者可以用來學習和嘗試API。
-2.Swagger 可以生成客戶端SDK代碼用于各種不同的平臺上的實現。
-3.Swagger 文件可以在許多不同的平臺上從代碼注釋中自動生成。
##### 工具3:代碼質量平臺:SonaQube
Sonar是一個用于代碼質量管理的開源平臺,用于管理源代碼的質量,可以從七個維度檢測代碼質量
通過插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十幾種編程語言的代碼質量管理與檢測
http://blog.csdn.net/hunterno4/article/details/11687269