1. 程式人生 > >探索SpringCloud一(基礎概念)

探索SpringCloud一(基礎概念)

在學習SpringCloud前先了解以下概念問題:

SpringCloud是做什麼的?
從官網上找到答案:

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.
英語不好,簡單翻譯就是:
Spring Cloud為開發者提供了快速構建分散式系統中的一些通用模式(例如配置管理,服務發現,斷路器,智慧路由,微代理,控制匯流排,一次性令牌,全域性鎖,領導選舉,分散式 會話,群集狀態)。 分散式系統的協調導致了樣板模式, 使用Spring Cloud開發人員可以快速地支援實現這些模式的服務和應用程式。 他們將在任何的分散式環境中正常工作,包括開發人員自己的膝上型電腦,裸機資料中心,以及Cloud Foundry等託管平臺。

什麼是微服務?

簡單來說微服務是系統架構上的一種設計風格,它的主旨是把原本獨立的服務拆分成多個小型服務,這些個小型服務在自己獨立的程序下執行,各個服務之間通過HTTP的RESTFUL API進行通訊協作。被拆分的每一個小型服務都圍繞著系統中的某一項或一些耦合度高的業務功能進行構建,並且每個服務都維護著自身的資料儲存、業務開發、自動化測試案例以及獨立的部署機制。由於有了輕量級的通訊協作基礎,所以這些微服務可以使用不同的語言來編寫。
知道了微服務,那個微服務和獨立的單體系統有什麼區別呢?
在以往傳統的系統架構中,我們針對一個複雜的業務需求通常使用物件或者業務型別來構造這個單體專案。在專案中我們通常將業務需求分為三個部分:前端展現,後端處理,資料庫。在業務發展初期,將所有的業務放在一個應用裡進行開發,部署,測試還是很容易實現的。但是,隨著業務發展,需求增加,我們會在這個專案專案上不斷的增加不同的業務模組,提供更多的介面模組。在這種情況下單體應用的問題就逐漸的體現出來了:由於單體應用是一個程序,我們修改一個很小的功能,為了部署上線總會影響其他功能的正常執行。並且單體應用中這些功能模組的使用場景、併發量,消耗的資源都各個不同,對於資源的利用又相互影響,這樣使我們對各個業務的系統容量很難給出較準的評估。所以,單體應用,時間越長,業務發展越大,維護的成本就會越大,並且越來越難以控制。
為了解決單體應用變的龐大臃腫而導致的難以維護等問題,微服務架構誕生並被大家關注。
我們將系統中不同功能模組才分成多個不同的服務,這些服務都能夠獨立的部署執行和擴充套件。由於每個服務都在自己的程序內,在部署上有穩固的邊界,這樣每個服務的更新都不會影響其他的服務正常執行,並且由於是獨立部署的,我們可以更精準的為每個服務評估效能容量,通過配合服務間的協作流程可以更容易的發現系統的瓶頸所在,以及給出較為準確的系統級效能容量。

如何實施微服務

對於單體應用的實施我們都非常瞭解了,也很簡單。但是一旦單體應用被拆分成多個服務,那麼久會引起許多單體應用不會出現的問題:

  • 運維的新挑戰:在微服務架構中,運維人員需要維護的程序數量會大大增加,對這些程序編排和組織不是一件容易的事。運維過程需要更多的自動化。對運維人員所具備的技能要求也大大提高。
  • 介面的一致性:雖然我們拆分了服務,但是業務邏輯上的依賴並不會消除,只是從一個單體應用中的程式碼依賴變成了服務之間的通訊依賴。而當我們對原有介面進行一些修改,那麼互動也需要協調這樣的改變來進行釋出,以保障介面的正確呼叫。所以我們需要更完善介面和版本管理,或者嚴格的遵守開閉原則。
  • 分散式的複雜性:
    由於拆分後各個微服務都是獨立執行在各自的程序中,他們只能通過通訊來進行協同工作,所以分散式環境問題都微服務架構系統設計時需要考慮的重要因素,比如:網路延遲,分散式事物,非同步訊息等一系列問題。

微服務的九大特性

  • 服務元件化
  • 按業務組織團隊
  • 做“產品”的態度
  • 智慧端點和啞管道
  • 列表內容
  • 去中心化自理
  • 去中心化管理資料
  • 基礎設施自動化
  • 容錯設計
  • 演進式設計

為什麼選擇SpringCloud?
微服務很火,那麼一個微服務架構我們需要考慮很多問題,比如服務治理(dubbo/dubbox等)、分散式配置管理(Disconf/Diamond等)、批量任務、服務跟蹤等等,當我們搜尋微服務架構的實施方案是會發現,大部分的是分享的主要以理論和一些粗輪廓框架為主,針對於上面的問題整合了來自不同公司或者組織的很多開源框架,並加入自身業務的優化,所以找不到一個完全相同的架構方案。
前面分析過微服務的優點和缺點,這些缺點通常是這些框架出現的源頭,都是為了解決或者彌補業務拆分後所引起的諸多問題來設計出的方案。當我們準備實施一個微服務架構的時候,為了避免前輩們踩過的坑,我們不得不在這些核心問題上選擇不同的框架,那麼選擇又如此之多,這必然會導致技術選型初期需要花費大量精力來進行調研、分析、實踐。
SpringCloud的出現可以說是對微服務架構的巨大支援和強力的技術後盾。我們不用再像以前一樣針對某個問題來選擇相應的架構來解決。SpringCloud是一個綜合性解決微服務架構的框架,整合了諸多被廣泛實踐和證明過的框架作為實施的基礎部件,又在該體系基礎上建立一些非常優秀的邊緣元件。

SpringCloud簡介

SpringCloud簡單來說就是一個分散式系統開發工具包,基於SpringBoot簡化了配置管理、服務發現、斷路器、路由、微代理、事件匯流排、全域性鎖、決策競選、分散式會話等

Spring Cloud組成

Spring Cloud的子專案,大致可分成兩類:
一類是對現有成熟框架”Spring Boot化”的封裝和抽象,也是數量最多的專案;
二類是開發了一部分分散式系統的基礎設施的實現,如Spring Cloud Stream扮演的就是kafka, ActiveMQ這樣的角色。

SpringCloud子專案及介紹

Spring Cloud Config: 配置管理開發工具包,可以讓你把配置放到遠端伺服器,目前支援本地儲存、Git以 及Subversion。
Spring Cloud Bus: 事件、訊息匯流排,用於在叢集(例如,配置變化事件)中傳播狀態變化,可與Spring Cloud Config聯合實現熱部署。
Spring Cloud Netflix: 針對多種Netflix元件提供的開發工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
Netflix Eureka: 雲端負載均衡,一個基於 REST 的服務,用於定位服務,以實現雲端的負載均衡和中間層伺服器的故障轉移。
Netflix Hystrix: 容錯管理工具,旨在通過控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。
Netflix Zuul: 邊緣服務工具,是提供動態路由,監控,彈性,安全等的邊緣服務。
Netflix Archaius: 配置管理API,包含一系列配置管理API,提供動態型別化屬性、執行緒安全配置操作、輪詢框架、回撥機制等功能。
Spring Cloud for Cloud Foundry: 通過Oauth2協議繫結服務到CloudFoundry,CloudFoundry是VMware推出的開源PaaS雲平臺。
Spring Cloud Sleuth: 日誌收集工具包,封裝了Dapper,Zipkin和HTrace操作。
Spring Cloud Data Flow: 大資料操作工具,通過命令列方式操作資料流。
Spring Cloud Security: 安全工具包,為你的應用程式新增安全控制,主要是指OAuth2。
Spring Cloud Consul: 封裝了Consul操作,consul是一個服務發現與配置工具,與Docker容器可以無縫整合。
Spring Cloud Zookeeper: 操作Zookeeper的工具包,用於使用zookeeper方式的服務註冊和發現。
Spring Cloud Stream: 資料流操作開發包,封裝了與Redis,Rabbit、Kafka等傳送接收訊息。
Spring Cloud CLI: 基於 Spring Boot CLI,可以讓你以命令列方式快速建立雲元件。

SpringCloud開發要素

Codebase: 從一個程式碼庫部署到多個環境
Dependencies: 使用顯式的宣告隔離依賴,即模組單獨執行,並可以顯式管理依賴
Config: 在系統外部儲存配置資訊
Backing Services: 把支援性服務看做是資源,支援性服務包括資料庫、訊息佇列、緩衝伺服器等
Build, release, run: 嚴格的劃分編譯、構建、執行階段,每個階段由工具進行管理
Processes: 應用作為無狀態執行
Port binding: 經由埠繫結匯出服務,優先選擇 HTTP API 作為通用的整合框架
Concurrency: 併發性使用水平擴充套件實現,對於web就是水平擴充套件web應用實現
Disposability: 服務可處置性,任何服務可以隨意終止或啟動
Dev/prod parity: 開發和生產環境保持高度一致,一鍵式部署
Logs: 將日誌看做是事件流來管理,所有參與的服務均使用該方式處理日誌
Admin processes: 管理任務作為一次性的過程執行(使用指令碼管理服務啟動和停止)

相關推薦

探索SpringCloud基礎概念

在學習SpringCloud前先了解以下概念問題: SpringCloud是做什麼的? 從官網上找到答案: Spring Cloud provides tools for developers to quickly build some of the

數據挖掘算法:關聯分析基本概念

latin ron 來看 關聯 row 集中 items 多個 可能性 一.基本概念   我們來看上面的事務庫,如同上表所示的二維數據集就是一個購物籃事務庫。該事物庫記錄的是顧客購買商品的行為。這裏的TID表示一次購買行為的編號,items表示顧客購買了哪些商品。   事

mysql學習 基礎知識

目錄 一、基礎語法 1、資料庫 2、表 3、記錄操作   一、基礎語法 1、資料庫 CREATE DATABASE dbname 選擇要操作的資料庫 USE dbname 顯示資料庫 SHOW DATABASES;

Linux 指令碼攻略基礎知識點

本 Chat 將展示如何操作 Linux 系統,以實際案例介紹如何利用 Shell 命令實現 Linux 的溝通。描述瞭如何執行檔案類查詢常見的任務,解釋了複雜的系統管理工作。例如系統如何監控,優化等。 包括:如何利用 Shell 命令快速解決,任務自動化的執行,建立維護檔案和資料夾,進行壓縮和加

React 入門 基礎概念

簡介 React.js 是一個幫助你構建頁面 UI 的庫。如果你熟悉 MVC 概念的話,那麼 React 的元件就相當於 MVC 裡面的 View。說白點就是幫助我們將介面分成各個獨立的小塊,每一個塊就是元件,這些元件之間可以組合、巢狀,就成了我們的頁面。 一個元件的

線性代數基本概念

一、線性代數基本知識: 1、線性:                 數乘運算與加法運算 呈現 線性。 2、 二、向量: 1、向量的表示方法:        

資料探勘之關聯分析基本概念

許多商業企業運營中的大量資料,通常稱為購物籃事務(market basket transaction)。表中每一行對應一個事務,包含一個唯一標識TID。 利用關聯分析的方法可以發現聯絡如關聯規則或頻繁項集。 關聯分析需要處理的關鍵問題: 1. 從大型事

『深度應用』NLP機器翻譯深度學習實戰課程·零基礎概念

0.前言 深度學習用的有一年多了,最近開始NLP自然處理方面的研發。剛好趁著這個機會寫一系列NLP機器翻譯深度學習實戰課程。 本系列課程將從原理講解與資料處理深入到如何動手實踐與應用部署,將包括以下內容:(更新ing) NLP機器翻譯深度學習實戰課程·零(基礎概念) NLP機器翻譯深

web前端【第一篇】HTML基礎標簽

lpad 百度 合並單元格 div gpo a標簽 適合 code words 一、初始html 1.web服務本質 import socket sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.bin

機器學習-1基礎概念介紹

  首先我們要明白一點,什麼是機器學習? 我現在的理解就是資料,以及資料背後能夠被我們挖掘的含義。我們能利用這些資料去做些什麼    機器學習的主要任務就是分類 為了測試機器學習演算法的效果,通常使用兩套獨立的樣本集:訓練資料和測試資料 當機器學

FastReport使用基礎顯示模板

首先拖出控制元件 PreviewControl,顯示效果 然後拖出控制元件Report,雙擊 控制元件進行模板編輯。模板隨便寫點內容不做動態載入賦值。 窗體載入程式碼 private void Form3_Load(object sender, EventArg

JavaEE複習回顧十基礎加強 類載入器 && 註解 && 動態代理

參考文章: 1,動態代理——從一竅不通到恍然大悟 2,UML類圖與類的關係詳解   一,類載入器 1.1 什麼是類載入器,作用是什麼? 一個自己編寫的 Java 程式碼原始檔,起執行的過程主要分為三個階段。 第一個階段: SOURCE 級別,即原始碼階段,已

Ikaros的資料結構之二叉樹基礎概念部分

二叉樹(Binary Tree) 在瞭解二叉樹之前你需要了解如下內容: 1.樹(Tree):是一種非線性資料結構(非線性資料結構包含樹和圖) ①樹的資料結構: 相關術語 a.根節點(root):樹中沒有前驅的結點 注:一棵樹中只有一個根節點 b.葉子結點(le

python基礎連續更新

1.python歷史 1.1巨集觀上:python2 與 python3 區別 python2 原始碼不標準,混亂,重複程式碼太多, python3 統一 標準,去除重複程式碼。 2.python的環境 2.1 編譯型:一次性將所有程

深入淺出RxJava基礎

Observable.just("Hello, world!") .subscribe(s -> System.out.println(s + " -Dan"));這種方式仍然不能讓人滿意,因為我希望我的Subscribers越輕量越好,因為我有可能會在mainThread中執行subscrib

RabbitMQ訊息佇列入門篇環境配置+Java例項+基礎概念

一、訊息佇列使用場景或者其好處 訊息佇列一般是在專案中,將一些無需即時返回且耗時的操作提取出來,進行了非同步處理,而這種非同步處理的方式大大的節省了伺服器的請求響應時間,從而提高了系統的吞吐量。 在專案啟動之初來預測將來專案會碰到什麼需求,是極其困難的。訊息

Java語言程式設計基礎原書第十版第十章答案

前面幾個題有的沒有匯入包,後面的加進去了 自己也是剛剛學Java不久可能有的寫的很囉嗦 如果有錯的話希望指正!!感謝 還有這個markdown編輯器第一次用,類名沒搞進去,大家湊活看。 //11.1 public class Triangle extends Geom

深度學習筆記基礎——機器學習與深度學習簡介

  機器學習是最基礎的(當下初創公司和研究實驗室的熱點領域之一)。深度學習是非常嶄新和有影響力的前沿領域。 一、定義 1、機器學習    從樣本中學習的智慧程式。是資料驅動的。90年代初提出。強調的是給計算機程式(或者機器)輸入一些資料後,它學習這些資料,而

Elasticsearch入門篇、基本概念

注意:所有es入門篇部落格都是根據es官網6.2版本的文件翻譯而來有一些概念是Elasticsearch的核心。從一開始就理解這些概念將極大地幫助簡化學習過程。近實時(NRT)Elasticsearch是一個接近實時的搜尋平臺。這意味著從索引文件的時間到可搜尋的時間之間存在輕

RxJava+RxAndroid+MVP入坑實踐基礎

前段時間看了MVP架構和RxJava,最近也在重構一些專案(MVC架構),於是寫一個簡單的例子,好了,廢不多說了,入坑開始。 一.RxJava是什麼? GitHub([https://github.com/ReactiveX/RxJava])(https