Spring-Cloud-Netflix-系統架構

系統架構

概述

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

集中式架構

概述

當網站流量很小時,只需一個應用 將全部功能都部署在一塊兒,以減小部署節點和成本 從頭至尾就一個工程,部署的時候 , 只須要打成一個war包java

特色

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

垂直拆分

概述

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

特色

  1. 系統拆分實現了流量分擔,解決了併發問題
  2. 能夠針對不一樣模塊進行優化
  3. 方便水平擴展,負載均衡,容錯率提升
  4. 系統間相互獨立,會有不少重複開發工做,影響開發效率

系統架構分類

微服務

微服務就是把本來臃腫的一個項目的全部模塊拆分開來並作到互相沒有關聯,甚至能夠不使用同一個數據庫web

微服務的特色:

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

分佈式服務:

概述:spring

當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務
分佈式,就是將偌大的系統劃分爲多個模塊(這一點和微服務很像)部署到不一樣機器上 由於一臺機器可能承受不了這麼大的壓力
各個模塊經過接口進行數據交互,其實 分佈式也是一種微服務。數據庫

特色:瀏覽器

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

微服務和分佈式的區別:

微服務與分佈式都是把模塊拆分開來變爲獨立的單元,提供接口來調用springboot

他們本質的區別在於目標的不一樣:服務器

  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的使用方法

相關文章
相關標籤/搜索