網絡系統架構演變

1.系統架構演變

隨著互聯網的發展,網站應用的規模不斷擴大。需求的激增,帶來的是技術上的壓力。系統架構也因此不斷的演進、升級、迭代。從單一應用,到垂直拆分,到分布式服務,到SOA,以及現在火熱的微服務架構,還有在Google帶領下來勢洶涌的Service Mesh。我們到底是該乘坐微服務的船只駛向遠方,還是偏安一隅得過且過?

其實生活不止眼前的茍且,還有詩和遠方。所以我們今天就回顧歷史,看一看系統架構演變的歷程;把握現在,學習現在最火的技術架構;展望未來,爭取成為一名優秀的Java工程師。

1.1.集中式架構

當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此時,用于簡化增刪改查工作量的數據訪問框架(ORM)是影響項目開發的關鍵。
在這里插入圖片描述

存在的問題:

  • 代碼耦合,開發維護困難
  • 無法針對不同模塊進行針對性優化
  • 無法水平擴展
  • 單點容錯率低,并發能力差

1.2.垂直拆分

當訪問量逐漸增大,單一應用無法滿足需求,此時為了應對更高的并發和業務需求,我們根據業務功能對系統進行拆分:

在這里插入圖片描述

優點:

  • 系統拆分實現了流量分擔,解決了并發問題
  • 可以針對不同模塊進行優化
  • 方便水平擴展,負載均衡,容錯率提高

缺點:

  • 系統間相互獨立,會有很多重復開發工作,影響開發效率

1.3.分布式服務

當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用于提高業務復用及整合的分布式調用是關鍵。

在這里插入圖片描述

優點:

  • 將基礎服務進行了抽取,系統間相互調用,提高了代碼復用和開發效率

缺點:

  • 系統間耦合度變高,調用關系錯綜復雜,難以維護

1.4.流動計算架構(SOA)

SOA :面向服務的架構

當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基于訪問壓力實時管理集群容量,提高集群利用率。此時,用于提高機器利用率的資源調度和治理中心(SOA)是關鍵

在這里插入圖片描述

以前出現了什么問題?

  • 服務越來越多,需要管理每個服務的地址
  • 調用關系錯綜復雜,難以理清依賴關系
  • 服務過多,服務狀態難以管理,無法根據服務情況動態管理

服務治理要做什么?

  • 服務注冊中心,實現服務自動注冊和發現,無需人為記錄服務地址
  • 服務自動訂閱,服務列表自動推送,服務調用透明化,無需關心依賴關系
  • 動態監控服務狀態監控報告,人為控制服務狀態

缺點:

  • 服務間會有依賴關系,一旦某個環節出錯會影響較大
  • 服務關系復雜,運維、測試部署困難,不符合DevOps思想

1.5.微服務

前面說的SOA,英文翻譯過來是面向服務。微服務,似乎也是服務,都是對系統進行拆分。因此兩者非常容易混淆,但其實卻有一些差別:

微服務的特點:

  • 單一職責:微服務中每一個服務都對應唯一的業務能力,做到單一職責
  • 微:微服務的服務拆分粒度很小,例如一個用戶管理就可以作為一個服務。每個服務雖小,但“五臟俱全”。
  • 面向服務:面向服務是說每個服務都要對外暴露Rest風格服務接口API。并不關心服務的技術實現,做到與平臺和語言無關,也不限定用什么技術實現,只要提供Rest的接口即可。
  • 自治:自治是說服務間互相獨立,互不干擾
    • 團隊獨立:每個服務都是一個獨立的開發團隊,人數不能過多。
    • 技術獨立:因為是面向服務,提供Rest接口,使用什么技術沒有別人干涉
    • 前后端分離:采用前后端分離開發,提供統一Rest接口,后端不用再為PC、移動段開發不同接口
    • 數據庫分離:每個服務都使用自己的數據源
    • 部署獨立,服務間雖然有調用,但要做到服務重啟不影響其它服務。有利于持續集成和持續交付。每個服務都是獨立的組件,可復用,可替換,降低耦合,易維護

在這里插入圖片描述

2.服務調用方式

2.1.RPC和HTTP

無論是微服務還是SOA,都面臨著服務間的遠程調用。那么服務間的遠程調用方式有哪些呢?

常見的遠程調用方式有以下2種:

  • RPC:Remote Produce Call遠程過程調用,類似的還有RMI。自定義數據格式,基于原生TCP通信,速度快,效率高。早期的webservice,現在熱門的dubbo,都是RPC的典型代表(dubbo是阿里開源的java框架,2012年停更過一段時間,2017年又繼續維護)

  • Http:http其實是一種網絡傳輸協議,基于TCP,規定了數據傳輸的格式。現在客戶端瀏覽器與服務端通信基本都是采用Http協議,也可以用來進行遠程服務調用。缺點是消息封裝臃腫,優勢是對服務的提供和調用方沒有任何技術限定,自由靈活,更符合微服務理念。

    現在熱門的Rest風格,就可以通過http協議來實現。

如果你們公司全部采用Java技術棧,那么使用Dubbo作為微服務架構是一個不錯的選擇。

相反,如果公司的技術棧多樣化,而且你更青睞Spring家族,那么SpringCloud搭建微服務是不二之選。在我們的項目中,我們會選擇SpringCloud套件,因此我們會使用Http方式來實現服務間調用。

網絡傳輸7層協議

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-m4FQwzRh-1692011095292)(assets\image-20230805145357819.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cbp23hOX-1692011095292)(assets\image-20230805145501104.png)]

2.2.Http客戶端工具

既然微服務選擇了Http,那么我們就需要考慮自己來實現對請求和響應的處理。不過開源世界已經有很多的http客戶端工具,能夠幫助我們做這些事情,例如:

  • HttpClient
  • OKHttp
  • URLConnection

接下來,不過這些不同的客戶端,API各不相同

2.3.Spring的RestTemplate

Spring提供了一個RestTemplate模板工具類,對基于Http的客戶端進行了封裝,并且實現了對象與json的序列化和反序列化,非常方便。RestTemplate并沒有限定Http的客戶端類型,而是進行了抽象,目前常用的3種都有支持:

  • HttpClient
  • OkHttp
  • JDK原生的URLConnection(默認的)

首先在項目中注冊一個RestTemplate對象,可以在啟動類位置注冊:

@SpringBootApplication
public class HttpDemoApplication {public static void main(String[] args) {SpringApplication.run(HttpDemoApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

在測試類中直接@Autowired注入:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = HttpDemoApplication.class)
public class HttpDemoApplicationTests {@Autowiredprivate RestTemplate restTemplate;@Testpublic void httpGet() {// 調用springboot案例中的rest接口User user = this.restTemplate.getForObject("http://localhost/user/1", User.class);System.out.println(user);}
}
  • 通過RestTemplate的getForObject()方法,傳遞url地址及實體類的字節碼,RestTemplate會自動發起請求,接收響應,并且幫我們對響應結果進行反序列化。

學習完了Http客戶端工具,接下來就可以正式學習微服務了。

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

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

相關文章

【Django】無法從“django.utils.encoding”導入名稱“force_text”

整晚處理 Django 的導入錯誤。 我將把它作為提醒,希望處于相同情況的人數會減少。 原因 某些軟件包版本不支持Django 4 請看下表并決定Django和Python的版本 方案 如果出現難以響應,或者更改環境麻煩,請嘗試以下操作 例如出現以下錯誤 …

云計算的發展前景怎么樣

云計算是當前科技領域中最受關注的領域之一,它的出現改變了傳統的計算模式,使得企業和個人能夠更加便捷地訪問和使用計算資源。隨著云計算技術的不斷發展,它的前景也變得更加光明。 以下是云計算的發展前景: 云計算的市場份額將繼續增長:根據市場研究機構的報告,云計算的市場份…

vfuhyuuy

Sublime Text is an awesome text editor. If you’ve never heard of it, you shouldcheck it out right now. I’ve made this tutorial because there’s no installer for the Linux versions of Sublime Text. While that’s not a real problem, I feel there is a clean…

通過版本號控制強制刷新瀏覽器或清空瀏覽器緩存

背景介紹 在我們做 web 項目時,經常會遇到一個問題就是,需要 通知業務人員(系統用戶)刷新瀏覽器或者清空瀏覽器 cookie 緩存的情況。 而對于用戶而言,很多人一方面不懂如何操作,另一方面由于執行力問題&am…

Android descendantFocusability 屬性

view 焦點問題處理 作用 通過該屬性可以指定viewGroup和其子View到底誰獲取焦點, 直接在viewGroup上使用就行。 屬性值 屬性值含義beforeDescendantsviewgroup會優先其子類控件而獲取到焦點afterDescendantsviewgroup只有當其子類控件不需要獲取焦點時才獲取焦點…

MFC創建和使用OCX控件

文章目錄 MFC建立OCX控件注冊OCX控件與反注冊使用Internet Explorer測試ocx控件OCX控件添加方法OCX控件添加事件Web使用OCX控件MFC使用OCX控件使用OCX控件調用ocx的功能函數對ocx的事件響應OCX控件調試工具tstcon32.exe加載ocx控件使用tstcon32.exe調試ocxMFC建立OCX控件 新建…

【ChatGPT 指令大全】怎么使用ChatGPT來輔助知識學習

目錄 概念解說 簡易教學 深度教學 教學與測驗 解釋一個主題的背后原理 總結 在當今信息時代,互聯網的快速發展為我們獲取知識提供了前所未有的便利。而其中,人工智能技術的應用也為我們的學習和交流帶來了新的可能性。作為一種基于自然語言處理的人…

ORA-01704: string literal too long

這是在做數據遷移的時候,將mysql庫中的數據整理成Oracle腳本,接著在客戶端運行sql腳本插入數據時碰到的問題。明顯就是文本太長了導致的報錯,但是實際上設置的字段是可以支持這么長的文本數據的。 解決方案 直接寫程序導出導入數據&#xff0…

Postgresql 基礎使用語法

1.數據類型 1.數字類型 類型 長度 說明 范圍 與其他db比較 Smallint 2字節 小范圍整數類型 32768到32767 integer 4字節 整數類型 2147483648到2147483647 bigint 8字節 大范圍整數類型 -9233203685477808到9223203685477807 decimal 可變 用戶指定 精度小…

rust學習-tokio::time

示例 use std::time::Duration; use tokio::{task, time::interval};#[tokio::main] async fn main() {let mut interval interval(Duration::from_secs(1));let handle task::spawn(async move {loop {interval.tick().await;println!("tick");}});handle.await.…

【大數據】一些基本概念

一、數據庫、數據倉庫、數據湖 1.什么是數據庫 (Database, DB) 數據庫是指長期儲存在計算機中的有組織的, 可共享的數據集合 就是存儲數據的倉庫 數據庫有三個特點: 永久存儲, 有組織, 可共享 數據庫是一種結構化數據存儲技術,用于存儲和管理有組織的數據。數據庫…

微信小程序云開發快速入門(2/4)

前言 我們對《微信小程序云開發快速入門(1/4)》的知識進行回顧一下。在上章節我們知道了云開發的優勢以及能力,并且我們還完成了碼仔備忘錄的本地版到網絡版的改造,主要學習了云數據庫同時還通過在小程序使用云API直接操作了云數…

SciencePub學術| 智能計量類重點SCIE征稿中

SciencePub學術 刊源推薦: 智能計量類重點SCIE征稿中!信息如下,錄滿為止: 一、期刊概況: 智能計量類重點SCIE 【期刊簡介】IF:2.0-2.5,JCR3區,中科院4區; 【版面類型】正刊&#…

new BigDecimal(double val)注意事項 / JWT解析BigDecimal類型數據

前言: 公司項目中有一個板塊需要解析JWT令牌獲取載荷里面封裝的數據,遇到要解析一個BigDecimal類型的數據 問題發現過程: 正常來說,我們解析一個JWT令牌的步驟如下: public static Claims getDataFromToken(String tok…

極狐GitLab 企業級 CI/CD 規模化落地實踐指南(一)

目錄 template 引用,減少代碼冗余,增強 CI/CD 構建擴展性 問題 1:代碼冗余,低效實踐 問題 2:維護性難,工作量大 ? local ? file ? remote ? template 收益 1:一處修改,多…

TIOBE2023年8月榜單發布,Python超越老將C/C++蟬聯冠軍

TIOBE 編程社區指數是一個衡量編程語言受歡迎程度的指標,評判的依據來自世界范圍內的工程師、課程、供應商及搜索引擎,TIOBE 官網近日公布了 2023 年 8 月的編程語言排行榜。 此次的榜單中,Python依舊穩居第一,占比達到了13.33%。…

jpg圖片太大怎么壓縮?這樣做輕松壓縮圖片

圖片太大會給存儲、分享帶來麻煩,但其實現在壓縮圖片大小也不是什么難事,下面就給大家分享幾個一直用的圖片壓縮方法,包含批量壓縮、在線壓縮、免費壓縮等多種方式,大家按需自取哈~ 方法一:嗨格式壓縮大師 這是一個可…

Kotlin Executors線程池newSingleThreadExecutor單線程

Kotlin Executors線程池newSingleThreadExecutor單線程 import java.util.concurrent.Executorsfun main() {val mExecutorService Executors.newSingleThreadExecutor()for (i in 1..5) {mExecutorService.execute {println("seq-$i tid:${Thread.currentThread().threa…

typeScript 之 基礎

工具: PlayGround 源碼: GitHub TypeScript 變量聲明 typeScript中變量聲明注意: 開頭不能以數字開頭變量名稱可以包含數字和字母除了下劃線_和美元$符號外,不能包含其他任意特殊字符 聲明的結構: let 變量名: 類型…

面試經典150題——羅馬數字轉整數

羅馬數字包含以下七種字符: I, V, X, L,C,D 和 M。 字符 數值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#x…