Java生鮮電商平臺-微服務架構概述

Java生鮮電商平臺-微服務架構概述

?

單體架構存在的問題

在傳統的軟件技術架構系統中,基本上將業務功能集中在單一應用內,或者是單一進程中。盡管現代化的軟件架構理論以及設計原則已推廣多年,但實際技術衍化的速度遲緩并且變革動力不足。 其中的原因存在著復雜性以及多樣性,我想主要的原因是沒有一套整體的解決方案能夠讓工程師在面臨穩定性風險下,毅然決然地實施系統重構。當系統應用規模隨著業務的迅速發展時,系統的重要性愈發突出,開發人員將對系統的改造尤為敏感,從之前的徘徊猶豫,隨之變得更加保守,只能延續過去的技術方案,將功能不斷地累積在原有的系統架構上。這樣的系統好比是豆腐疊羅漢,疊得越高越危險。因此,當面臨巨大的服務壓力時,系統不得不通過擴容的方式,來支撐應對。俗話說,“船小好調頭”,“頭病醫頭,腳病醫腳”。臃腫的系統使得擴容變得毫無針對性,牽一發而動全身。由于服務運行情況存在差異性,具體哪個功能存在性能瓶頸,又因服務并非孤立而存在,使得評估結果存在著主觀臆斷性和不確定性,這種相互影響和作用下,使得擴容變得異常的困難,擴容無法量化,最終導致“水桶效應”。

當應用場景規模增大時,為了提高了開發以及執行的效率,并且使得更優雅或者合適的解決問題成為可能,開發人員將會評估和選擇更先進的技術,推動演進。由于系統應用過分地集中了所有功能,其功能所需依賴服務以及執行庫文件也隨之變得龐大,當需要適配新的技術時,不僅依賴沖突難存在不確定性并且難以應付,進而使代碼重構變得異常困難,增加了適配新技術的難度。

正因為功能集中于一身,讓應用資源占用率變得越來越大,使得持續集成、回歸測試、以及分發部署變得愈發困難。比如,應用部署包磁盤占變多,讓編譯、打包、分發以及啟動時間變長,不確定性因素變得更大。當應用發布上線后,存在功能性缺陷,需要回滾時,這樣的試錯和時間成本變得更加昂貴。

越是功能集中式的系統架構,在開發工程中,越依賴于與執行環境。這種執行環境承載著數據、服務以及配置,如若其中那個環節出現問題,開發進程不得不被迫中斷,而不斷地診斷問題和調試環境,使得快速開發變得要不可及,更不要說在本地開發。由于對環境的過分依賴,使得系統的穩定性變得更不確定性。其一,由于服務相互依賴,而服務又依賴環境,開發人員對單元測試職業習慣以及依賴程度降低,使得測試環節減少,或者說更依賴于集成測試。其二,當測試人員在部署測試環境執行集成測試時,不但部署成功率不斷地降低,而且執行過程時間不斷地增加,壓縮了開發時間,也可能導致項目滯后。不僅提高了系統風險,并且增加了心理負擔。這么說來,無論是快速開發和測試都變得更加艱難。

以上分析還只是停留在那些熟悉業務和技術的成員,當業務快速發展時,其發展速度與開發效率比不斷擴大,招募和發展新人是必不可少的手段。當面對如此巨大和復雜的系統應用時,業務和技術所需的知識變得特別雜糅,讓新人有一種“獨上高樓望,盡天涯路”之感,學習曲線陡峭。在實際的實施過程中,文檔完整性以及指導的系統性皆存在不足。

如何解決單體架構存在的問題

單體應用給我們帶來的現實問題:

  • 擴容困難(Problems in scalability )
  • 部署困難(Problems in deployment)
  • 發布回滾困難(Problems in release rollback)
  • 適配新技術困難( Problems in adopting new technologies )
  • 快速開發困難(Problems in RAD)
  • 測試困難(Problems in testing)
  • 學習困難(Problems in learning)

實際上,在解決單體應用的問題上,數年前,就出現了相應的解決方法,比如SOA的技術路線。

SOA解決一個現實的問題,那就是服務與服務之間解耦,將古老的進程內服務調用,通過網絡協議轉化成服務之間的調用。從早期發明了CORBA、RMI、COM+、XML-PPC等技術,不過問題也隨之出現,由于這些技術綁定在某種技術或者平臺,比如RMI屬于Java 平臺技術,COM+屬于微軟技術體系,XML=PRC沒有統一的協議標準,因此對平臺無關性的通訊需要的協議呼聲強烈,這時一些典型的技術陸續出現,如WebServices以及MessageQueue。以及它們的集大成技術ESB。

其中的代表技術有:WSDL(Web Service Definition Language)、SOAP(Simple Object Access Prototol)等技術。由于這些通訊協議標準相對笨重,雖然目前仍在被廣泛的使用,但逐步被淘汰是大勢所趨。

為什么不選SOA而選微服務

面向服務架構(SOA) VS 微服務

類同

  • 面向服務( Service-Oriented )
  • 松耦合(Loose-Coupling)
  • 自包含(Self-Contained)
  • 平臺無關性(Independent Platform)

差異

  • 原子性(Atomic)
  • 自治性(Autonomous)
  • 開發運維體系(DevOps)
  • 輕量級(Lightweight)
  • 通訊協議(Communication Protocol)

微服務是粒度小的SOA,正由于SOA體系龐大,不可能實現更好的原子性,并且它采用了統一統治的方式,例如ESB那樣的大型解決方案。這樣技術選型,針對單一的服務無法實現自行管理,無形之中增加了團隊運維成本。開發人員不能很好的實施DevOps技術手段。同時,SOA采用了WSDL、SOAP等重量級的通訊協議,增加了開發成本以及性能損耗。在微服務中,大多數服務API通過REST的方式暴露,這樣大大地降低了適配的成本。

微服務是趨勢

讓我們看看google和百度統計的結果吧

圖片.png

圖(1)Google中spring boot的搜索熱度

spring boot和spring cloud是做微服務的最佳搭檔。從圖(1)上,我們能夠看到spring boot 2013年在全球開始流行,一直到2017年2月到了100的熱度。

圖片.png

圖(2)google中spring cloud的搜索熱度

從圖(2)上,我們可以看到spring cloud從2012年開始熱度都是比較平和,在2015年6月之后,也就是微服務開始興起的時候,spring cloud開始迅速增長,在2017年2月達到了100的搜索熱度。(地圖上沒有中國,估計是因為中國被墻掉了的原因)

圖(3)百度搜索中spring boot的搜索熱度

圖(3)是百度地圖統計的結果,我們可以看到spring boot在國內是2015年6月開始流行的,2017年增長尤為突出。

圖(4)百度搜索中spring cloud的搜索熱度

圖(4)我們可以看到,spring cloud是從2016年6月開始在中國流行,往往新技術要在中國流行,都會落后硅谷一年,看看一年前的硅谷,就是現在的中國,所以大家也就能夠判斷到了spring cloud在中國的發展曲線了,也就是2018年2月spring cloud在中國的熱度將達到頂峰。

雖然流行并不代表你需要。但是,既然流行就有他流行的原因,就有他優點。后面我們將回來認識下微服務。

什么是微服務

微服務是用一組小服務的方式來構建一個應用,服務獨立運行在不同的進程中,服務之間通過輕量的通訊機制(如RESTful接口)來交互,并且服務可以通過自動化部署方式獨立部署。正因為微服務架構中,服務之間是相互獨立的,所以不同的服務可以使用不同的語言來開發,或者根據業務的需求使用不同類型的數據庫。

微服務架構的優點與挑戰

優勢

  • 服務簡單,只關注一個業務功能
    傳統的整體風格的架構在構建部署和擴展伸縮方面有很大的局限性,其服務端應用就像是一塊鐵板,笨重且不可拆分,系統中任何程序的改變都需要整個應用重新構建和部署新版本。在進行水平擴展時也只能整個系統擴展,而不能針對某一個功能模塊進行擴展。 而微服務架構將系統以組件化的方式分解為多個服務,服務之間相對獨立且松耦合,單一功能的改變只需要重新構建部署相應的服務即可。

  • 每個微服務可由不同團隊開發
    傳統的開發模式在分工時往往以技術為單位,比如UI團隊、服務端團隊和數據庫團隊,這樣的分工可能會導致任何功能上的改變都需要跨團隊溝通和協調。而微服務則倡導圍繞服務來分工,不同的服務可以采用不同的技術來實現,一個團隊中應該包含開發所需的所有技能,比如用戶體驗、數據庫、項目管理。

  • 微服務是松散耦合的
    微服務架構拋棄了ESB復雜的業務規則編排、消息路由等功能,微服務架構中服務是高內聚的,每個服務都會處理相應的業務,所有的業務邏輯應該盡量在服務內部處理,且服務間的通信盡可能的輕量化,比如使用Restful的方式。

  • 可用不同的編程語言與工具開發
    傳統的軟件開發中經常會使用同一個技術平臺來解決所有的問題,而經驗表明使用合適的工具做合適的事情會讓開發變得事半功倍。微服務架構天生就具有這樣的特性,我們可以使用Node.js來開發一個簡單的報表頁面,使用C++來編寫一個實時聊天組件。

挑戰

  • 運維開銷
    更多的服務也就意味著更多的運維,產品團隊需要保證所有的相關服務都有完善的監控等基礎設施,傳統的架構開發者只需要保證一個應用正常運行,而現在卻需要保證幾十甚至上百道工序高效運轉,這是一個艱巨的任務。

  • DevOps要求
    使用微服務架構后,開發團隊需要保證一個Tomcat集群可用,保證一個數據庫可用,這就意味著團隊需要高品質的DevOps和自動化技術。而現在,這樣的全棧式人才很少。

  • 隱式接口
    服務和服務之間通過接口來“聯系”,當某一個服務更改接口格式時,可能涉及到此接口的所有服務都需要做調整。

  • 重復勞動
    在很多服務中可能都會使用到同一個功能,而這一功能點沒有足夠大到提供一個服務的程度,這個時候可能不同的服務團隊都會單獨開發這一功能,重復的業務邏輯,這違背了良好的軟件工程中的很多原則。

  • 分布式系統的復雜性
    微服務通過REST API或消息來將不同的服務聯系起來,這在之前可能只是一個簡單的遠程過程調用。分布式系統也就意味著開發者需要考慮網絡延遲、容錯、消息序列化、不可靠的網絡、異步、版本控制、負載等,而面對如此多的微服務都需要分布式時,整個產品需要有一整套完整的機制來保證各個服務可以正常運轉。

  • 事務、異步、測試面臨挑戰
    跨進程之間的事務、大量的異步處理、多個微服務之間的整體測試都需要有一整套的解決方案,而現在看起來,這些技術并沒有成熟。

微服務設計原則

  • 隔離
    服務必須設計為單獨相互隔離工作。當你將一個整體單片系統分解成一組服務時,這些服務必須彼此解耦,這樣才能更加連貫和自給自足。每個服務應該能夠處理其自己的故障,而不會影響或破壞整個應用程序或系統。隔離和解耦特性使服務能夠非常快速地從故障狀態中恢復。服務的隔離特性具有以下優點:容易采用連續交付,更好的擴展,有效的監控和可測試性。

  • 自治性
    隔離為自治性鋪平了道路。 服務必須設計為自主自治的。它必須具有凝聚力,能夠獨立地實現其職能。每個服務可以使用良好定義的API(URI)獨立調用。API以某種方式標識服務功能。自主服務還必須處理自己的數據。更流行的術語是多語言持久性,其中每個服務都有自己的持久存儲。 自主還確保彈性。自主服務具有以下優點:有效的服務編排和協調,更好的擴展,通過良好定義的API進行通信,更快速和可控的部署。

  • 單一責任
    服務必須設計為高度凝聚。單一的職責(責任)原則是服務只執行一個重要的功能。 單一責任與“微觀”一詞很好地結合。‘微’意味著小,細粒度,只與其責任范圍內相關。單一責任功能具有以下優點:服務組合無縫,更好的擴展,可重用性,可擴展性和可維護性。

  • 有界上下文
    您的服務應該有多大或小? 答案就在于所謂有界上下文設計原則。這是一個關鍵模式,同時是領域驅動設計(DDD)建模方法。有界的上下文是關于微服務將提供其服務功能的上下文。它根據有關領域模型和識別離散邊界,并相應地設計您的微服務,使其更具凝聚力和自主性。這也意味著跨邊界的通信變得更有效率,在一個有界上下文中的服務不需要依賴于另外一個有限上下文中的太多的事情了。

  • 異步通信
    在設計離散邊界和使用其自己的有界上下文設計服務時,跨邊界的服務通信必須是異步的。異步通信模式自然導致服務之間的松耦合,并允許更好的縮放。使用同步通信,會阻止調用并等待響應。 處于阻塞狀態的服務不能執行另一個任務,直到接收到響應并釋放底層線程為止。它導致網絡擁塞,并影響延遲和吞吐量。異步通信還可以帶來實現良好定義的集成或通信模式的概念,以實現涉及不同服務的邏輯工作流。

  • 位置獨立
    根據設計,微服務是在虛擬化環境或docker容器中部署。隨著云計算的出現,我們可以擁有大量可以利用動態縮放環境的服務實例。服務可以在跨小型或大型集群的多個節點上運行。服務本身可以根據底層計算資源的可用性或效率來重新定位。必須能夠以位置獨立的方式來尋址或定位服務。通常,可以使用不同的查找發現模式來消費使用您的服務。服務的客戶端或消費者不必煩惱部署或配置特定服務的位置。它只是使用某種邏輯或虛擬地址來定位服務。

轉載于:https://www.cnblogs.com/jurendage/p/11332538.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jensen不等式及其證明

? 詹森不等式以丹麥數學家約翰詹森(JohanJensen)命名。它給出積分的凸函數值和凸函數的積分值間的關系。 關于凸函數: if (-f)是凸函數(convex),則f是凹的(concave…

ios自帶NSURLConnection下載文件

//同步下載,同步請求的主要代碼如下 - (IBAction)downLoad:(id)sender { NSString *urlAsString"http://7jpnsh.com1.z0.glb.clouddn.com/TravelDemo.plist";//文件地址 NSURL *url[NSURL URLWithString:urlAsString]; NSURLRequest *request[NSURLRequest requestWi…

國外程序員整理的機器學習資源大全

本列表選編了一些機器學習領域牛B的框架、庫以及軟件(按編程語言排序)。 C 計算機視覺 CCV —基于C語言/提供緩存/核心的機器視覺庫,新穎的機器視覺庫 OpenCV—它提供C, C, Python, Java 以及 MATLAB接口,并支持Windo…

五款幫助創業者迅速熟悉互聯網創業的在線學習工具

相信很多有志青年都想借助互聯網開拓自己的事業,可是經常面臨一個很現實的問題——缺乏一定的專業知識和技能。沒關系,互聯網中的豐富教育資源就可以讓你迅速地跨越這一障礙,熟悉與創業相關的運營、管理、融資等操作技巧。下面介紹的五個在線…

C++ 中復雜的聲明

1、方法也是有類型的,方法的類型由返回類型和形參表決定。比如int F (int)的類型就是去掉方法名,int (int)。 2、對于方法類型,在返回類型和形參表之間,加上一個名稱F,就表示一個特定的方法F。 3、思考,如果…

caffe 下測試 MNIST數據

詳細說明可參考網頁:http://blog.csdn.net/wangchuansnnu/article/details/44341753http://blog.sina.com.cn/s/blog_49ea41a20102w4uu.htmlhttp://www.cnblogs.com/yymn/p/4553671.html caffe 下 mnist 進行實驗: MNIST,一個經典的手寫數字庫…

Java生鮮電商平臺-秒殺系統微服務架構設計與源碼解析實戰

Java生鮮電商平臺-秒殺系統微服務架構設計與源碼解析實戰 Java生鮮電商平臺- 什么是秒殺 通俗一點講就是網絡商家為促銷等目的組織的網上限時搶購活動 比如說京東秒殺,就是一種定時定量秒殺,在規定的時間內,無論商品是否秒殺完畢&#xff0c…

LInux 下安裝 python notebook 及指向路徑,運行計時,炫酷的深藍午夜主題,本地登陸遠程服務器

1. 安裝 pip工具 sudo apt-get install pyton-pip 2. 安裝ipython及其依賴包 sudo apt-get install ipython ipython-notebook 3. 安裝可選的附加工具(需要時間較長) sudo apt-get install python-matplotlib python-scipy python-pandas python-sympy python-nose 4. 測試i…

對TypeScript進行研究

1.npm install -g typescript 在編輯器,將下面的代碼輸入到greeter.ts文件里: function greeter(person) {return "Hello, " person; } let user "Jane User"; document.body.innerHTML greeter(user); 我們使用了.ts擴展名&…

caffe 提取特征并可視化(已測試可執行)及在線可視化

網絡結構在線可視化工具 http://ethereon.github.io/netscope/#/editor 參考主頁: caffe 可視化的資料可在百度云盤下載 鏈接: http://pan.baidu.com/s/1jIRJ6mU 提取密碼:xehi http://cs.stanford.edu/people/karpathy/cnnembed/ http://lijianch…

ncnn:提取所有層特征值

官方代碼托管地址&#xff1a;https://github.com/Tencent/ncnn 在Extractor類中添加以下方法&#xff1a; int Extractor::extract_all_blobs() {for (int blob_index 0; blob_index < blob_mats.size(); blob_index){Mat outMat;extract(blob_index, outMat);// write to…

Caffe + Ubuntu 15.04/16.04 + CUDA 7.5/8.0 在服務器上安裝配置及卸載重新安裝(已測試可執行)

本文參考如下: caffe 安裝所需的所有資源可在百度網盤下載 鏈接: http://pan.baidu.com/s/1jIRJ6mU 提取密碼&#xff1a;xehi 在服務器上為每個子用戶拷貝caffe 使用 Linux探索之旅 | 第一部分第四課&#xff1a;磁盤分區完成Ubuntu安裝 Ubuntu16.04 1080Ti深度學習環境配…

ASP.NET MVC Action向視圖傳值之匿名類型

在使用ASP.NET MVC過程中想必大家都有遇到過一個問題就是我們的Action如何向視圖傳遞匿名類型的值呢&#xff0c;如果不做特殊處理則無法實現。 接下來我們來看一個示例&#xff1a; 在我們的控制中&#xff1a; using System.Collections.Generic; using System.Web.Mvc;names…

2015倫敦深度學習峰會筆記(轉載)

摘要&#xff1a;在倫敦舉行的第三屆深度學習峰會由RE.WORK主辦&#xff0c;匯集了從工業領域到學術領域不同背景的專業人士&#xff0c;本文是該峰會第一天的筆記。包括Koray Kavukcuoglu、Sander Dieleman等知名深度學習專家分享了自己的經驗。上周&#xff0c;我有機會參加在…

[webrtc] rtcp模塊中rtt時間計算

RTT指 round-trip time&#xff0c;即計算AB兩端的往返時延 這里可以分成兩個問題&#xff1a; 如何在A端估算A和B之間的RTT時間? 如何在B端估算A和B之間的RTT時間? 本文參考資料:rfc 3550rfc 3611webrtc issue https://code.google.com/p/webrtc/issues/detail?id1613以及解…

Deep learning Reading List

本文轉自&#xff1a; http://jmozah.github.io/links/ http://www.datakit.cn/blog/2014/12/31/Deep_learning_Reading_List.html 文章來自J Mohamed Zahoor的深度學習閱讀書單。 Following is a growing list of some of the materials i found on the web for Deep Learning…

商戶網站使用第三方支付的大致原理和實現

如果把商戶網站使用第三方支付平臺(比如支付寶)的原理搞清楚&#xff0c;那編程就變得簡單多了。 整個過程大致這樣&#xff1a; 1、商戶與支付寶簽約。2、在商戶網站購買商品&#xff0c;填寫數量&#xff0c;確定購買后跳轉到結賬頁面。結賬頁面可能包括訂單號、定單狀態(已支…

Awesome Deep Vision

本文轉自&#xff1a;https://github.com/kjw0612/awesome-deep-vision http://jiwonkim.org/awesome-deep-vision/ A curated list of deep learning resources for computer vision, inspired by awesome-php and awesome-computer-vision. Maintainers - Jiwon Kim, Heesoo …

GitHub 新出的 Actions 是什么? 用他做自動測試?

體驗分享 本文一個嘗鮮的體驗分享, 并沒有太復雜的技巧, 做了一個最少代碼的例子展示, 讓每個人都可以把action用起來, 如果路過的大牛有高級技巧請留言分享, 我會補充. 下面正文開始. 是什么? 是一個免費的操作系統容器(Linux/Windows/macOS), 我們可以讓他預裝開發環境(node…

caffe框架翻譯-理解(轉載)

本文轉自&#xff1a; http://dirlt.com/caffe.html http://blog.csdn.net/songyu0120/article/details/468170851 caffe http://caffe.berkeleyvision.org/ 1.1 setup 安裝需要下面這些組件。這些組件都可以通過apt-get獲得。 libgoogle-glog-dev # gloglibgflags-dev # gfla…