微服務架構模式(Microservice Architect Pattern)。近兩年在服務的瘋狂增加與雲計算技術的進步,讓微服務架構受到重點關注java
微服務架構是一種架構模式,它提倡將單一應用程序劃分紅一組小的服務,服務之間互相協調、互相配合,爲用戶提供最終價值。每一個服務運行在其獨立的進程中,服務與服務間採用輕量級的通訊機制互相溝通(一般是基於HTTP的RESTful API)。每一個服務都圍繞着具體業務進行構建,而且可以被獨立地部署到生產環境、類生產環境等。另外,應儘可能避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建。nginx
微服務架構優點redis
首先簡單介紹了微服務(Microservices)的內涵及優點,微服務架構的本質,是用一些功能比較明確、業務比較精練的服務去解決更大、更實際的問題。微服務架構將服務拆分,分別採用相對獨立的服務對各方面進行管理,彼此之間使用統一的接口來進行交流,架構變得複雜,優點也很明顯:算法
複雜度可控:在將應用分解的同時,規避了本來複雜度無止境的積累。每個微服務專一於單一功能,並經過定義良好的接口清晰表述服務邊界。因爲體積小、複雜度低,每一個微服務可由一個小規模開發團隊徹底掌控,易於保持高可維護性和開發效率。sql
什麼是微服務架構數據庫
微服務架構優點apache
獨立部署:因爲微服務具有獨立的運行進程,因此每一個微服務也能夠獨立部署。當某個微服務發生變動時無需編譯、部署整個應用。由微服務組成的應用至關於具有一系列可並行的發佈流程,使得發佈更加高效,同時下降對生產環境所形成的風險,最終縮短應用交付週期。後端
技術選型靈活:微服務架構下,技術選型是去中心化的。每一個團隊能夠根據自身服務的需求和行業發展的現狀,自由選擇最適合的技術棧。因爲每一個微服務相對簡單,當須要對技術棧進行升級時所面臨的風險較低,甚至徹底重構一個微服務也是可行的。api
容錯:當某一組建發生故障時,在單一進程的傳統架構下,故障頗有可能在進程內擴散,造成應用全局性的不可用。在微服務架構下,故障會被隔離在單個服務中。若設計良好,其餘服務可經過重試、平穩退化等機制實現應用層面的容錯。瀏覽器
擴展:單塊架構應用也能夠實現橫向擴展,就是將整個應用完整的複製到不一樣的節點。當應用的不一樣組件在擴展需求上存在差別時,微服務架構便體現出其靈活性,由於每一個服務能夠根據實際需求獨立進行擴展。
互聯網高併發相關名詞
頁面瀏覽數(page views )
惟一身份瀏覽量(Unique PageViews)
獨立訪問者數量(unique visitors)
重複訪問者數量(repeat visitors)
每一個訪問者的頁面瀏覽數(Page Views per user)
高併發
以前我將高併發的解決方法誤認爲是線程或者是隊列能夠解決,由於高併發的時候是有不少用戶在訪問,致使出現系統數據不正確、丟失數據現象,因此想到 的是用隊列解決,其實隊列解決的方式也能夠處理,好比咱們在競拍商品、轉發評論微博或者是秒殺商品等,同一時間訪問量特別大,隊列在此起到特別的做用,將 全部請求放入隊列,以毫秒計時單位,有序的進行,從而不會出現數據丟失系統數據不正確的狀況。
通過查資料,高併發的解決方法有倆種,一種是使用緩存、另外一種是使用生成靜態頁面;還有就是從最基礎的地方優化咱們寫代碼減小沒必要要的資源浪費:(
1.不要頻繁的new對象,對於在整個應用中只須要存在一個實例的類使用單例模式.對於String的鏈接操做,使用StringBuffer或者StringBuilder.對於utility類型的類經過靜態方法來訪問。
避免使用錯誤的方式,如Exception能夠控制方法推出,可是Exception要保留stacktrace消耗性能,除非必要不要使用 instanceof作條件判斷,儘可能使用比的條件判斷方式.使用JAVA中效率高的類,好比ArrayList比Vector性能好。)
高併發 - 須要解決的問題
一:應用緩存
二:HTTP緩存
三:多級緩存
四:池化
五:異步併發
六:擴容
七:隊列
高併發-應用緩存
堆緩存
使用Java堆內存來存儲緩存對象。使用堆緩存的好處是沒有序列化/反序列化,是最快的緩存。缺點也很明顯,當緩存的數據量很大時,GC(垃圾回收)暫停時間會變長,存儲容量受限於堆空間大小。通常經過軟引用/弱引用來存儲緩存對象,即當堆內存不足時,能夠強制回收這部份內存釋放堆內存空間。通常使用堆緩存存儲較熱的數據。有
Guava Cache: 緩存和ConcurrentMap是很是相像的,可是它們也不徹底同樣。最根本的區別就是,ConcurrentMap會持有全部添加的對象,直到被顯示的移除。而緩存爲了限制其內存的使用,一般都會配置成能夠自動的將對象移除。在某些狀況下即便不自動移除對象也是很是有用的,如LoadingCache它會自動加載緩存對象。
Ehcache 3.x:是一種普遍使用的開源Java分佈式緩存。主要面向通用緩存,Java EE和輕量級容器。它具備內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特色。
MapDB: mapdb是一個內嵌的純java的數據庫,提供了併發的HashMap、TreeMap、Queue,能夠基於堆外或者磁盤來存儲數據
高併發-應用緩存
堆外緩存
即緩存數據存儲在堆外內存,能夠減小GC暫停時間(堆對象轉移到堆外,GC掃描和移動的對象變少),可是,讀取數據時須要序列化/反序列化,所以會比堆緩存要慢不少。有Ehcache 3.x、MapDB實現
磁盤緩存
即緩存數據存儲在磁道上,在JVM重啓時數據還存在的,而堆緩存/堆外緩存數據會丟失,須要從新加載。有Ehcache 3.x、MapDB實現
分佈式緩存
進程內緩存和磁盤緩存,在多JVM實例的狀況下,會存在兩個問題:
一、單機容量問題;
二、數據一致性問題(多臺JVM實例的緩存數據不一致怎麼辦?),這個問題不用糾結,既然數據容許緩存,則表示容許必定時間內的不一致,所以能夠設置緩存數據的過時時間來按期更新數據;
三、緩存不命中時,須要回源到DB/服務請求多變問題:每一個實例在緩存不命中的狀況下都會回源到DB加載數據,所以多實例後DB總體的訪問量變多瞭解決辦法是可使用如一致性哈希分片算法。所以,這些狀況能夠考慮使用分佈式緩存來解決。
可使用ehcache –clustered(配合 Terracotta server) 實現JAVA進程間分佈式緩存。最好的辦法是使用redis實現分佈式緩存。
高併發- HTTP緩存
瀏覽器緩存是指當咱們使用瀏覽器訪問一些網站頁面或者http服務時,根據服務端返回的緩存設置響應頭將響應內容緩存到瀏覽器,下次能夠直接使用緩存內容或者僅須要去服務端驗證內容是否過時便可。這樣的好處能夠減小瀏覽器和服務端之間來回傳輸的數據量,節省帶寬提高性能。
解決辦法:內容不須要動態(計算、渲染等)速度更快,內容越接近於用戶速度越快。像apache traffic server、squid、varnish、nginx等技術均可以來進行內容緩存。還有CDN就是用來加速用戶訪問的:
即用戶首先訪問到全國各地的CDN節點(使用如ATS、Squid實現),若是CDN沒命中,會回源到中央nginx集羣,該集羣若是沒有命中緩存(該集羣的緩存不是必須的,要根據實際命中狀況等決定),最後回源到後端應用集羣。
高併發- 多級緩存(分佈式緩存)
高併發-池化
在應用系統開發過程當中,咱們常常會用到池化技術,如對象池、鏈接池、線程池等,經過池化來減小一些消耗,以提高性能。
對象池經過複用對象從而減小建立對象、垃圾回收 的開銷。可是,池化不能太大,太大會影響GC時的掃描時間。
鏈接池如數據庫鏈接池、Redis鏈接池、Http鏈接池,經過複用TCP鏈接減小建立和釋放鏈接的時間來提高性能。
線程池也是相似的,經過複用線程提高性能。也就是說池化的目的就是經過複用技術提高性能。
高併發-擴容
一、讀寫分離:當數據庫訪問量還不是很大的時候,咱們能夠適當增長服務器,數據庫主從複製的方式將讀寫分離
二、垂直分區:當寫入操做一旦增長的時候,那麼主從數據庫將花更多的時間的放在數據同步上,這個時候服務器也是不堪重負的;那麼就有了數據的垂直分區,數據的垂直分區思路是將寫入操做比較頻繁的數據表,如用戶表_user,或者訂單表_orders,那麼咱們就能夠把這個兩個表分離出來,放在不一樣的服務器,若是這兩個表和其餘表存在聯表查詢,那麼就只能把原來的sql語句給拆分了,先查詢一個表,在查詢另外一個,雖說這個會消耗更過性能,但比起那種大量數據同步,負擔仍是減輕了很多;
三、水平分區:可是每每事情不盡人意,可能採起垂直分區能撐一段時間,因爲網站太火了,訪問量又每日100w,一會兒蹦到了1000w,這個時候能夠採起數據的進行分離,咱們能夠根據user的Id不一樣進行分配,如採起%二、 形式,固然這種形式對之後的擴展有了很大的限制,當我由10個分區增長到20個的時候,全部的數據都得從新分區,那麼將是一個的很龐大的計算量;幾種常見的算法: 哈希算法:就是採用user_id%的方式; 範圍:能夠根據user_id字符值範圍分區,如1-1000爲一區,1001-2000則是另外一個區等; 映射關係:就是將user_id存在的所對應的分區放在數據庫中保存,當用戶操做時先去查詢所在分區,再進行操做.
你們能夠點擊加入羣:650385180【JAVA架構】裏面有Java高級大牛直播講解知識點 走的就是高端路線 (若是你想跳槽換工做 可是技術又不夠 或者工做上遇到了瓶頸 我這裏有一個JAVA的免費直播課程 講的是高端的知識點基礎很差的勿入喲 只要你有1-5年的開發經驗能夠加羣找我要課堂連接 注意:是免費的 沒有開發經驗勿入哦)