Spring-Cloud-Netflix-系統架構

来源:https://www.cnblogs.com/joker-dj/archive/2020/04/08/12657537.html
-Advertisement-
Play Games

"TOC" 系統架構 概述 隨著互聯網的發展,網站應用的規模不斷擴大。需求的激增,帶來的是技術上的壓力。 系統架構也因此也不斷的演進、升級、迭代。 從單一應用,到垂直拆分,到分散式服務,到SOA,以及現在火熱的微服務架構 集中式架構 概述 當網站流量很小時,只需一個應用 將所有功能都部署在一起,以減 ...


目錄

系統架構

概述

隨著互聯網的發展,網站應用的規模不斷擴大。需求的激增,帶來的是技術上的壓力。 系統架構也因此也不斷的演進、升級、迭代。
從單一應用,到垂直拆分,到分散式服務,到SOA,以及現在火熱的微服務架構

集中式架構

概述

當網站流量很小時,只需一個應用 將所有功能都部署在一起,以減少部署節點和成本 從頭到尾就一個工程,部署的時候 , 只需要打成一個war包

特點

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

垂直拆分

概述

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

特點

  1. 系統拆分實現了流量分擔,解決了併發問題
  2. 可以針對不同模塊進行優化
  3. 方便水平擴展,負載均衡,容錯率提高
  4. 系統間相互獨立,會有很多重覆開發工作,影響開發效率

系統架構分類

微服務

微服務就是把原本臃腫的一個項目的所有模塊拆分開來並做到互相沒有關聯,甚至可以不使用同一個資料庫

微服務的特點:

  1. 單一職責微服務中每一個服務都對應唯一的業務能力,做到單一職責
  2. 服務拆分粒度很小例如一個用戶管理就可以作為一個服務
  3. 面向服務面向服務是說每個服務都要對外暴露服務介面API,並不關心服務的技術實現,做到與平臺和語言無關,不限定用什麼技術實現,只要提供Rest的介面即可
  4. 自治自治是說服務間互相獨立,互不幹擾

分散式服務:

概述:

當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務
分散式,就是將偌大的系統劃分為多個模塊(這一點和微服務很像)部署到不同機器上 因為一臺機器可能承受不了這麼大的壓力
各個模塊通過介面進行數據交互,其實 分散式也是一種微服務。

特點:

  1. 將基礎服務進行了抽取,系統間相互調用,提高了代碼復用和開發效率
  2. 系統間耦合度變高,調用關係錯綜複雜,難以維護

微服務和分散式的區別:

微服務與分散式都是把模塊拆分開來變為獨立的單元,提供介面來調用

他們本質的區別在於目標的不同:

  1. 分散式的目標是:一臺機器承受不了的,或者是成本問題 , 不得不使用多台機器來完成服務的部署
  2. 微服務的目標 :只是讓各個模塊拆分開來,不會被互相影響,比如模塊的升級亦或是出現BUG等等...

微服務要面臨的問題:

  1. 服務治理(SOA)
    概述:

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

問題:

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

服務治理要做什麼:

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

  1. 監聽服務有沒有宕機:部署很多服務後 ,如果監聽到服務有沒有宕機
  2. 負載均衡:一個服務吃不消,要部署多個服務,部署的多個服務均衡調用
  3. 熔斷:服務出現了問題,不能讓程式卡在那裡
  4. 限流:限流就是針對超過預期的流量,通過預先設定的限流規則選擇性的對某些請求進行限流“熔斷”
  5. 降級:當伺服器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放伺服器資源以保證核心交易正常運作或高效運作
  6. 網關:統一管理API的一個網路關口、通道,是整個微服務平臺所有請求的唯一入口

springClould是什麼

微服務只是一種項目的架構方式,或者說是一種概念
Spring-Cloud便是對這種技術的實現
對微服務面臨的問題進行統一的封裝處理

遠程調用方式:

RPC:

  1. Remote Produce Call遠程過程調用,類似的還有RMI。自定義數據格式,基於原生TCP通信,速度快,效率高
  2. 早期的webservice,現在熱門的dubbo,都是RPC的典型
  3. 限制了平臺,只能是Java平臺

Http:

  1. http其實是一種網路傳輸協議,基於TCP,規定了數據傳輸的格式
  2. 現在客戶端瀏覽器與服務端通信基本都是採用Http協議。也可以用來進行遠程服務調用。缺點是消息封裝臃腫
  3. 不限制平臺

模擬微服務:

  1. 創建一個普通父工程,刪除src目錄,保留pom文件
    在這裡插入圖片描述
    在這裡插入圖片描述
  2. 在父工程當中添加springboot依賴
    在這裡插入圖片描述
    代碼:
	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.3.RELEASE</version>
    </parent>
  1. 創建子模塊user
    在這裡插入圖片描述
    在這裡插入圖片描述
  2. 添加springboot-web啟動器依賴
    在這裡插入圖片描述
    代碼:
	<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  1. 創建user工程啟動類UserApplication
    在這裡插入圖片描述
    代碼:
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class,args);
    }
}

  1. 創建util包,把ResponseResult工具類複製到該包中
    在這裡插入圖片描述
    代碼:
public class ResponseResult extends HashMap {
    public static String SUCCESS_CODE = "200";
    public static String ERROR_CODE = "500";
    public static String DATA_KEY = "data";
    public static String MSG_KEY = "msg";

    private ResponseResult() {
    }

    public ResponseResult set(String key, Object object) {
        super.put(key, object);
        return this;
    }

    private static ResponseResult newResponseResult() {
        return new ResponseResult();
    }

    public static ResponseResult success() {
        return ResponseResult.newResponseResult()
                .set("code", ResponseResult.SUCCESS_CODE)
                .set(ResponseResult.MSG_KEY, "操作成功");
    }

    public static ResponseResult success(String msg) {

        return ResponseResult.newResponseResult()
                .set("code", ResponseResult.SUCCESS_CODE)
                .set(ResponseResult.MSG_KEY, msg);
    }

    public static ResponseResult success(String msg, Object object) {

        return ResponseResult.newResponseResult()
                .set("code", ResponseResult.SUCCESS_CODE)
                .set(ResponseResult.MSG_KEY, msg)
                .set(ResponseResult.DATA_KEY, object);
    }

    public ResponseResult data(Object obj) {
        return this.set("data", obj);
    }

    public static ResponseResult error() {
        return ResponseResult.newResponseResult()
                .set(ResponseResult.MSG_KEY, "操作失敗")
                .set("code", ResponseResult.ERROR_CODE);
    }

    public static ResponseResult error(String msg) {
        return ResponseResult.newResponseResult()
                .set(ResponseResult.MSG_KEY, msg)
                .set("code", ResponseResult.ERROR_CODE);
    }

    public static ResponseResult error(String msg, Object object) {
        return ResponseResult.newResponseResult()
                .set(ResponseResult.MSG_KEY, msg)
                .set(ResponseResult.DATA_KEY, object)
                .set("code", ResponseResult.ERROR_CODE);
    }

}
  1. 創建子包controller,在controller當中創建UserController
    在這裡插入圖片描述
    代碼:
@RestController
public class UserController {
    @RequestMapping("/getUser.do")
    public ResponseResult getUser() {
        return ResponseResult.success("返回成功","myUser");
    }
}
  1. 在resources目錄下創建application.yml
    在這裡插入圖片描述
  2. 啟動訪問http://localhost:5000/getUser.do
    10.
  3. 創建子模塊goods
    在這裡插入圖片描述
  4. 配置和user一樣,修改server-port埠為:5001
    在這裡插入圖片描述
    在這裡插入圖片描述
  5. 啟動訪問http://localhost:5001/getGoods.do
    在這裡插入圖片描述
  6. user工程調用goods工程當中的介面
    在UserApplication中添加RestTemplate的Bean
    在這裡插入圖片描述
    代碼:
 @Bean
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }

在user工程的UserController當中註入restTemplate
在這裡插入圖片描述
通過restTemplate實現工程之間的介面調用
在這裡插入圖片描述
同時運行兩個工程, 訪問http://localhost:5000/getGoods.do
在這裡插入圖片描述
以上操作就實現了兩個工程之間的調用

使用nginx實現集群搭建

  1. 下載nginx 網址:nginx下載地址
    在這裡插入圖片描述
    下載後解壓:註意解壓目錄不要帶有中文
  2. 創建一個新的goods1工程 和goods一模一樣 只需要改埠號即可,用於搭建集群。
    在這裡插入圖片描述
  3. 修改nginx的配置文件
    在這裡插入圖片描述
    把之前的server的代碼刪掉,替換成這樣
    在這裡插入圖片描述
    代碼:
  upstream mServer {
		server localhost:5001;
		server localhost:5002;
	}
	
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
	    proxy_pass http://mServer;
        }
  1. 配置完成後啟動nginx.exe
    在這裡插入圖片描述
    啟動會一閃而過 屬於正常情況

  2. 把user中調用方的埠號改為80
    在這裡插入圖片描述

  3. 啟動user,goods,goods1 訪問user的地址:http://localhost:5000/getGoods.do
    在這裡插入圖片描述
    在這裡插入圖片描述
    會發現每次刷新訪問,都會返回兩個不同的工程的controller,完成集群的搭建。

存在問題, 如果其中的一個服務停止了, 當訪問的時候 , 會出現有時會很慢的情況
解決方案:用到SpringCloud的Eureka註冊中心來管理我們的服務
在這裡插入圖片描述
下次更新 Spring-Cloud-Netflix-Eureka的使用方法


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 給定一棵二叉搜索樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。 分析:二叉搜索樹就是每個節點X,大於其左子樹的值,小於其右子樹的值,其中序排序是遞增的。使用中序遍歷,每遍歷一個節點,k-1,直到k減到1,即為第K小的節點 /* fun ...
  • 由於項目需求,需要在頁面中畫出一套蜂巢排版格式的列表。在經過網上的一番查閱資料,發現大多六邊形的畫法都是通過div覆蓋由旋轉的菱形遮掩為六邊形。這種六邊形雖然可以滿足一些基本的需求,但我暫時沒有想到如何滿足我想要的邊框動態效果。最後尋覓下發現了一款適合的樣式,在此基礎上做出樣式方面的改動,變為符合我 ...
  • 1. 圖片 <img src='圖片的地址' />:最後的 / 可以不加,HTML5不加 2. 音頻 <audio 屬性=" "> <source src=" 音頻的地址" type="類型" > </audio> 各個瀏覽器所支持音頻的格式: 示例: 3. 視頻 <video width = ' ...
  • 1. head 標記 <title> 標題 </title>:當前網頁標題 <style> CSS代碼 </style>:寫CSS用的 <link href = " css 文件的地址" rel = " stylesheet " />:引入css文件 <script> javascript 代碼 < ...
  • 1. 表單標記 表單作用:為了收集用戶信息的作用,如:登錄、註冊、搜索 文本框 <input type = " text " name = " 名稱 " /> 密碼框 <input type = " password " name = " 名稱 " /> 單選框 <input type = " ra ...
  • 1. 你們系統里為什麼要使用消息隊列? 2. 既然使用了消息隊列,說說他還有什麼使用場景? 3. 消息隊列的優缺點是什麼? ...
  • 所有代碼和筆記均可在 "我的GitHub" 中獲取,不嫌麻煩可以點個 star 支持一下
  • 仿射期限結構模型:理論與實現——實現部分 [toc] 本文介紹如何以面向對象的方式實現 " Affine Term Structure Models: Theory and Implementation " 中的演算法,並適當的使用設計模式使代碼儘可能的優雅。 引言 金融工程領域的模型和方法之間既有強 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...